【问题标题】:Removing outliers from a k-mean cluster从 k-mean 聚类中去除异常值
【发布时间】:2012-12-08 23:47:25
【问题描述】:

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

【问题讨论】:

  • 我认为您要查找的词是 Outlier (en.wikipedia.org/wiki/Outlier),而不是 Outliner。也许这会帮助您更轻松地找到解决方案。
  • 提及您正在使用的软件并相应地标记也是一个好主意。
  • 对不起,我不小心写了大纲;(我做了一些搜索,但我是matlab的初学者,到目前为止我遇到的代码很重。看了ORC和ODIN,但根据matlab帮助功能,工具栏中应该有一个叫做“排除异常值”的东西,但我找不到,我使用的是R2012a。

标签: matlab data-mining cluster-analysis k-means outliers


【解决方案1】:

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

如果您有一个带有异常值的嘈杂数据集,您最好使用具有专门处理噪声的算法,例如DBSCAN (Density-Based Spatial Clustering of Applications with Noise)。请注意首字母缩略词中的“N”:噪声。 与例如相反k-means 以及许多其他聚类算法,DBSCAN 可以决定对低密度区域中的对象进行聚类。

【讨论】:

    【解决方案2】:

    您正在寻找“异常值删除”之类的内容,正如其他人在上面提到的那样,“对于什么构成异常值没有严格的数学定义” - 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-07-07
      • 2017-06-30
      • 1970-01-01
      • 2017-09-12
      • 2013-03-23
      • 2015-07-29
      • 2017-07-17
      • 2018-08-12
      • 1970-01-01
      相关资源
      最近更新 更多