実際のデータのクラスター分析の主な問題は、外れ値の存在です。既存のクラスタリング方法のほとんどは、それらの存在を考慮していません. もちろん、最初に外れ値の初期データを確認したり、それらを除外したりすることもできますが、その後は2段階のタスクになりますが、「一度に」したいと思います。
この問題を解決するためのアプローチの 1 つ (クラスタリング方法で外れ値を自動的に除外するため) は、「最適に調整された堅牢な不適切な最尤推定器」と呼ばれ、この 2017 年の記事 ( http://dx.doi.org/10.1080/) で説明されています。 01621459.2015. 1100996 )、そして最近 R の実装を受け取りました。それについて話しましょう。
理論の瞬間
つまり、EM アルゴリズムを使用したクラスタリングは、特定のクラスターの形状が多変量正規分布の形状に近いという仮定に基づいています。次に、クラスタリング問題は混合物の成分を分離する問題と見なすことができ、クラスタはいずれかの成分に分類される確率に従って決定されます。
古典的なアルゴリズムの数学的アップグレードは、わずかに異なる仮定が採用されていることです。ポイントの分布の確率関数は、ガウスの混合とノイズ ポイントの一様分布 (外れ値は均一に分布していると仮定) の合計であると考えられています。
これにより、最適化問題の解が複雑になり、最大問題の解のように見えます。
しかし、そのような制限で
この最適化問題 (特に固有値の比率に課せられた条件) は、常に解があるとは限りません。著者はこれについて正直ですが、彼らのアルゴリズムはかなり複雑な形状のクラスターに対処するのが非常に簡単であるとも主張しています。確認しよう
実験
- , .
library(ggplot2)
#
set.seed(739)
n <- 500 # numer of points
y <- abs(c(rnorm(n,5,2)))
x <- c(rnorm(n,5,1))/sqrt(y)
class<-rep(1,n)
dat1 <- as.data.frame(cbind(x,y,class)) # - -
y <- c(rnorm(n,8,0.4))
x <- rlnorm(n, meanlog = log(7), sdlog = 0.2)
class<-rep(2,n)
dat2 <- as.data.frame(cbind(x,y,class)) # -
y <- c(runif(n, min = 2, max = 7))
x <- c(rnorm(n,8,0.4))
class<-rep(3,n)
dat3 <- as.data.frame(cbind(x,y,class)) # -
y <- c(runif(n/10, min = 0, max = 10))
x <- c(runif(n/10, min = 0, max = 10))
class<-rep(0,n/10)
dat4 <- as.data.frame(cbind(x,y,class)) #
dat <- rbind(dat1,dat2,dat3,dat4)
colnames(dat) <- c("x","y", "class")
dat$class <- as.factor(dat$class)
dat_test <- as.data.frame(dat)
p_base <- ggplot(dat,aes(x=x,y=y,color=class)) + geom_point()
ggExtra::ggMarginal(p_base, groupColour = TRUE, groupFill = TRUE)
otrimle , , . 2 5, .
library(otrimle)
clus <- otrimleg(dat[,c(1,2)], G=2:5, monitor=1) # monitor
-
, ( , , , , iloglik . , , 4 5 3 - ). . , ,
clus$solution
Noise - , . ( 1,2,10 ) - 5 .
clus_2 <-otrimle(dat[,c(1,2)], G = 5, npr.max = 0.01, erc = 20, monitor = TRUE)
# npr.max -
# erc - /
clus_2$code
clus_2$flag
clus_2$code 0, , , clus_2$code = 1, , EM- ( ), clus_2$code = 2, , .
clus_2$flag .
clus_2$flag = 1,
, , 0.
clus_2$flag = 2,
clus_2$flag = 3,
clus_2$flag = 4,
(clus_2$code = 2, clus_2$flag = 4), .
clus_2$mean #
head(clus_2$tau) #
head(clus_2$cluster) #
. , .
クラスタの数 (3) で推測したとしても、クラスタリングの結果は実際の結果とは大きく異なることに注意してください。実際よりもクラスター。これは、クラスターの形状が楕円でないためですが、一般に、アルゴリズムはノイズ条件でもうまく機能します。