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
ait küme içi toplamını minimize etmeye çalışır. Ancak R'ın uygulanmasıyla ilgili bir sorun yoktur
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
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ı?
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.) (
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.
Ş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
Sen çok daha fazla dikkatini çekeceğini "Çapraz Doğrulanmış" Yığın Değişim sitesi. – kdauria