2013-12-07 8 views
18

R'de K-Means Algoritması ile çalışıyorum ve 4 Algoritma Lloyd, Forgy, MacQueen ve Hartigan-Wong arasındaki farklılıkları anlamak istiyorum. İstatistik paketindeki "kmeans" fonksiyonu için kullanılabilir. K-Araçlar: Lloyd, Forgy, MacQueen, Hartigan-Wong

Ancak bu soruya yeterli bir cevap almak için dikkat çekicidir.

sadece bazı nadir bilgiler bulundu: bu açıklama Lloyd, Forgy ve Hartigan-Wong itibaren

(http://en.wikibooks.org/wiki/Data_Mining_Algorithms_In_R/Clustering/K-Means Ziyaret) aynı bana görünüyor. Karelerin toplamının minimize edilmesi veya Euclidean mesafesinin minimize edilmesi aynıdır.

MacQueen haklıysam bir nesne başka bir kümeye taşınır eğer iki yer kümeleri günceller durumda farklıdır.

Yine de, yine de bu Algoritmalar farklıdır işaret ettiği görmüyorum.

+0

Sen çok daha fazla dikkatini çekeceğini "Çapraz Doğrulanmış" Yığın Değişim sitesi. – kdauria

cevap

21

R kmeans için bir seçenek olarak Lloyd algoritması içerir(); Varsayılan algoritma, Hartigan ve Wong (1979) tarafından daha akıllıdır. MacQueen algoritması (MacQueen, 1967) gibi, o Sentroidler bir noktaya taşınır her zaman günceller; o da zeki (zaman kazandıran) seçimler yapar yakın kümenin kontrolünde yardımcı olurlar. Öte yandan Lloyd'un k-means algoritması, tüm bu kümeleme algoritmalarının ilk ve en basitidir.

Lloyd algoritması (Lloyd, 1957) (düşünüyorum: sıraları Reali olarak bir NXP matris veya puanlar) gözlem veya durumlar bir dizi alır ve kümeleri onları k gruba. Bu u_i küme S_i tüm noktalarının anlamı olan kareler enter image description here

ait küme içi toplamını minimize etmeye çalışır. Ancak R'ın uygulanmasıyla ilgili bir sorun yoktur enter image description here

ve çoklu başlangıç ​​noktaları göz önünde bulundurarak gerektiğinde ortaya çıkmaktadır: aşağıdaki gibi algoritma ilerler (I sen ayrıntılı gösterim formalite yedek olacak). Genel olarak, birçok farklı başlangıç ​​noktasını dikkate almanın ihtiyatlı olduğuna dikkat etmeliyim, çünkü algoritmanın yakınsama garantisi vardır, ancak küresel bir optima'yı kapsayacak şekilde garanti edilen değildir. Bu özellikle büyük, yüksek boyutlu sorunları için geçerlidir. Basit bir örnekle başlayacağım (özellikle büyük değil). Her ne kadar

, çözüm daha önce elde çok benzer olduğunu

enter image description here enter image description here enter image description here enter image description here

Not (biz matematiksel formulaswith lateks yazamıyor olarak Ben burada bazı resim yapıştırmak olacaktır) kümelerinin sıralaması isteğe bağlıdır. Daha da önemlisi, iş sadece paralel olarak 0.199 saniye sürdü! Kesinlikle bu doğru olamayacak kadar iyi: 3 işlemci çekirdeği kullanarak, ilk (ardışık) çalışmamızın zamanının üçte birini almalıyız. Bu bir sorun mu? Bedava öğle yemeği gibi geliyor. Orada bir kez ücretsiz öğle yemeği ile sorunu yok, var mı?

enter image description here

Bu her zaman R fonksiyonları çalışmaz, ama bazen kod doğrudan bakmak için bir şans var. Bu o zamanlardan biri. Bu kodu mykmeans.R, dosyasına koyacağım ve elle düzenleyerek, çeşitli yerlerde cat() ifadelerini ekleyeceğim. İşte lavabo() kullanarak, bu yapmak için akıllı bir yoldur (bu Sweave çalışmak görünmüyor rağmen, etkileşimli çalışır):

> sink("mykmeans.R") 
> kmeans 
> sink() 

Şimdi dosyasını düzenleyerek işlev adı değişen ve kedi ekleme() ifadeleri.) (

enter image description here

Sonra bizim keşifler tekrarlayabilirsiniz ancak mykmeans kullanarak:: Ayrıca bir eğik çizgi silmek zorunda olduğunu Not

> source("mykmeans.R") 
> start.kmeans <- proc.time()[3] 
> ans.kmeans <- mykmeans(x, 4, nstart = 3, iter.max = 10, algorithm = "Lloyd") 
JJJ statement 1: 0 elapsed time. 
JJJ statement 5: 2.424 elapsed time. 
JJJ statement 6: 2.425 elapsed time. 
JJJ statement 7: 2.52 elapsed time. 
JJJ statement 6: 2.52 elapsed time. 
JJJ statement 7: 2.563 elapsed time. 

enter image description here

Şimdi bizde işte yeniden: çoğu zaman ifade 5 önce tüketildi (Ben bu kursu biliyordu, bu yüzden 5 ifade 5 yerine 5 idi) ... You

İşte
####################################################################### 
# kmeans() 

N <- 100000 
x <- matrix(0, N, 2) 
x[seq(1,N,by=4),] <- rnorm(N/2) 
x[seq(2,N,by=4),] <- rnorm(N/2, 3, 1) 
x[seq(3,N,by=4),] <- rnorm(N/2, -3, 1) 
x[seq(4,N,by=4),1] <- rnorm(N/4, 2, 1) 
x[seq(4,N,by=4),2] <- rnorm(N/4, -2.5, 1) 
start.kmeans <- proc.time()[3] 
ans.kmeans <- kmeans(x, 4, nstart=3, iter.max=10, algorithm="Lloyd") 
ans.kmeans$centers 
end.kmeans <- proc.time()[3] 
end.kmeans - start.kmeans 

these <- sample(1:nrow(x), 10000) 
plot(x[these,1], x[these,2], pch=".") 
points(ans.kmeans$centers, pch=19, cex=2, col=1:4) 

library(foreach) 
library(doMC) 
registerDoMC(3) 
start.kmeans <- proc.time()[3] 
ans.kmeans.par <- foreach(i=1:3) %dopar% { 
    return(kmeans(x, 4, nstart=1, iter.max=10, algorithm="Lloyd")) 
} 
TSS <- sapply(ans.kmeans.par, function(a) return(sum(a$withinss))) 
ans.kmeans.par <- ans.kmeans.par[[which.min(TSS)]] 
ans.kmeans.par$centers 
end.kmeans <- proc.time()[3] 
end.kmeans - start.kmeans 

sink("mykmeans.Rfake") 
kmeans 
sink() 

source("mykmeans.R") 
start.kmeans <- proc.time()[3] 
ans.kmeans <- mykmeans(x, 4, nstart=3, iter.max=10, algorithm="Lloyd") 
ans.kmeans$centers 
end.kmeans <- proc.time()[3] 
end.kmeans - start.kmeans 

####################################################################### 
# Diving 

x <- read.csv("Diving2000.csv", header=TRUE, as.is=TRUE) 
library(YaleToolkit) 
whatis(x) 

x[1:14,c(3,6:9)] 

meancol <- function(scores) { 
    temp <- matrix(scores, length(scores)/7, ncol=7) 
    means <- apply(temp, 1, mean) 
    ans <- rep(means,7) 
    return(ans) 
} 
x$panelmean <- meancol(x$JScore) 

x[1:14,c(3,6:9,11)] 

meancol <- function(scores) { 
    browser() 
    temp <- matrix(scores, length(scores)/7, ncol=7) 
    means <- apply(temp, 1, mean) 
    ans <- rep(means,7) 
    return(ans) 
} 

x$panelmean <- meancol(x$JScore) 

açıklama yer almaktadır: o İşte

ile oynamaya devam et koddur

Number of cases: 10,787 scores from 1,541 dives (7 judges score each 
dive) performed in four events at the 2000 Olympic Games in Sydney, 
Australia. 

Number of variables: 10. 

Description: A full description and analysis is available in an 
article in The American Statistician (publication details to be 
announced). 

Variables: 

Event  Four events, men's and women's 3M and 10m. 
Round  Preliminary, semifinal, and final rounds. 
Diver  The name of the diver. 
Country  The country of the diver. 
Rank  The final rank of the diver in the event. 
DiveNo  The number of the dive in sequence within round. 
Difficulty The degree of difficulty of the dive. 
JScore  The score provided for the judge on this dive. 
Judge  The name of the judge. 
JCountry The country of the judge. 

Ve veri kümesi onunla deneme https://www.dropbox.com/s/urgzagv0a22114n/Diving2000.csv

+0

Bu ayrıntılı cevap için teşekkürler! Özellikle çalışma zamanı olan kısım ilginç görünüyor. (Sadece bir not: R'de kontrol ettiğim fonksiyonlar, R'de ekstrenizden biraz farklıdır, bu yüzden belki de bazı değişiklikler gerçekleşmiştir). Ancak sorumun odak noktası farklıydı. Hartigan-Wong'un ya da Lloyd ve Forgy algoritması arasındaki farkı "zeki (zaman tasarrufu)" seçimleriyle ilgilenirdim. Ama yine de cevabın için teşekkürler! – user2974776