【问题标题】:Finding defined peaks with Clusters in MATLAB在 MATLAB 中使用簇查找定义的峰值
【发布时间】:2025-11-23 22:00:02
【问题描述】:

这是我的问题:

我有下一个数据“A”,看起来像:

如您所见,我用红色圆圈绘制了明显的峰,最定义的是 2 和 7,我说它们被定义是因为它的标准偏差与其他峰相比较低(尤其是第二个峰) .

我需要的是一种方法(无论如何)来获取数值数组中 n 个峰值的值和标准差。

我尝试过使用“集群”,但没有得到好的结果:

首先,我使用了“kmeans”MATLAB 函数,我意识到这个算法并没有按照我的需要对峰进行分组。正如您在上图中看到的,在红色圆圈中,该集群的峰值少于 3 或 4 个。而kmeans需要你设置簇数,我需要自动识别。

希望有人能给我一些想法,或者获得更好结果的方法,谢谢。

Pd:我将数据“A”留在下一个链接中。

https://drive.google.com/file/d/0B4WGV21GqSL5a2EyQ2l0SHZURzA/edit?usp=sharing

【问题讨论】:

  • 您发布的数据只有一个峰,其标准差相对您显示的更高
  • 抱歉,我已将文件更改为正确的文件。
  • 对您的数据运行这些命令:[pks,locs]=findpeaks(A(:,2),'threshold',0.15); scatter(A(:,1),A(:,2)) hold on; scatter(A(locs,1),A(locs,2),'ro','filled') 如您所见,它们绝不是完美的峰值,而是开始聚类的好点。我把这些点拿来给 kmeans 作为起点,但结果更糟。

标签: matlab cluster-analysis


【解决方案1】:

问题是你的坐标轴有非常不同的含义。

K-means 优化方差。但是 X 的方差与 Y 的方差完全不同,不是吗?此外,这些方法中的每一个都会将您的数据拆分为 X 和 Y,而我假设您希望数据仅在 X 轴上进行分区。

我建议如下:将 Y 轴视为 权重,将 X 轴视为 位置

然后执行加权密度估计,并寻找低密度来分离您的集群。

我无法帮助您使用 MATLAB。我没用过。

在数学上,您要做的是在每个点放置一个高斯,面积为 Y,中心为 X。然后找到这些高斯和的最小值和最大值。详情见Wikipedia, Kernel Density Estimation;除了您想使用 Y 轴作为权重。如果您不想使用权重,也可以使用 1/Y 作为标准差。

【讨论】: