如何使用 MeanShift 聚类技术去除噪声?
Posted
技术标签:
【中文标题】如何使用 MeanShift 聚类技术去除噪声?【英文标题】:How to remove noise using MeanShift Clustering Technique? 【发布时间】:2015-09-13 14:50:07 【问题描述】:我正在使用 meanshift 聚类从我的输入数据中去除不需要的噪音。 Data can be found here。这是我到目前为止所尝试的..
import numpy as np
from sklearn.cluster import MeanShift
data = np.loadtxt('model.txt', unpack = True)
## data size is [3X500]
ms = MeanShift()
ms.fit(data)
在尝试了一些不同的带宽值后,我只得到了 1 个集群。但图片中的异常值和噪声假设在不同的集群中。
当带宽减少一点时,我最终得到了这个......这又不是我想要的。
谁能帮我解决这个问题?
【问题讨论】:
注意:我已将您的帖子重新标记为 Python,因为您使用的是numpy
和 sklearn
,而不是 MATLAB。无论如何,对我来说,那些“异常值”是相当主观的。为什么你认为这些点是异常值?您进行了哪些定性/定量观察来确定这些异常值?如果你不能回答这个问题,那么获得一个机器学习/聚类算法来删除你无法详细描述的内容将是相当困难的。如果您提供原始输入数据也会有所帮助,以便我们可以重建您的问题。
@rayryeng 嗨,我已经包含了输入数据。我有一个模型,我从中生成了这些点。例如,在这种情况下,它是一只兔子......所以远离实际表面的点或密度较小的区域中的点被视为异常值。正如你所知道的,与其他人相比,圆圈中的点或多或少是孤立的
【参考方案1】:
您可以使用均值偏移之前去除异常值。
统计删除
例如,为每个点确定要分析的邻居数量(例如 50)和标准差乘数(例如 1)。所有与查询点的平均距离大于 1 个标准差的点都将被标记为异常值并被删除。该技术在 libpcl 中使用,在 pcl::StatisticalOutlierRemoval 类中,可以找到教程here。
确定性移除(基于半径)
一种更简单的技术在于指定半径 R 和最小邻居数 N。半径为 R 的邻居少于 N 个的所有点都将被标记为异常值并被删除。此技术也用于 libpcl,在 pcl::RadiusOutlierRemoval 类中,可以在 here 找到教程。
【讨论】:
你也可以做一个非常快的体素网格过滤器,在 c++ 中大约 18 毫秒需要 306000 点【参考方案2】:均值偏移并不意味着去除低密度区域。
它试图将所有数据移动到最密集的区域。
如果有一个最密集的点,那么所有东西都应该移到那里,你只会得到一个集群。
尝试不同的方法。也许首先删除异常值。
【讨论】:
关于如何从这些数据中删除异常值的任何建议? 它们在我看来并不像异常值,所以我不相信某些东西会起作用。但是尝试常用的方法kNN,LOF,LoOP,...也可以尝试密度估计技术,例如核密度估计,也许你可以找到一个密度阈值。 据我所知,mean shift 本身需要内核密度估计来估计密度,然后它将平均值转移到高密度区域......所以我想,正如你建议的那样使用 KDE,为什么它不工作? MeanShift 不是寻找低密度点,而是寻找高密度点。 非常感谢您的帮助。你能指导我使用python/任何其他语言的3d数据的任何内核密度估计实现吗?【参考方案3】:将他的参数设置为false cluster_allbool, default=True 如果为真,那么所有点都会被聚集,即使是那些不在任何内核中的孤儿也是如此。孤儿被分配给最近的内核。如果为 false,则给孤儿集群标签 -1。
【讨论】:
以上是关于如何使用 MeanShift 聚类技术去除噪声?的主要内容,如果未能解决你的问题,请参考以下文章
均值漂移(MeanShift)谱聚类(Spectral clustering)AP聚类(Affinity propagation)聚类应用(客户分群)聚类应用(睡眠分析)
在python的MeanShift模块中估计带宽时如何选择合适的分位数?
[Python从零到壹] 十三.机器学习之聚类算法四万字总结全网首发(K-MeansBIRCH树状聚类MeanShift)