gpt4 book ai didi

r - 使用 r 找到双峰分布中的局部最小值

转载 作者:行者123 更新时间:2023-12-01 17:52:25 25 4
gpt4 key购买 nike

我的数据是预处理的图像数据,我想分开两个类。理论上(希望在实践中)最佳阈值是双峰分布数据中两个峰值之间的局部最小值。

我的测试数据是:http://www.file-upload.net/download-9365389/data.txt.html

我试图关注this thread :我绘制了直方图并计算了核密度函数:

datafile <- read.table("....txt")
data <- data$V1
hist(data)

d <- density(data) # returns the density data with defaults
hist(data,prob=TRUE)
lines(d) # plots the results

但是如何继续呢?

我会计算密度函数的一阶和二阶导数来找到局部极值,特别是局部最小值。然而我不知道如何在 R 中做到这一点,并且密度(测试)似乎不是一个正常的函数。因此,请帮助我:如何计算导数并找到密度函数密度(测试)中两个峰之间凹坑的局部最小值?

最佳答案

有几种方法可以做到这一点。

首先,使用 d 作为密度,如您的问题所示,d$xd$y 包含 x 和 y 值密度图。当导数 dy/dx = 0 时出现最小值。由于 x 值等距,我们可以使用 diff(d$y) 估计 dy,并求 d$x code> 其中 abs(diff(d$y)) 被最小化:

d$x[which.min(abs(diff(d$y)))]
# [1] 2.415785

问题是,当 dy/dx = 0 时,密度曲线也可能最大化。在这种情况下,最小值很浅,但最大值达到峰值,所以它可以工作,但你不能相信这一点。

因此,第二种方法使用optimize(...),它在给定的时间间隔内寻找局部最小值。 optimize(...) 需要一个函数作为参数,因此我们使用 approxfun(d$x,d$y) 来创建插值函数。

optimize(approxfun(d$x,d$y),interval=c(1,4))$minimum
# [1] 2.415791

最后,我们证明这确实是最小值:

hist(data,prob=TRUE)
lines(d, col="red", lty=2)
v <- optimize(approxfun(d$x,d$y),interval=c(1,4))$minimum
abline(v=v, col="blue")

另一种实际上更受欢迎的方法是使用 k-means 聚类。

df <- read.csv(header=F,"data.txt")
colnames(df) = "X"

# bimodal
km <- kmeans(df,centers=2)
df$clust <- as.factor(km$cluster)
library(ggplot2)
ggplot(df, aes(x=X)) +
geom_histogram(aes(fill=clust,y=..count../sum(..count..)),
binwidth=0.5, color="grey50")+
stat_density(geom="line", color="red")

数据实际上看起来更像是三峰而不是双峰。

# trimodal
km <- kmeans(df,centers=3)
df$clust <- as.factor(km$cluster)
library(ggplot2)
ggplot(df, aes(x=X)) +
geom_histogram(aes(fill=clust,y=..count../sum(..count..)),
binwidth=0.5, color="grey50")+
stat_density(geom="line", color="red")

关于r - 使用 r 找到双峰分布中的局部最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25264461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com