分离1 d数据集群和计算的元素

127(30天)
你好,
我已经与一维数组索引值的极端,我发现一个更大的数据集,下令从低到高。我想找出是否有任何数据聚类在这个数组。最简单的方法是什么?集群的总量事先是未知的。集群可以被定义为任何值在一定的预定义彼此距离。我想知道集群中发现的数量,和一个数组中找到每个集群的数量值。
我做了一个简单的例子我想在下图。十字架表示数组中的值在数轴上。值接近(去除小于给定的距离),被组合在一起,单独统计。
所以,在这种情况下,输出会;
5(集群发现的数量)
[3、2、1、1、5)(每个集群的大小)
提前谢谢!

接受的答案

凯利卡尼
凯利卡尼 2021年8月21日
如果集群公差定义了如何关闭点需要他们的最近邻以被称为集群,那么你只需要检查的差距大于公差:
%的数据
托尔= 0.1;
x = [1 1 1 2 2 3 4 5 5 5 5 5];
x = x +兰德(大小(x)) * tol-tol / 2;
%找到集群
dx = diff (x);
isnew = dx > tol;
idx = cumsum ([1 isnew]);
ncluster = max (idx)
ncluster = 5
期数= splitapply (@length idx idx)
期数= 1×5
3 2 1 1 5
如果你宽容设置最大距离可以从一个点 所有 点的集群,然后事情变得有点复杂。
3评论
Menno面包车大坝
Menno面包车大坝 2021年8月22日
@Image分析师 谢谢你通知我。幸运的是,我的数据已经发生了排序,所以这对我来说不是问题。不过,记住这一点是很有用的。

登录置评。

更多的答案(2)

图像分析
图像分析 2021年8月21日
编辑:图像分析 2021年8月21日
如果你有统计和机器学习的工具箱,这是一个函数。它被称为 dbscan聚类算法后的()相同的名称 (应该是比现在更有名。)
请看附呈dbscan演示,维基百科的描述:
基本上它发现所有点在指定距离内其他点通过菊花链方式。所有这些点可以连接通过菊花链长度小于指定属于一个集群。然后将注意力转移到其他非保密点上找到更多的集群。点比你远离任何点距离不是集群,或者换句话说,他们是一群只有1点。
这是一个很好的评论演示更适合您的数据:
%首先定义数据。
x = [1 1 1 2 2 3 4 5 5 5 5 5];
y = 0(1、长度(x));
%的阴谋。
情节(x, y,“处方”,“MarkerSize”,20岁,“线宽”3);
甘氨胆酸ax =;
斧子。XAxisLocation =“起源”;
网格;
%现在发现集群。
minDistance = 0.5;%需要比这更在同一集群。
minPointsPerCluster = 2;%集群必须至少有两个点是一个有效的集群。
指数= dbscan ((x, y)、minDistance minPointsPerCluster)
%的价值点属于集群索引说什么号码。
%如果值是1,它不属于一个集群,一个孤立的点。
%发现在每个集群(计数)
pointCounts =嘘(索引、1:马克斯(索引))
%它说有2点不是在集群(单个孤立的点)
%的数量是3、2和5的3集群。

图像分析
图像分析 2021年8月22日
你可以在一行代码调用findgroups()和histcounts ():
%首先定义数据。
x = [1 1 1 2 2 3 4 5 5 5 5 5];
%现在发现组。
g1 = findgroups (x)
%计算每组的数量。
counts1 = histcounts (g1)
%现在与另一组1的最后,分开1的第一组。
x = [1 1 1 2 1 2 3 4 5 5 5 5 5 1];
counts2 = histcounts (findgroups (x))%结合2语句放入1。
你看:
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中央,发现社区如何帮助你!

开始狩猎!