7

我有一些较小的数据集,每个包含 10 个 XY 坐标。我正在使用 Matlab (R2012a) 和 k-means 来获得质心。在一些集群中(见下图),我可以看到一些极值点,因为我的数据集和它们一样小,一个大纲破坏了我的质心的值。有没有一种简单的方法可以排除这些点?假设Matlab有一个“排除异常值”功能,但我在工具菜单的任何地方都看不到它。谢谢你的帮助!(是的,我对此很陌生:-)

在此处输入图像描述

4

2 回答 2

3

k-means 可能对数据集中的异常值非常敏感。原因很简单,k-means 试图优化平方和。因此,较大的偏差(例如异常值)会获得很大的权重。

如果您有一个带有异常值的嘈杂数据集,则最好使用具有专门噪声处理的算法,例如DBSCAN(具有噪声的应用程序的基于密度的空间聚类)。请注意首字母缩略词中的“N”:噪声。与例如 k-means 以及许多其他聚类算法相比,DBSCAN 可以决定不对低密度区域中的对象进行聚类。

于 2013-01-01T12:02:10.907 回答
0

您正在寻找诸如“异常值删除”之类的内容,并且正如其他人在上面所链接的那样,“没有关于构成异常值的严格数学定义” - http://en.wikipedia.org/wiki/Outlier#Identifying_outliers

当您进行无监督聚类时,异常值检测更加困难,因为您都在尝试了解聚类是什么,以及哪些数据点对应于“无”聚类。

一个简单的定义是将所有与其他数据点“远”的数据点视为异常值。例如,您可能会考虑删除与任何其他点的最大最小距离的点:

x = randn(100,2); 
x(101,:) = [10 10];  %a clear outlier
nSamples = size(x,1);

pointToPointDistVec = pdist(x);
pointToPointDist = squareform(pointToPointDistVec);
pointToPointDist = pointToPointDist + diag(inf(nSamples,1)); %remove self-distances; set to inf

smallestDist = min(pointToPointDist,[],2);
[maxSmallestDist,outlierInd] = max(smallestDist);

您可以将上述迭代几次以迭代删除点。请注意,这不会删除恰好有至少一个附近邻居的异常值。如果您阅读 WIKI 页面,并看到可能更有帮助的算法,请尝试实现它并询问该特定方法。

于 2012-12-21T16:18:25.747 回答