我有许多较小的数据集,每个数据集包含10个XY坐标。我使用Matlab(R2012a)和k-means来获得质心。在一些集群中(见下图),我可以看到一些极端点,因为我的数据集尽可能小,一个大纲破坏了我的质心的价值。有没有简单的方法来排除这些观点?假设Matlab有一个'排除异常值'功能,但我无法在工具菜单中的任何位置看到它。 谢谢您的帮助! (是的,我是新手: - )
答案 0 :(得分:2)
k-means对数据集中的异常值非常敏感。原因很简单,k-means试图优化平方和。因此,较大的偏差(例如异常值)会产生很大的影响。
如果您有带有异常值的嘈杂数据集,最好使用具有专门噪声处理功能的算法,例如DBSCAN (Density-Based Spatial Clustering of Applications with Noise)。请注意首字母缩略词中的“N”:噪音。 与例如k-means,还有许多其他聚类算法,DBSCAN可以决定不在低密度区域内的群集对象。
答案 1 :(得分: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页面,并查看可能更有帮助的算法,请尝试并实施它并询问该特定方法。