`

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

 
阅读更多

算法:基于密度的局部离群点检测(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());
		}

	}
}
 
分享到:
评论

相关推荐

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

    《基于密度的局部离群点检测算法DLOF》 在数据挖掘领域,异常检测是至关重要的技术之一,它旨在找出与数据集大部分对象显著不同的异常或离群点。离群点分为全局离群点和局部离群点,而在许多实际应用中,局部离群点...

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

    本文提出了一种新的基于密度的局部离群点检测算法NLGF,该算法可以提高离群点检测的精度,降低时间复杂度,实现有效的局部离群点检测。该算法的主要思想是在数据对象邻域查询过程中,尽可能地利用已知信息优化邻近...

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

    《NLOF:一种新的基于密度的局部离群点检测算法》 离群点检测是数据挖掘中的一个重要领域,其目标是找出与正常数据模式显著不同的数据对象。传统的基于密度的局部离群点检测算法(Local Outlier Factor,LOF)在...

    一种基于密度聚类的分布式离群点检测算法.pdf

    在本文中,作者刘亚梅和闫仁武结合传统局部离群点检测算法LOF(Local Outlier Factor)与Hadoop分布式计算框架,提出了基于密度聚类的分布式离群点检测算法。该算法通过引入MapReduce编程模型实现了并行化策略,显著...

    ERDOF:基于相对熵权密度离群因子的离群点检测算法.docx

    4. **基于密度的方法**:这类方法认为离群点与其周围环境的密度差异较大,通过计算局部密度来进行离群点识别。常见的算法如局部离群因子(LOF),它通过估计数据对象的局部可达密度来衡量离群程度。近年来,基于核的...

    demo.zip_DEMO_outlier_outlier detection_基于距离的离群点检测_数据挖掘

    在数据挖掘中,离群点检测方法可以分为多种类型,包括基于统计的方法、基于密度的方法、基于聚类的方法以及基于距离的方法。这里重点讨论的是基于距离的离群点检测。这种方法主要依赖于数据点与其最近邻居之间的...

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

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

    空间离群点检测算法对比与分析

    离群点检测算法主要分为基于邻域的方法和基于统计的方法,其中常用的算法包括基于局部离群因子(SLOF)和基于局部离群因子(SLOM)的算法。 局部离群因子(SLOF)算法和局部离群因子(SLOM)算法都是用于检测空间数据中的...

    基于离群点检测的链路流量细粒度监测.docx

    局部离群点检测的关键在于识别那些在局部区域中密度显著低于周围对象的数据点。在图1所示的例子中,C1和C2是两个密度不同的簇,LOF算法可能会错误地标记位于簇边缘的正常对象p为离群点,因为它仅考虑k-近邻而不充分...

    基于网格划分加权的分布式离群点检测算法.docx

    基于密度的方法通过引入对象邻域的概念,能够更有效地检测局部密度异常的对象,如DBSCAN和LOF(局部离群因子)等。 LOF算法是基于密度的离群点检测方法,它通过比较对象与其邻域对象的局部可达密度,来评估对象的...

    第5章+挖掘建模之离群点检测.pdf

    根据不同的特性,离群点可以分为几种类型:全局离群点和局部离群点,前者在整个数据集中都显得异常,后者仅在特定局部区域中表现出异常;数值型离群点和分类型离群点,前者基于数值属性,后者基于非数值属性;一维...

    计算机研究 -基于近似密度构造的聚类分析与离群点检测算法研究.pdf

    ### 计算机研究 - 基于近似密度构造的聚类分析与离群点检测算法研究 #### 一、研究背景与意义 在信息技术迅速发展的半个世纪中,计算机科学与技术的进步不仅极大地改变了人类的生活方式,还为科学研究和社会发展...

    LOF_LOF_lof密度_离群检测_matlab_

    总结来说,LOF算法是一种基于密度的离群检测方法,通过比较数据点的局部密度来识别异常点,而MATLAB中的"LOF.m"函数则提供了便捷的工具来实现这一过程。在实际应用中,根据数据特性调整算法参数和阈值,可以更准确地...

    电子功用-基于离群点检测的超高压变电站设备温度监测告警方法

    DBSCAN则基于密度连接寻找离群点,能够发现任意形状的异常区域。 一旦检测到离群点,系统会立即触发告警机制,通知运维人员进行检查和维修。这不仅可以提前预警潜在的设备故障,减少因设备过热引发的停电事故,还能...

    基于核密度估计的离群数据挖掘.pdf

    通过综合考虑多尺度邻域的信息,算法能够对样本的异常因子进行局部和全局的细化,实现对复杂数据集的离群检测。 离群数据挖掘的应用领域广泛,它在网络安全领域中用于网络入侵检测,可以识别异常的访问模式或攻击...

    基于网格划分加权的分布式离群点检测算法.pdf

    关键词“基于密度的离群点检测”指的是一种通过分析数据点的局部密度特性来识别离群点的方法。在本研究中,这种方法被融入到分布式算法的框架下,并通过网格划分和权重分配机制进行了优化。 关键词“分布式算法”...

Global site tag (gtag.js) - Google Analytics