日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

PHP局部異常因子算法-Local Outlier Factor(LOF)算法的具體實(shí)現(xiàn)解析

瀏覽:234日期:2022-09-06 17:51:20

這兩天在完善自己系統(tǒng)的過程中要實(shí)現(xiàn)一個(gè)查找異常的功能,于是在朋友的指點(diǎn)下學(xué)習(xí)并實(shí)現(xiàn)了異常點(diǎn)查找的一個(gè)基本算法“局部異常因子算法-Local Outlier Factor(LOF)算法”。

首先,找相關(guān)說明看看這是個(gè)什么東西吧。

我參考了這一篇文章: 異常點(diǎn)/離群點(diǎn)檢測算法——LOF

大致明白了lof算法是在講什么,我的理解還有很多不完善的地方,不過還是作為一個(gè)初學(xué)者寫出來供大家批評(píng)指正。

根據(jù)我的理解大致描述如下:

1、 k-distance,點(diǎn)p的第k距離就是距離點(diǎn)p第k遠(yuǎn)的那個(gè)點(diǎn)的距離,k可以是任意值。在實(shí)際生活中可能會(huì)這樣:小明說“小紅家是離我家第五近的,小趙、小錢、小孫、小李家都比她家離我家近”所以此處小紅家距離小明家的距離就是小明家k為5時(shí)的第k距離。

2、k-distance neighborhood of p,第k距離領(lǐng)域,按照上面的例子就是{小趙、小錢、小孫、小李、小紅},把離p最近的k個(gè)點(diǎn)放入一個(gè)數(shù)組就是第k距離領(lǐng)域了。

3、reach-distance:可達(dá)距離。點(diǎn)o到點(diǎn)p的第k可達(dá)距離分兩種情況,一種是p在o的第k距離領(lǐng)域那個(gè)數(shù)組中,這時(shí)候可達(dá)距離等于第k距離,第二種就是p離點(diǎn)o比較遠(yuǎn),不在o的第k距離領(lǐng)域中,此時(shí)的可達(dá)距離即為真實(shí)距離。依然使用上述的例子,小趙家在小明家的第k鄰域中,所以可達(dá)距離就是第k距離,就是小紅家的距離,而二狗子家里小明家很遠(yuǎn),可達(dá)距離就是真實(shí)距離了。

4、local reachability density:局部可達(dá)密度。點(diǎn)p的局部可達(dá)密度是指點(diǎn)p第k距離鄰域中所有成員到點(diǎn)p的可達(dá)距離的平均值的倒數(shù),有點(diǎn)復(fù)雜,不過多讀幾遍還是蠻好理解的,就不舉例子了。

5、local outlier factor:局部離群因子。點(diǎn)p的局部離群因子即為領(lǐng)域中所有點(diǎn)的局部可達(dá)密度的平均數(shù)比點(diǎn)p的局部可達(dá)密度,不做解釋。到這里為止就是我對(duì)lof算法的一個(gè)大致理解,具體講解還要看上面我參考的那篇文章,寫的很清楚。

接下來我找了網(wǎng)上的一篇對(duì)此算法的實(shí)現(xiàn),很遺憾沒有php版本,于是我就找到了這篇文章:基于密度的局部離群點(diǎn)檢測(lof算法) (Java 實(shí)現(xiàn))

如題所示,是一篇Java實(shí)現(xiàn),于是我就在大神的基礎(chǔ)上對(duì)其進(jìn)行修改,改成了一個(gè)php的版本。因?yàn)閷?duì)迭代器理解的不是很好,所以迭代器實(shí)現(xiàn)部分改成了一般函數(shù),有機(jī)會(huì)再進(jìn)行完善。

如下:

