我在Matlab中有一组3d点,但问题是我的数据找到here。正如您所看到的,有一些异常值会影响我的聚类结果。所以如果有人可以请告诉我如何从我的数据中删除这些异常值。
答案 0 :(得分:2)
查看了您的数据后,我认为任何群集算法都无法满足您的需求。相反,您可能需要训练分类器。这就是Kinect人所做的,使用数以百万计的真实和合成姿势训练分类器,让它标记肢体,头部等。
我之所以认为基于密度的聚类不起作用,是因为您的数据是单个的,密度连接的,带有两个盒子形状的blob。但不知道什么是"身体"和一个"框"是的,细分将是相当随意的。或者在基于密度的聚类的情况下:它根本不会分段,或者它将分段,例如通过z轴的相当低的结果。此外,您的X和Y轴来自基于网格的图像扫描(我假设),因此您在X和Y轴上具有非常均匀的密度 - 但是例如,臂的密度不低于身体或框。
但是,您可以使用DBSCAN具有相当宽泛(且易于设置)的参数来消除噪音。
E.g。在ELKI中,以下参数产生合理的结果:
java -jar elki.jar -dbc.in /tmp/XX.csv -algorithm clustering.DBSCAN \
-dbscan.epsilon 0.05 -dbscan.minpts 100
多数群集是删除异常值的数据;即使脚附近的这个斑点被移除了。
要加快群集过程,您可以添加参数
-db.index tree.spatial.rstarvariants.rstar.RStarTreeFactory \
-pagefile.pagesize 1000 -spatial.bulkstrategy SortTileRecursiveBulkSplit
这会产生运行时opf 4.5秒。对于Kinect上的实时操作来说,这显然不够好;但是看到定向分类算法胜过无监督方法并不奇怪 - 实际上这是预期的。
以下是使用上述参数对数据集进行聚类的结果: