PHP 부분 이상 인자 알고리즘-local Outlier Factor(LOF)알고리즘 의 구체 적 인 해석
16864 단어 PHP부분 이상 인자 계산법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)알고리즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 읽 어 주시 기 바 랍 니 다.앞으로 많은 지원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.