(1) let be the statistics sliding windows size; |
(2) let be the outlier detection threshold for sensor S and let P be the |
global list to keep all of the ; |
(3) let U and V be the global arrays to keep the last 10 gaussian |
distribution characteristics for each sensor; |
(4) let be the status transform windows size and be the trend |
vector merging threshold for group , all the rational trend vectors |
of are stored in ; |
(5) procedure GFD () |
(6) init P, loading from Appilcation DB; |
(7) init U and V, loading the last 10 distribution characteristics from |
Application DB; |
(8) create C DetectionThread threads, ; |
(9) start SelfLearningThread(); |
(10) do |
(11) get a value set for sensors in a group ; |
(12) find a idle DetectionThread; |
(13) DetectionThread(); |
(14) while not end; |
(15) return; |
(16) procedure DetectionThread() |
(17) if (IsStuck() or IsSpikes()) |
(18) return; |
(19) if (IsOutlier() and not IsRatStatChange()) |
(20) return; |
(21) IsRatStatChange(); |
(22) return; |
(23) procedure IsStuck() |
(24) get for sensor j by ; |
(25) if () |
(26) mark as a Stuck; |
(27) return; |
(28) procedure IsSpikes() |
(29) get and for sensor j by ; |
(30) if ( and ) |
(31) mark as a Spikes; |
(32) return; |
(33) procedure IsOutlier() |
(34) use U and V to caculate ; |
(35) if () mark as an Outlier; |
(36) return; |
(37) procedure IsRatStatChange() |
(38) use the last values of to fit the trend vector ; |
(39) for each rational trend in |
(40) if () |
(41) mark as a rational status change; ; |
(42) mark the max unstable sensor as a sensor falut; |
(43) return; |
(44) procudure SelfLearningThread() |
(45) while (true) do: |
(46) load the user feedback; |
(47) for each miss alart |
(48) if missed Outlier then ; |
(49) if missed irrational status change then ; |
(50) IncClustering(, null); |
(51) for each false alart |
(52) if false Outlier then ; |
(53) if false irrational status change then ; |
(54) IncClustering(); |
(55) sleep(); continues; |
(56) return; |
(57) procedure IncClustering(,) |
(58) if is not null then for each in ; |
(59) if there is then ; |
(60) else add into ; |
(61) for each two , in ; |
(62) if ( |
(63) (, ); remove ; |
(64) return; |