PHP 부분 이상 인자 알고리즘-local Outlier Factor(LOF)알고리즘 의 구체 적 인 해석

이틀 동안 자신의 시스템 을 보완 하 는 과정 에서 이상 을 찾 는 기능 을 실현 해 야 하기 때문에 친구 의 지시 에 따라 이상 점 을 찾 는 기본 알고리즘 인'부분 이상 인자 알고리즘-local Outlier Factor(LOF)알고리즘'을 학습 하고 실현 했다.
우선 이것 이 무엇 인지 관련 설명 을 찾 아 보 세 요.
나 는 이 문장 을 참고 했다.  이상 점/분리 점 검출 알고리즘―LOF
lof 알고리즘 이 무슨 말 을 하 는 지 대체적으로 알 게 되 었 습 니 다.제 이 해 는 아직도 완선 되 지 않 은 부분 이 많 지만 초보 자로 서 여러분 의 비판 과 지적 을 제공 합 니 다.
나의 이해 에 따 르 면 대체적으로 다음 과 같다.
1、 k-distance,점 p 의 k 거 리 는 점 p 에서 k 번 째 로 먼 그 점 의 거리 이 고 k 는 임 의 값 일 수 있 습 니 다.실제 생활 에서 이 럴 수 있다.샤 오 밍 은'샤 오 홍 의 집 은 우리 집에 서 다섯 번 째 로 가깝다.샤 오 밍,샤 오 첸,샤 오 손,샤 오 이 네 집 은 모두 그녀의 집에 서 우리 집에 서 가깝다'고 말 했다.그래서 이곳 에서 샤 오 홍 의 집 은 샤 오 밍 의 집에 서 5 시의 k 거리 이다.
2.k-distance neighborhood of p,k 거리 분야,위의 예 에 따 르 면{조 군,돈 군,손 군,이 군,소 홍}은 p 에서 가장 가 까 운 k 점 을 하나의 배열 에 넣 으 면 k 거리 분야 이다.
3.reach-distance:거리 에 도달 할 수 있 습 니 다.점 o 에서 점 p 까지 의 제 k 는 거리 가 두 가지 상황 으로 나 눌 수 있다.하 나 는 p 가 o 의 제 k 거리 분야 의 그 배열 에서 이 럴 때 거 리 는 제 k 거리 와 같 고 두 번 째 는 p 가 점 o 에서 비교적 멀 며 o 의 제 k 거리 분야 에 있 지 않 으 면 이때 의 가 달 거 리 는 바로 진실 거리 이다.여전히 상술 한 예 를 들 면 샤 오 밍 의 집 은 샤 오 밍 의 집 k 이웃 지역 에 있 기 때문에 가 달 거 리 는 바로 k 거리 이 고 샤 오 홍 의 집 거리 이다.둘째 개 아들 의 집 은 샤 오 밍 의 집 이 멀 고 가 달 거 리 는 진실 거리 이다.
4.local reachability density:국부 적 으로 밀도 에 도달 할 수 있 습 니 다.점 p 의 부분 적 인 도달 밀 도 는 p 제 k 거리 이웃 지역 의 모든 구성원 에서 점 p 까지 의 도달 거리 평균 값 의 역수 로 복잡 하지만 몇 번 을 더 읽 어도 이해 하기 쉬 우 므 로 예 를 들 지 않 습 니 다.
5.local outlier factor:부분 분리 인자.점 p 의 국부 이 군 인 자 는 영역 중의 모든 점 의 국부 가 밀도 에 도달 할 수 있 는 평균 수 는 점 p 의 국부 가 밀도 에 도달 할 수 있 기 때문에 설명 하지 않 는 다.
여기까지 제 가 lof 알고리즘 에 대한 대략적인 이 해 였 습 니 다.구체 적 인 설명 은 위 에서 제 가 참고 한 그 글 을 보고 분명하게 썼 습 니 다.
그 다음 에 저 는 인터넷 에서 이 알고리즘 의 실현 을 찾 았 습 니 다.phop 버 전이 없어 서 유감 입 니 다.그래서 저 는 이 글 을 찾 았 습 니 다밀도 기반 부분 분리 점 검출(lof 알고리즘)(자바 구현)
문제 에서 보 듯 이 자바 가 실현 되 었 기 때문에 나 는 대신 을 바탕 으로 이 를 수정 하여 phop 버 전 으로 바 꾸 었 다.교체 기 에 대한 이해 가 좋 지 않 기 때문에 교체 기 실현 부분 은 일반 함수 로 바 뀌 었 고 다시 보완 할 기회 가 있 습 니 다.
다음 과 같다.