<?php class DataNode { private $nodeName; // 樣本點(diǎn)名 private $dimensioin; // 樣本點(diǎn)的維度 private $kDistance; // k-距離 private $kNeighbor = array();// k-領(lǐng)域 private $distance; // 到給定點(diǎn)的歐幾里得距離 private $reachDensity;// 可達(dá)密度 private $reachDis;// 可達(dá)距離private $lof;// 局部離群因子public function __construct() { $num = func_num_args(); //獲得參數(shù)個(gè)數(shù)$args = func_get_args(); //獲得參數(shù)列表數(shù)組switch($num){case 0: break;case 2:$this->__call(’__construct2’, $args);break;} } public function __call($name, $arg) //根據(jù)函數(shù)名調(diào)用函數(shù){return call_user_func_array(array($this, $name), $arg);} public function __construct2($nodeName, $dimensioin){$this->nodeName = $nodeName; $this->dimensioin = $dimensioin; } public function getNodeName() { return $this->nodeName; }public function setNodeName($nodeName) { $this->nodeName = $nodeName; }public function getDimensioin() { return $this->dimensioin; }public function setDimensioin($dimensioin) { $this->dimensioin = $dimensioin; }public function getkDistance() { return $this->kDistance; }public function setkDistance($kDistance) { $this->kDistance = $kDistance; }public function getkNeighbor() { return $this->kNeighbor; }public function setkNeighbor($kNeighbor) { $this->kNeighbor = $kNeighbor; }public function getDistance() { return $this->distance; }public function setDistance($distance) { $this->distance = $distance; }public function getReachDensity() { return $this->reachDensity; }public function setReachDensity($reachDensity) { $this->reachDensity = $reachDensity; }public function getReachDis() { return $this->reachDis; }public function setReachDis($reachDis) { $this->reachDis = $reachDis; }public function getLof() { return $this->lof; }public function setLof($lof) { $this->lof = $lof; } } class OutlierNodeDetect { private static $INT_K = 5;//正整數(shù)K// 1.找到給定點(diǎn)與其他點(diǎn)的歐幾里得距離 // 2.對(duì)歐幾里得距離進(jìn)行排序,找到前5位的點(diǎn),并同時(shí)記下k距離 // 3.計(jì)算每個(gè)點(diǎn)的可達(dá)密度 // 4.計(jì)算每個(gè)點(diǎn)的局部離群點(diǎn)因子 // 5.對(duì)每個(gè)點(diǎn)的局部離群點(diǎn)因子進(jìn)行排序,輸出。 public function getOutlierNode($allNodes) { $kdAndKnList = $this->getKDAndKN($allNodes); $this->calReachDis($kdAndKnList); $this->calReachDensity($kdAndKnList); $this->calLof($kdAndKnList); //降序排序 $kdAndKnList = $this->rsortArr($kdAndKnList); return $kdAndKnList; }/** * 計(jì)算每個(gè)點(diǎn)的局部離群點(diǎn)因子 * @param kdAndKnList */ private function calLof($kdAndKnList) { foreach($kdAndKnList as $node): $tempNodes = $node->getkNeighbor(); $sum = 0.0; foreach($tempNodes as $tempNode): $rd = $this->getRD($tempNode->getNodeName(), $kdAndKnList); $sum = $rd / $node->getReachDensity() + $sum; endforeach; $sum = $sum / (double) self::$INT_K; $node->setLof($sum); endforeach; }/** * 計(jì)算每個(gè)點(diǎn)的可達(dá)距離 * @param kdAndKnList */ private function calReachDensity($kdAndKnList) { foreach($kdAndKnList as $node): $tempNodes = $node->getkNeighbor(); $sum = 0.0; $rd = 0.0; foreach($tempNodes as $tempNode): $sum = $tempNode->getReachDis() + $sum; endforeach; $rd = (double) self::$INT_K / $sum; $node->setReachDensity($rd); endforeach; } /** * 計(jì)算每個(gè)點(diǎn)的可達(dá)密度,reachdis(p,o)=max{ k-distance(o),d(p,o)} * @param kdAndKnList */ private function calReachDis($kdAndKnList) { //for (DataNode node : kdAndKnList) { foreach($kdAndKnList as $node): $tempNodes = $node->getkNeighbor(); //for (DataNode tempNode : tempNodes) { foreach($tempNodes as $tempNode): //獲取tempNode點(diǎn)的k-距離 $kDis = $this->getKDis($tempNode->getNodeName(), $kdAndKnList); if ($kDis < $tempNode->getDistance()) { $tempNode->setReachDis($tempNode->getDistance()); } else { $tempNode->setReachDis($kDis); } endforeach; endforeach; }/** * 獲取某個(gè)點(diǎn)的k-距離(kDistance) * @param nodeName * @param nodeList * @return */ private function getKDis($nodeName,$nodeList) { $kDis = 0; //for (DataNode node : nodeList) { foreach($nodeList as $node): if ($this->strcomp(trim($nodeName),trim($node->getNodeName()))) { $kDis =$node->getkDistance(); break; } endforeach; return $kDis;} privatefunction strcomp($str1,$str2){ if($str1 == $str2){ return TRUE; }else{ return FALSE; } } /** * 獲取某個(gè)點(diǎn)的可達(dá)距離 * @param nodeName * @param nodeList * @return */ private function getRD($nodeName, $nodeList) { $kDis = 0; //for (DataNode node : nodeList) { foreach($nodeList as $node): //if (nodeName.trim().equals(node.getNodeName().trim())) { if ($this->strcomp(trim($nodeName),trim($node->getNodeName()))) { $kDis = $node->getReachDensity(); break; } endforeach; return $kDis;} /** * 計(jì)算給定點(diǎn)NodeA與其他點(diǎn)NodeB的歐幾里得距離(distance),并找到NodeA點(diǎn)的前5位NodeB,然后記錄到NodeA的k-領(lǐng)域(kNeighbor)變量。 * 同時(shí)找到NodeA的k距離,然后記錄到NodeA的k-距離(kDistance)變量中。 * 處理步驟如下: * 1,計(jì)算給定點(diǎn)NodeA與其他點(diǎn)NodeB的歐幾里得距離,并記錄在NodeB點(diǎn)的distance變量中。 * 2,對(duì)所有NodeB點(diǎn)中的distance進(jìn)行升序排序。 * 3,找到NodeB點(diǎn)的前5位的歐幾里得距離點(diǎn),并記錄到到NodeA的kNeighbor變量中。 * 4,找到NodeB點(diǎn)的第5位距離,并記錄到NodeA點(diǎn)的kDistance變量中。 * @param allNodes * @return List<Node> */ private function getKDAndKN($allNodes) { $kdAndKnList = array(); for ($i = 0 ; $i < count($allNodes); $i++) { $tempNodeList = array(); $nodeA = new DataNode($allNodes[$i]->getNodeName(), $allNodes[$i]->getDimensioin()); //1,找到給定點(diǎn)NodeA與其他點(diǎn)NodeB的歐幾里得距離,并記錄在NodeB點(diǎn)的distance變量中。 for ($j = 0; $j < count($allNodes); $j++) { $nodeB = new DataNode($allNodes[$j]->getNodeName(), $allNodes[$j]->getDimensioin()); //計(jì)算NodeA與NodeB的歐幾里得距離(distance) $tempDis = $this->getDis($nodeA, $nodeB); $nodeB->setDistance($tempDis);array_push($tempNodeList,$nodeB);//$tempNodeList.add(nodeB); } //2,對(duì)所有NodeB點(diǎn)中的歐幾里得距離(distance)進(jìn)行升序排序。$tempNodeList = $this->sortArr($tempNodeList); $neighArr = array(); for ($k = 1; $k <= self::$INT_K; $k++) { //3,找到NodeB點(diǎn)的前5位的歐幾里得距離點(diǎn),并記錄到到NodeA的kNeighbor變量中。 array_push($neighArr ,$tempNodeList[$k]);if ($k == self::$INT_K - 1) { //4,找到NodeB點(diǎn)的第5位距離,并記錄到NodeA點(diǎn)的kDistance變量中。 $nodeA->setkDistance($tempNodeList[$k]->getDistance());} } $nodeA->setkNeighbor($neighArr); array_push($kdAndKnList,$nodeA); } return $kdAndKnList; } /** * 計(jì)算給定點(diǎn)A與其他點(diǎn)B之間的歐幾里得距離。 * 歐氏距離的公式: * d=sqrt( ∑(xi1-xi2)^2 ) 這里i=1,2..n * xi1表示第一個(gè)點(diǎn)的第i維坐標(biāo),xi2表示第二個(gè)點(diǎn)的第i維坐標(biāo) * n維歐氏空間是一個(gè)點(diǎn)集,它的每個(gè)點(diǎn)可以表示為(x(1),x(2),...x(n)), * 其中x(i)(i=1,2...n)是實(shí)數(shù),稱為x的第i個(gè)坐標(biāo),兩個(gè)點(diǎn)x和y=(y(1),y(2)...y(n))之間的距離d(x,y)定義為上面的公式. * @param A * @param B * @return */ private function getDis($A, $B) { $dis = 0.0; $dimA = $A->getDimensioin(); $dimB = $B->getDimensioin(); if (count($dimA) == count($dimB)) { for ($i = 0; $i < count($dimA); $i++) { $temp = pow($dimA[$i] - $dimB[$i], 2); $dis = $dis + $temp; } $dis = pow($dis, 0.5); } return $dis; } //Distance比較 private function compareAandB($arr,$A, $B) { if(($arr[$A]->getDistance()-$arr[$B]->getDistance())<0) return -1;else if(($arr[$A]->getDistance()-$arr[$B]->getDistance())>0) return 1;else return 0; }//lof比較 private function compareAandBLof($arr,$A, $B) { if(($arr[$A]->getLof()-$arr[$B]->getLof())<0) return -1;else if(($arr[$A]->getLof()-$arr[$B]->getLof())>0) return 1;else return 0; }private function changeAandB($arr,$A, $B) { $tempChange = $arr[$A]; $arr[$A] = $arr[$B];$arr[$B] = $tempChange;return $arr; } //Distance升序 private function sortArr($arr) { for($i = 0;$i < count($arr);$i ++){for($j = $i + 1;$j < count($arr);$j ++){if($this->compareAandB($arr,$i, $j)>0){$arr=$this->changeAandB($arr,$i, $j);}}}return $arr; } //lof降序 private function rsortArr($arr) { for($i = 0;$i < count($arr);$i ++){for($j = $i + 1;$j < count($arr);$j ++){if($this->compareAandBLof($arr,$i, $j)<0){$arr=$this->changeAandB($arr,$i, $j);}}}return $arr; } public static function main() { $dpoints = array(); $a = array( 2, 3 ); $b = array( 2, 4 ); $c = array( 1, 4 ); $d = array( 1, 3 ); $e = array( 2, 2 ); $f = array( 3, 2 ); $g = array( 8, 7 ); $h = array( 8, 6 ); $i = array( 7, 7 ); $j = array( 7, 6 ); $k = array( 8, 5 ); $l = array( 100, 2 );// 孤立點(diǎn) $m = array( 8, 20 ); $n = array( 8, 19 ); $o = array( 7, 18 ); $p = array( 7, 17 ); $yichen = array( 8, 21 ); array_push($dpoints,new DataNode('a', $a)); array_push($dpoints,new DataNode('b', $b)); array_push($dpoints,new DataNode('c', $c)); array_push($dpoints,new DataNode('d', $d)); array_push($dpoints,new DataNode('e', $e)); array_push($dpoints,new DataNode('f', $f)); array_push($dpoints,new DataNode('g', $g)); array_push($dpoints,new DataNode('h', $h)); array_push($dpoints,new DataNode('i', $i)); array_push($dpoints,new DataNode('j', $j)); array_push($dpoints,new DataNode('k', $k)); array_push($dpoints,new DataNode('l', $l)); array_push($dpoints,new DataNode('m', $m)); array_push($dpoints,new DataNode('n', $n)); array_push($dpoints,new DataNode('o', $o)); array_push($dpoints,new DataNode('p', $p)); array_push($dpoints,new DataNode('yichen', $yichen)); $lof = new OutlierNodeDetect(); $nodeList = $lof->getOutlierNode($dpoints); foreach($nodeList as $node): echo($node->getNodeName() . '--' . round($node->getLof(),4)); echo('<br>');endforeach; } } OutlierNodeDetect::main(); ?>

到此這篇關(guān)于PHP局部異常因子算法-Local Outlier Factor(LOF)算法的具體實(shí)現(xiàn)解析的文章就介紹到這了,更多相關(guān)PHP局部異常因子算法-Local Outlier Factor(LOF)算法內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: PHP
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产v综合v| 国产精品嫩草影院在线看| 欧美成人精品一级| 青青草精品视频| 婷婷亚洲精品| 蜜桃视频第一区免费观看| 伊人久久视频| 福利在线免费视频| 精品中文字幕一区二区三区| 国产精品99精品一区二区三区∴| 国产欧美一区二区三区国产幕精品| 日韩中文字幕| 日韩一区二区三区在线看| 麻豆9191精品国产| 天堂va蜜桃一区二区三区| 爽好久久久欧美精品| 亚洲免费婷婷| 日韩在线电影| 国产亚洲观看| 国产福利资源一区| 首页国产精品| 日韩欧美二区| 图片区亚洲欧美小说区| 亚洲精品一二三区区别| 蜜桃视频一区二区三区在线观看| 偷拍亚洲精品| 国产精品成人**免费视频 | 欧美成a人免费观看久久| 日韩免费久久| 91成人精品| 一区二区三区网站| 国产欧美日韩精品一区二区免费 | 日本亚洲视频在线| 午夜天堂精品久久久久| 美女国产一区二区三区| 日韩国产一区二区| 野花国产精品入口| 欧美午夜三级| 久久久久久久欧美精品| 精品精品国产三级a∨在线| 久久精品一区二区不卡| 激情综合亚洲| 亚洲精品少妇| 国产一区二区三区不卡视频网站| 四虎国产精品免费观看| 欧美日韩色图| 日韩午夜视频在线| 福利一区二区免费视频 | 日韩av一级| 亚洲精品乱码| 精品国产欧美日韩| 亚洲精品国产偷自在线观看| 日本不卡视频在线观看| 福利一区二区三区视频在线观看| 激情综合激情| 久久激情综合网| 久久国产直播| 欧美久久久网站| 成人国产精品一区二区免费麻豆| 亚洲欧洲一区| 国产精品久久久免费| 久久在线免费| 国产精品一区二区精品| 91九色精品国产一区二区| 奇米色欧美一区二区三区| 午夜精品久久久久久久久久蜜桃| 深夜日韩欧美| 欧美影院三区| 国产精品大片| 丝袜亚洲另类欧美| 女生影院久久| 91亚洲无吗| 亚洲成人三区| 欧美91在线| 视频一区二区欧美| 在线看片福利| 青草av.久久免费一区| 久久五月天小说| 国产精久久久| 在线精品亚洲| 久久激情网站| 欧美1区二区| 人人爽香蕉精品| 九九精品调教| 国产精品视频首页| 蜜臀av亚洲一区中文字幕| 亚洲天堂免费电影| 国产乱码精品一区二区三区四区| 影视先锋久久| 国产中文欧美日韩在线| 日韩精品一区二区三区中文字幕| 99国产精品一区二区| 精品亚洲自拍| 69精品国产久热在线观看| 日韩一级网站| 日本久久成人网| 国产高清亚洲| 青草av.久久免费一区| 亚洲免费激情| 日韩av免费| 精品视频99| 欧美日韩亚洲一区二区三区在线 | 成人精品亚洲| 成人亚洲一区| 欧美国产三级| 日韩av午夜在线观看| 日韩在线观看一区二区| 在线国产一区二区| 国产主播一区| 中文字幕系列一区| 国产精品成人一区二区不卡| 国产精品宾馆| 国产调教精品| 日韩激情中文字幕| 亚洲色图网站| 石原莉奈在线亚洲三区| 亚洲激情婷婷| 91精品亚洲| 久久国产直播| 久久久精品久久久久久96| 日韩电影免费在线观看| 日韩大片免费观看| 亚洲天堂av影院| 成人国产精品| 国产videos久久| 高清在线一区| 理论片午夜视频在线观看| 成人三级高清视频在线看| 色综合狠狠操| www.com.cn成人| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲伦乱视频| 欧美亚洲在线日韩| 在线一区免费| 男人的天堂久久精品| 日韩精品第一| 国产精品一国产精品k频道56| 欧美黑人做爰爽爽爽| 成人国产精品久久| 91精品一区二区三区综合在线爱| 午夜欧美精品| 日韩区一区二| 久久精品国产999大香线蕉| 国产传媒在线观看| 蜜臀av免费一区二区三区| 国产手机视频一区二区| 亚洲欧洲日韩精品在线| 国产欧美日韩精品一区二区免费| 国产一区二区三区国产精品| 天堂日韩电影| 视频一区视频二区中文| 国产亚洲一区二区三区啪| 精品欧美视频| 自拍日韩欧美| 午夜天堂精品久久久久| 欧美黄色一区| 一区二区三区视频免费观看| 亚洲一区欧美| 欧美国产免费| 国产一区二区三区成人欧美日韩在线观看| 麻豆久久久久久| 欧美成人精品三级网站| 国产99亚洲| 日韩精品中文字幕一区二区| 日韩国产一区二| 国产精品一页| 久久久久中文| 欧美日韩三区| 中文字幕一区二区av| 婷婷亚洲成人| 亚洲欧洲高清| 黄色成人91| 午夜电影一区| 开心激情综合| 最新日韩av| 老司机精品久久| 天堂精品久久久久| 国产精品美女在线观看直播| 鲁大师精品99久久久| 久久亚洲国产| 美国三级日本三级久久99| 91成人小视频| 精品三级在线| 免费在线看一区| 国产精品久久久一区二区| 欧美久久天堂| 老司机久久99久久精品播放免费| 久久99青青| 婷婷激情一区| 蜜臀国产一区二区三区在线播放| 日韩区一区二| 欧美日韩在线网站| 日精品一区二区三区| 精品国产乱码久久久| 999久久久亚洲| 88久久精品| 日韩免费在线| 亚洲精选久久| 国产精品yjizz视频网| 日韩高清成人在线|