5

私のデータは前処理された画像データで、2 つのクラスを分離したいと考えています。理論的には (そしてうまくいけば実際には)、最良のしきい値は、バイモーダル分散データの 2 つのピーク間の局所的な最小値です。

私のテストデータは次のとおりです。http://www.file-upload.net/download-9365389/data.txt.html

このスレッドをフォローしようとしました: ヒストグラムをプロットし、カーネル密度関数を計算しました:

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

しかし、どのように続けるのですか?

密度関数の 1 次導関数と 2 次導関数を計算して、極値、具体的には極小値を見つけます。ただし、Rでこれを行う方法がわかりませdensity(test)ん。通常の機能ではないようです。したがって、私を助けてください:どうすれば導関数を計算し、密度関数の2つのピーク間のピットの極小値を見つけることができますdensity(test)か?

4

1 に答える 1

10

これを行うにはいくつかの方法があります。

まず、d質問のように密度に使用しd$xd$y密度プロットの x 値と y 値を含めます。最小値は、導関数 dy/dx = 0 のときに発生します。x 値は等間隔であるため、 を使用して dy を推定し、最小化される場所diff(d$y)を探すことができます。d$xabs(diff(d$y))

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

問題は、dy/dx = 0 のときに密度曲線も最大化される可能性があることです。この場合、最小値は浅いですが、最大値はピークに達しているため、機能しますが、それを期待することはできません。

したがって、2 番目の方法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")

于 2014-08-13T01:25:08.110 に答える