`

基于密度的局部离群点检测

 
阅读更多

算法:基于密度的局部离群点检测(lof算法)

输入:样本集合D,正整数K(用于计算第K距离)

输出:各样本点的局部离群点因子

过程:

  1. 计算每个对象与其他对象的欧几里得距离
  2. 对欧几里得距离进行排序,计算第k距离以及第K领域
  3. 计算每个对象的可达密度
  4. 计算每个对象的局部离群点因子
  5. 对每个点的局部离群点因子进行排序,输出。


Node.java:

import java.util.ArrayList;
import java.util.List;

public class Node {
	private String nodeName; 								// 样本点名
	private double[] dimensioin; 							// 样本点的维度
	private double kDistance; 								// k-距离
	private List<Node> kNeighbor = new ArrayList<Node>();	// k-邻域
	private double distance; 								// 到给定点的欧几里得距离
	private double reachDensity;							// 可达密度
	private double reachDis;								// 可达距离

	private double lof;										// 局部离群因子

	public Node() {

	}

	public Node(String nodeName, double[] dimensioin) {
		this.nodeName = nodeName;
		this.dimensioin = dimensioin;
	}

	public String getNodeName() {
		return nodeName;
	}

	public void setNodeName(String nodeName) {
		this.nodeName = nodeName;
	}

	public double[] getDimensioin() {
		return dimensioin;
	}

	public void setDimensioin(double[] dimensioin) {
		this.dimensioin = dimensioin;
	}

	public double getkDistance() {
		return kDistance;
	}

	public void setkDistance(double kDistance) {
		this.kDistance = kDistance;
	}

	public List<Node> getkNeighbor() {
		return kNeighbor;
	}

	public void setkNeighbor(List<Node> kNeighbor) {
		this.kNeighbor = kNeighbor;
	}

	public double getDistance() {
		return distance;
	}

	public void setDistance(double distance) {
		this.distance = distance;
	}

	public double getReachDensity() {
		return reachDensity;
	}

	public void setReachDensity(double reachDensity) {
		this.reachDensity = reachDensity;
	}

	public double getReachDis() {
		return reachDis;
	}

	public void setReachDis(double reachDis) {
		this.reachDis = reachDis;
	}

	public double getLof() {
		return lof;
	}

	public void setLof(double lof) {
		this.lof = lof;
	}

}


OutlierNodeDetect.java:
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class OutlierNodeDetect {
	private static int MIN_PTS = 5;

	// 1.找到给定点与其他点的欧几里得距离
	// 2.对欧几里得距离进行排序,找到前5位的点,并同时记下k距离
	// 3.计算每个点的可达密度
	// 4.计算每个点的局部离群点因子
	// 5.对每个点的局部离群点因子进行排序,输出。
	public List<Node> getOutlierNode(List<Node> allNodes) {

		List<Node> kdAndKnList = getKDAndKN(allNodes);
		calReachDis(kdAndKnList);
		calReachDensity(kdAndKnList);
		calLof(kdAndKnList);
		Collections.sort(kdAndKnList, new LofComparator());

		return kdAndKnList;
	}

	private void calLof(List<Node> kdAndKnList) {
		for (Node node : kdAndKnList) {
			List<Node> tempNodes = node.getkNeighbor();
			double sum = 0.0;
			for (Node tempNode : tempNodes) {
				double rd = getRD(tempNode.getNodeName(), kdAndKnList);
				sum = rd / node.getReachDensity() + sum;
			}
			sum = sum / (double) MIN_PTS;
			node.setLof(sum);
		}
	}

	private void calReachDensity(List<Node> kdAndKnList) {
		for (Node node : kdAndKnList) {
			List<Node> tempNodes = node.getkNeighbor();
			double sum = 0.0;
			double rd = 0.0;
			for (Node tempNode : tempNodes) {
				sum = tempNode.getReachDis() + sum;
			}
			rd = (double) MIN_PTS / sum;
			node.setReachDensity(rd);
		}
	}

	private void calReachDis(List<Node> kdAndKnList) {
		for (Node node : kdAndKnList) {
			List<Node> tempNodes = node.getkNeighbor();
			for (Node tempNode : tempNodes) {
				double kDis = getKDis(tempNode.getNodeName(), kdAndKnList);
				if (kDis < tempNode.getDistance()) {
					tempNode.setReachDis(tempNode.getDistance());
				} else {
					tempNode.setReachDis(kDis);
				}
			}
		}
	}

	private double getKDis(String nodeName, List<Node> nodeList) {
		double kDis = 0;
		for (Node node : nodeList) {
			if (nodeName.trim().equals(node.getNodeName().trim())) {
				kDis = node.getkDistance();
				break;
			}
		}
		return kDis;

	}

	private double getRD(String nodeName, List<Node> nodeList) {
		double kDis = 0;
		for (Node node : nodeList) {
			if (nodeName.trim().equals(node.getNodeName().trim())) {
				kDis = node.getReachDensity();
				break;
			}
		}
		return kDis;

	}

	private List<Node> getKDAndKN(List<Node> allNodes) {
		List<Node> kdAndKnList = new ArrayList<Node>();
		for (int i = 0; i < allNodes.size(); i++) {
			List<Node> tempNodeList = new ArrayList<Node>();
			Node nodeA = new Node(allNodes.get(i).getNodeName(), allNodes
					.get(i).getDimensioin());
			for (int j = 0; j < allNodes.size(); j++) {
				Node nodeB = new Node(allNodes.get(j).getNodeName(), allNodes
						.get(j).getDimensioin());
				double tempDis = getDis(nodeA, nodeB);
				nodeB.setDistance(tempDis);
				tempNodeList.add(nodeB);
			}

			// 对tempNodeList进行排序
			Collections.sort(tempNodeList, new DistComparator());
			for (int k = 1; k < MIN_PTS; k++) {
				nodeA.getkNeighbor().add(tempNodeList.get(k));
				if (k == MIN_PTS - 1) {
					nodeA.setkDistance(tempNodeList.get(k).getDistance());
				}
			}
			kdAndKnList.add(nodeA);
		}

		return kdAndKnList;
	}

	private double getDis(Node A, Node B) {
		double dis = 0.0;
		double[] dimA = A.getDimensioin();
		double[] dimB = B.getDimensioin();
		if (dimA.length == dimB.length) {
			for (int i = 0; i < dimA.length; i++) {
				double temp = Math.pow(dimA[i] - dimB[i], 2);
				dis = dis + temp;
			}
			dis = Math.pow(dis, 0.5);
		}
		return dis;
	}

	class DistComparator implements Comparator<Node> {
		public int compare(Node A, Node B) {
			return A.getDistance() - B.getDistance() < 0 ? -1 : 1;
		}
	}

	class LofComparator implements Comparator<Node> {
		public int compare(Node A, Node B) {
			return A.getLof() - B.getLof() < 0 ? -1 : 1;
		}
	}

	public static void main(String[] args) {
		ArrayList<Node> dpoints = new ArrayList<Node>();

		double[] a = { 2, 3 };
		double[] b = { 2, 4 };
		double[] c = { 1, 4 };
		double[] d = { 1, 3 };
		double[] e = { 2, 2 };
		double[] f = { 3, 2 };

		double[] g = { 8, 7 };
		double[] h = { 8, 6 };
		double[] i = { 7, 7 };
		double[] j = { 7, 6 };
		double[] k = { 8, 5 };

		double[] l = { 100, 2 };// 孤立点

		double[] m = { 8, 20 };
		double[] n = { 8, 19 };
		double[] o = { 7, 18 };
		double[] p = { 7, 17 };
		double[] q = { 8, 21 };

		dpoints.add(new Node("a", a));
		dpoints.add(new Node("b", b));
		dpoints.add(new Node("c", c));
		dpoints.add(new Node("d", d));
		dpoints.add(new Node("e", e));
		dpoints.add(new Node("f", f));

		dpoints.add(new Node("g", g));
		dpoints.add(new Node("h", h));
		dpoints.add(new Node("i", i));
		dpoints.add(new Node("j", j));
		dpoints.add(new Node("k", k));

		dpoints.add(new Node("l", l));

		dpoints.add(new Node("m", m));
		dpoints.add(new Node("n", n));
		dpoints.add(new Node("o", o));
		dpoints.add(new Node("p", p));
		dpoints.add(new Node("q", q));

		OutlierNodeDetect lof = new OutlierNodeDetect();

		List<Node> nodeList = lof.getOutlierNode(dpoints);

		for (Node node : nodeList) {
			System.out.println(node.getNodeName() + "  " + node.getLof());
		}

	}
}
 
分享到:
评论

相关推荐

    一种基于密度的离群点检测方法

    基于密度的局部离群点检测算法(LOF)的时间复杂度较高且不适用于大规模数据集和高维数据集的离群点检测。

    NLOF_一种新的基于密度的局部离群点检测算法_王敬华1

    摘要基于密度的局部离群点检测算法(LOF)的时间复杂度较高且不适用于大规模数据集和高维数据集的离群点检测。通过对 LOF算法的分析,提出了一种新的局部离群点检测

    论文研究-基于密度的局部离群数据挖掘方法的改进.pdf

    该算法在寻找数据点的近邻区域时采用了基于影响空间的局部离群点检测(INFLO)中影响空间的概念,然后在计算数据点的离群因子时,根据基于链接的离群点检测(COF)中链式距离的思想,提出了基于相似k距离邻居序列...

    一种基于密度的局部离群点检测算法DLOF_胡彩平1

    南京航空航天大学基本科研业务费专项科研基金项目(NS2010094)一种基于密度的局部离群点检测算法 DLOF胡彩平秦小麟(南京航空航天大学信息科学与技术学院南

    论文研究-基于方形对称邻域的局部离群点检测方法.pdf

    针对NDOD(outlier detection algorithm based on neighborhood and density)算法在判断具有不同密度分布的聚类间过渡区域对象时存在的不足,以及为了降低算法时间复杂度,提出一种基于方形对称邻域的局部离群点检测...

    论文研究-基于K-近邻树的离群检测算法.pdf

    为适应数据集分布形状多样性以及克服数据集密度问题,针对已有算法对离群簇检测效果欠佳的现状,提出了一种基于K-近邻树的离群检测算法KNMOD(outlier detection based on K-nearest neighborhood MST)。...

    基于统计的自适应窗数据流离群点检测算法 (2013年)

    首先利用局部数据欧式空间中距离的数学期望和方差找到一个合适的k阶邻域,然后对这个k阶邻域内数据点的欧式距离和进行基于统计的离群点检测,实现自动适应数据流中稀疏段和稠密段的密度变化.理论和实验结果均表明,该...

    论文研究-基于动态多向局部离群因子的在线故障检测.pdf

    首先将间歇过程数据展开成二维数据,利用滑动窗口技术分别在时间片内运用局部离群因子算法计算LOF统计量,并利用核密度估计(KDE)确定控制限。对于新来数据标准化处理后分别在相应窗口内投影,确定新数据的LOF统计...

    基于方形对称邻域的局部离群点检测方法 (2012年)

    针对NDOD(outlierdetectionalgorithmbasedonneighborhoodanddensity)算法在判断具有不同密度分布的聚类间过渡区域对象时存在的不足,以及为了降低算法时间复杂度,提出一种基于方形对称邻域的局部离群点检测方法。...

    基于小波密度估计的数据流离群点检测 (2013年)

    为能及时发现数据流上的局部离群点,分析数据流已有的离群点挖掘算法,提出基于小波密度估计的离群点检测算法。利用小波密度估计多尺度和多粒度的特点,通过小波概率阈值判断数据流中当前滑动窗口内的数据点是否为...

    LOF.rar_LOF_lof matlab_officemmj_outlier detection_基于密度的lof

    基于密度的局部离群点检测,使用于当全部样本点的密度不一致的情况

    NLOF:基于网格过滤的两阶段离群点检测算法

    然后为了进一步优化基于密度的算法,基于&lt;i&gt;k邻域,根据邻域中数据点的个数与邻域所组成圆的面积之比,作为数据点密度计算的依据,进行离群点检测以获得更准确的离群点集。在多种公开数据集上进行实验,实验表明,该...

    大数据预处理技术.pdf

    基于密度的局部离群点检测:通过基于局部离群点检测就能在样本空间数据分布不均匀的情况下也可以准确发现。 基于距离的离群点检测:如果样本空间D⾄少有N个样本点与对象O的距离⼤于d,那么对象O是以⾄少N个样本点和...

    分区检测框架的局部密度轨迹离群值检测

    本文结合分割检测框架[1],在传统... 最后,通过大量实验,我们在分割检测框架中展示了我们的算法,将t分区的邻域与网格搜索结合使用,并基于密度的局部轨迹离群值算法,从而提高了结果的效率和准确性。大大改善了。

    基于质心的离群值检测方法

    由于其重要的应用,为此开发了许多技术,包括基于分布的离群值检测方法,基于距离的离群值检测方法,基于密度的离群值检测方法和基于聚类的离群值检测方法等。完全令人满意。 基于k均值聚类算法的质心概念,本文...

    论文研究-KNN在化工生产过程故障定位中的应用.pdf

    首先利用局部离群因子(LOF)算法剔除原始数据中的离群点,将剩余数据作为训练数据建立KNN模型;然后计算待检测数据的检测指标,将其与控制限对比进行故障检测。最后,对检测出的故障计算训练数据基于KNN的变量贡献...

    通过离群指标增强离群值检测

    离群检测是数据挖掘中的一项重要任务,在天文观测,文本检测,欺诈检测等众多应用中具有很高的实用价值。 当前,有许多流行的异常检测算法可用,包括基于分布的,基于距离的,基于密度的和基于聚类的方法等。 然而,...

    LOF算法MATLAB实现

    LOF离群因子算法,是基于密度的用于噪声和异常数据检测的常用算法,它通过为每个数据计算异常因子,来判断该数据是否为噪声或干扰数据。

    基于加权核独立成分分析的故障检测方法

    根据核密度估计衡量各独立成分分量对系统故障的贡献度, 对各独立成分分量赋予不同权重, 突出包含有用信息的独立成分分量, 引入局部离群因子在特征空间构造统计量进行故障检测. 基于数值仿真和Tennessee Eastman ...

    PyNomaly:使用LoOP进行异常检测

    皮诺玛利 PyNomaly是LoOP(局部异常值)的Python 3实现。... 通过将样本的局部密度与其邻域的局部密度进行比较,可以识别出与邻域相比密度较低的区域中的样本,从而根据其局部离群概率来识别离群的样本。

Global site tag (gtag.js) - Google Analytics