<?php
 
 
	class DataNode {  
	private  $nodeName; //       
    private  $dimensioin; //         
    private  $kDistance; // k-    
    private  $kNeighbor = array();// k-    
    private $distance; //              
    private $reachDensity;//       
    private $reachDis;//       
  
    private $lof;//         
  
    public function __construct() {  
	
				$num = func_num_args();   //      
                $args = func_get_args();   //        
                switch($num){
                        case 0:
                              
                                break;
                        case 2:
                                $this->__call('__construct2', $args);
                                break;
                }
       
    }  
	
	 public function __call($name, $arg) //         
        {
                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;//   K  
  
    // 1.                  
    // 2.           ,   5   ,     k    
    // 3.            
    // 4.               
    // 5.                ,  。  
    public function getOutlierNode($allNodes) {  
        $kdAndKnList =  $this->getKDAndKN($allNodes); 
         $this->calReachDis($kdAndKnList);  
         $this->calReachDensity($kdAndKnList);  
         $this->calLof($kdAndKnList);  
        //      
         $kdAndKnList = $this->rsortArr($kdAndKnList);
  
        return $kdAndKnList;  
    }  
  
    /** 
     *               
     * @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;  
    }  
  
    /** 
     *            
     * @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;  
    }  
      
    /** 
     *           ,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  k-    
                $kDis = $this->getKDis($tempNode->getNodeName(), $kdAndKnList); 
				 
                if ($kDis < $tempNode->getDistance()) {  
                    $tempNode->setReachDis($tempNode->getDistance());  
                } else {  
                    $tempNode->setReachDis($kDis);  
                }  
            endforeach;  
        endforeach;  
    }  
  
    /** 
     *       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;  
  
    }  
	
	
	private	function strcomp($str1,$str2){ 
		if($str1 == $str2){ 
			return TRUE; 
		}else{ 
			return FALSE; 
		} 
	} 
  
    /** 
     *            
     * @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;  
  
    }  
      
    /** 
     *      NodeA    NodeB       (distance),   NodeA   5 NodeB,     NodeA k-  (kNeighbor)  。 
     *     NodeA k  ,     NodeA k-  (kDistance)   。 
     *       : 
     * 1,     NodeA    NodeB       ,    NodeB  distance   。 
     * 2,   NodeB   distance      。 
     * 3,  NodeB   5         ,     NodeA kNeighbor   。 
     * 4,  NodeB   5   ,    NodeA  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,     NodeA    NodeB       ,    NodeB  distance   。  
            for ($j = 0; $j < count($allNodes); $j++) {  
                $nodeB = new DataNode($allNodes[$j]->getNodeName(), $allNodes[$j]->getDimensioin());  
                //  NodeA NodeB       (distance)  
                $tempDis = $this->getDis($nodeA, $nodeB);  
                $nodeB->setDistance($tempDis);
				array_push($tempNodeList,$nodeB);				
                //$tempNodeList.add(nodeB);  
            }  
            //2,   NodeB         (distance)      。
			$tempNodeList = $this->sortArr($tempNodeList);  			
				
					
			$neighArr = array();
            for ($k = 1; $k <= self::$INT_K; $k++) {  
                //3,  NodeB   5         ,     NodeA kNeighbor   。 
				array_push(	$neighArr ,$tempNodeList[$k]);	
					
                if ($k == self::$INT_K - 1) {  
                    //4,  NodeB   5   ,    NodeA  kDistance   。  
                    $nodeA->setkDistance($tempNodeList[$k]->getDistance());
                }  
            }  
			
			$nodeA->setkNeighbor($neighArr);
            array_push($kdAndKnList,$nodeA);  
        }  
		
        return $kdAndKnList;  
    }  
      
    /** 
     *      A    B         。 
     *        : 
     * d=sqrt( ∑(xi1-xi2)^2 )   i=1,2..n 
     * xi1        i   ,xi2        i    
     * n          ,          (x(1),x(2),...x(n)), 
     *   x(i)(i=1,2...n)   ,  x  i   ,   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 );//      
  
        $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();
 
?>
여기 서 PHP 부분 이상 인자 알고리즘-local Outlier Factor(LOF)알고리즘 에 대한 구체 적 인 해석 에 관 한 글 을 소개 합 니 다.더 많은 관련 PHP 부분 이상 인자 알고리즘-local Outlier Factor(LOF)알고리즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!

좋은 웹페이지 즐겨찾기