Я пытаюсь понять, что stat: kmeans делает иначе, чем простая версия, описанная, например, в Википедии.Я, честно говоря, в высшей степени невежественен.
Читая справку по kmeans, я узнал, что по умолчанию используется алгоритм Хартигана-Вонга, а не более базовый метод, поэтому должна быть разница, но я поиграюсь с некоторыми нормальными распределенными переменными.Не удалось найти случай, когда они существенно и предсказуемо отличались.
Для справки, это мой ужасный код, с которым я тестировал
##squre of eudlidean metric
my_metric <- function(x=vector(),y=vector()) {
stopifnot(length(x)==length(y))
sum((x-y)^2)
}
## data: xy data
## k: amount of groups
my_kmeans <- function(data, k, maxIt=10) {
##get length and check if data lengths are equal and if enough data is provided
l<-length(data[,1])
stopifnot(l==length(data[,2]))
stopifnot(l>k)
## generate the starting points
ms <- data[sample(1:l,k),]
##append the data with g column and initilize last
data$g<-0
last <- data$g
it<-0
repeat{
it<-it+1
##iterate through each data point and assign to cluster
for(i in 1:l){
distances <- c(Inf,Inf,Inf)
for(j in 1:k){
distances[j]<-my_metric(data[i,c(1,2)],ms[j,])
}
data$g[i] <- which.min(distances)
}
##update cluster points
for(i in 1:k){
points_in_cluster <- data[data$g==i,1:2]
ms[i,] <- c(mean(points_in_cluster[,1]),mean(points_in_cluster[,2]))
}
##break condition: nothing changed
if(my_metric(last,data$g)==0 | it > maxIt){
break
}
last<-data$g
}
data
}