все! Меня попросили создать алгоритм К-мер на R, но я действительно не знаю языка, поэтому я нашел примерный код в Интернете и решил использовать. Я изучил его, изучил функции, которые используются в нем, и немного исправил его, потому что он не очень хорошо работал. Вот код:K-алгоритм, R
# Creating a sample of data
y=rnorm(500,1.65)
x=rnorm(500,1.15)
x=cbind(x,y)
centers <- x[sample(nrow(x),5),]
# A function for calculating the distance between centers and the rest of the dots
euclid <- function(points1, points2) {
distanceMatrix <- matrix(NA, nrow=dim(points1)[1], ncol=dim(points2)[1])
for(i in 1:nrow(points2)) {
distanceMatrix[,i] <- sqrt(rowSums(t(t(points1)-points2[i,])^2))
}
distanceMatrix
}
# A method function
K_means <- function(x, centers, euclid, nItter) {
clusterHistory <- vector(nItter, mode="list")
centerHistory <- vector(nItter, mode="list")
for(i in 1:nItter) {
distsToCenters <- euclid(x, centers)
clusters <- apply(distsToCenters, 1, which.min)
centers <- apply(x, 2, tapply, clusters, mean)
# Saving history
clusterHistory[[i]] <- clusters
centerHistory[[i]] <- centers
}
structure(list(clusters = clusterHistory, centers = centerHistory))
}
res <- K_means(x, centers, euclid, 5)
#To use the same plot operations I had to use unlist, since the resulting object in my function is a list of lists,
#and default object is just a list. And also i store the history of each iteration in that object.
res <- unlist(res, recursive = FALSE)
plot(x, col = res$clusters5)
points(res$centers5, col = 1:5, pch = 8, cex = 2)
Он отлично работает на этой простой матрице. Но меня попросили использовать его на радужной оболочке:
head(iris)
a <-data.frame(iris$Sepal.Length, iris$Sepal.Width, iris$Petal.Length, iris$Petal.Width)
centers <- a[sample(nrow(a),3),]
iris_clusters <- K_means(a, centers, euclid, 3)
iris_clusters <- unlist(iris_clusters, recursive = FALSE)
head(iris_clusters)
И проблема в том, что он не работает. Ошибка:
Error in distanceMatrix[, i] <- sqrt(rowSums(t(t(points1) - points2[i, :
number of items to replace is not a multiple of replacement length
Я понимаю, что размеры объектов не совпадают, но я не понимаю, почему. Вот почему я прошу о помощи. Прошу прощения за всю тупость, которая может быть в этом коде заранее, но я пока не очень хорошо знаком с языком, поэтому не судите меня слишком жестко. Спасибо!
Это может быть потому, что в вашем примере 'centers' является матрицей и с«радужки»представляет собой кадр данных. попробуйте 'центры <- unlist (a [sample (nrow (a), 3),])' –
Вам нужно написать свой собственный или просто создать выход 'kmeans'? Если это последний, 'kmeans' встроен. Рассмотрим' kmeans (iris [, -5], 3) '. –
Это было быстро! Спасибо за ответ @PierreLafortune, но теперь он дает еще одну ошибку: Ошибка в матрице (NA, nrow = dim (points1) [1], ncol = dim (points2) [1]): код нечисловой матрицы ' –