Masalah utama dari analisis klaster data praktis adalah adanya outlier. Sebagian besar metode pengelompokan yang ada tidak memperhitungkan keberadaannya, oleh karena itu, pengamatan anomali yang jelas termasuk dalam komposisi beberapa cluster, yang dapat secara serius menggantikan pusatnya dan mempengaruhi kualitas klasifikasi. Tentu saja, pertama-tama Anda dapat memeriksa data awal untuk mengetahui adanya outlier, menyingkirkannya, dll., tetapi kemudian tugas akan berubah menjadi dua tahap, tetapi kami ingin tugas itu "sekaligus".
Salah satu pendekatan untuk memecahkan masalah ini (untuk metode pengelompokan untuk secara otomatis menyaring outlier) disebut "penaksir kemungkinan maksimum yang tidak tepat yang disetel secara optimal" dan dijelaskan dalam artikel 2017 ini ( http://dx.doi.org/10.1080/ 01621459.2015. 1100996 ), dan baru-baru ini menerima implementasi di R. Mari kita bicarakan.
Teori sesaat
Singkatnya, pengelompokan menggunakan algoritma EM didasarkan pada asumsi bahwa cluster tertentu memiliki bentuk yang mendekati bentuk distribusi normal multivariat. Kemudian masalah pengelompokan dapat dianggap sebagai masalah pemisahan komponen-komponen campuran, dan pengelompokan ditentukan menurut probabilitas jatuh ke dalam satu atau komponen lain.
Peningkatan matematis dari algoritma klasik adalah bahwa asumsi yang sedikit berbeda diambil. Dipercaya bahwa fungsi probabilitas dari distribusi titik adalah jumlah dari campuran Gauss dan distribusi titik noise yang seragam (diasumsikan bahwa outlier didistribusikan secara merata), yaitu
Hal ini menyebabkan beberapa komplikasi dari solusi masalah optimasi, yang sekarang terlihat seperti solusi untuk masalah maksimum
tetapi dengan batasan seperti itu
Masalah optimasi ini (terutama dengan kondisi yang dikenakan pada rasio nilai eigen) tidak selalu memiliki solusi. Penulis jujur tentang hal ini, tetapi mereka juga mengklaim bahwa algoritme mereka cukup mudah untuk mengatasi cluster dengan bentuk yang agak rumit. Mari kita periksa
Percobaan
- , .
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) #
. , .
Dapat dicatat bahwa bahkan jika seseorang menebak dengan jumlah cluster (3), maka hasil clustering, pada kenyataannya, akan sangat berbeda dari yang sebenarnya - dan gambaran yang lebih memadai akan diberikan oleh partisi dengan jumlah yang lebih besar. klaster daripada kenyataannya. Hal ini dikarenakan bentuk cluster yang tidak elips, namun secara umum algoritma bekerja dengan baik bahkan dalam kondisi noise.