将一维数据分成簇,并计算每个簇中元素的数量

122次浏览(过去30天)
你好,
我有一个一维数组,其中包含我在一个更大的数据集中发现的极端索引值,从最低到最高排序。我想找出是否有任何数据集群在这个数组。最简单的方法是什么?集群的总数事先是未知的。可以将集群定义为彼此之间在预定义的某个距离内的任何值。我想知道找到的簇的数量,以及在每个簇中找到的值的数量的数组。
我在下面的图中做了一个简单的说明。十字表示数轴上数组中的值。靠近的值(移除的距离小于给定距离)被分组并计数。
在这种情况下,输出是;
5(发现的群集数量)
[3,2,1,1,5](每个簇的大小)
提前感谢!

接受的答案

凯利卡尼
凯利卡尼 2021年8月21日
如果集群容差定义了点与最近邻居的距离需要有多近才能被称为集群,那么你只需要检查距离大于该容差的地方:
%数据
Tol = 0.1;
X = [1 1 1 2 2 2 3 4 5 5 5 5 5 5 5];
X = X + rand(size(X))* tool - tool /2;
%查找集群
Dx = diff(x);
Isnew = dx >;
Idx = cumsum([1 isnew]);
Ncluster = max(idx)
Ncluster = 5
= splitapply(@length, idx, idx)
期数= 1×5
3 2 1 1 5
相反,如果您的容差设置了一个点可以从的最大距离 所有 在它的簇中有点,然后事情就变得有点棘手了。
3评论
门诺·范·达姆
门诺·范·达姆 2021年8月22日
@Image分析师 谢谢你通知我这件事。幸运的是,我的数据碰巧已经排序过了,所以这对我来说不是问题。不过,记住这一点还是很有用的。

登录评论。

更多答案(2)

图像分析
图像分析 2021年8月21日
编辑:图像分析 2021年8月21日
如果你有统计学和机器学习工具箱,有一个函数可以做到这一点。它被称为 在同名聚类算法之后添加Dbscan () (也许它应该比现在更出名。)
请参阅附带的dbscan演示和Wikipedia描述:
基本上,它通过菊花链找到与其他点在指定距离内的所有点。所有那些可以通过小于指定长度的菊花链连接的点属于一个集群。然后它移动到其他未分类的点来寻找更多的聚类。距离任何一点远于你距离的点不是聚类,换句话说,它们是只有一个点的聚类。
这里有一个非常好的评论演示,更适合你的数据:
首先定义数据。
X = [1 1 1 2 2 2 3 4 5 5 5 5 5 5 5];
Y = 0 (1, length(x));
把它画出来。
情节(x, y,“处方”“MarkerSize”, 20岁,“线宽”3);
Ax = gca;
斧子。XAxisLocation =“起源”
网格
现在找到集群。
minDistance = 0.5;%要在同一集群中,需要比此更接近。
minPointsPerCluster = 2;%一个集群至少要有2个点才算有效集群。
索引= dbscan([x',y'], minDistance, minPointsPerCluster)
索引的值表示该点属于哪个簇号。
%当取值为-1时,表示该节点不属于集群,是一个孤立的点。
%查找每个集群中的数量(count)
pointCounts = hist(index, -1: max(indexes))
%表示有2个点不在一个簇中(单个孤立点),并且
%则对于找到的3个群集,计数分别为3、2和5。

图像分析
图像分析 2021年8月22日
你可以在一行代码中调用findgroups()和histcounts():
首先定义数据。
X = [1 1 1 2 2 2 3 4 5 5 5 5 5 5 5];
现在找出组。
G1 = findgroups(x)
%数出每组的个数。
Counts1 = histcounts(g1)
现在,另一组1在末尾,与第一组1分开。
X = [1 1 1 2 2 2 3 4 5 5 5 5 5 1 1 1 1];
Counts2 = histcounts(findgroups(x))%将两个语句合并为一个语句。
你看:
counts1 =
3 2 1 1 5
counts2 =
5 2 1 1 5
你应该这么做。
2的评论
图像分析
图像分析 2021年8月22日
Findgroups()似乎没有容忍,并且似乎期望离散值,因此22000和22001将在两个不同的组中。你的原始数组似乎是一些重复的整数,所以这就是为什么我建议findgroups()。但如果它们略有不同,而且你有一定的忍耐力,我相信大多数专家都会这样做 建议使用dbscan() 也就是说,如果你有统计学和机器学习工具箱的话。

登录评论。

s manbetx 845


释放

R2021a

社区寻宝

在MATLAB Central中寻找宝藏,并了解社区如何帮助您!

开始狩猎!