如何检测信号是单峰还是双峰?

信息处理 直方图 时间序列
2022-02-06 16:25:10

我要各种信号。第一种类型的信号使得它们的直方图是单峰的(单峰)。第二种类型的信号使得它们的直方图是双峰的(双峰)。如何最好地检测信号是单峰还是双峰?在某些信号中存在很多噪声,因此我想检测会很困难。关于如何衡量“双峰”的任何想法?

1个回答

Cross Validated.SE上有类似问题的一些答案

一个建议的答案是使用 Hartigan 的浸渍测试。另一种是使用mixtools包。

我在R中模拟了一些示例数据并使用diptestmixtools包。下图显示了图表顶部的原始数据,以及根据mixtools.

在此处输入图像描述

结果diptest是:

数据:one_mode D = 0.0219,p 值 = 0.9915

数据:two_mode D = 0.0628,p 值 = 0.004434

也就是说diptest,第一个(单峰)数据集有 99.15% 的机会成为单峰,第二个(双峰)数据集有 0.44% 的机会成为单峰。


下面的 R 代码 # Q26358

one_mode <- rnorm(100, 0, 1)
two_mode <- c(rnorm(50, -2, 1), rnorm(50, +2, 1))

plot(1:100,one_mode,pch=16, col="green")
lines(1:100,two_mode, pch=16, col="red")

library(mixtools)

par(mfrow=c(2,2))
plot(1:100,one_mode,pch=16, col="green")
plot(1:100,two_mode, pch=16, col="red")


mixmdl = normalmixEM(one_mode)
plot(mixmdl,which=2)
lines(density(one_mode), lty=2, lwd=2)

mixmdl_two = normalmixEM(two_mode)
plot(mixmdl_two,which=2)
lines(density(two_mode), lty=2, lwd=2)

library(diptest)
dip.test(one_mode)
dip.test(two_mode)