我试图了解R语言的一些基础知识。昨天,我为自己做了一个小练习:
R中的群集
到目前为止,我设法对欧几里德和曼哈顿方法进行了一些计算。
resultEuclidean <- Kmeans(myData, 6, method = "euclidean");
resultManhattan <- Kmeans(myData, 6, method = "manhattan");
我知道,我还可以应用其他距离,例如:gower或余弦。
resultGower <- Kmeans(myData, 6, method="gower");
resultCosine <- Kmeans(myData, 6, method="cosine");
问题:
不幸的是,它并不是那么简单,我仍然无法弄清楚如何将这两种方法用于kmeans聚类。有人可以对这个话题有所了解吗?
代码
# libraries
library(factoextra);
library(cluster);
install.packages("amap");
library(amap);
# dataset
data("multishapes", package = "factoextra");
myData <- multishapes;
myData$shape <- NULL;
# algorithm
resultEuclidean <- Kmeans(myData, 6, method = "euclidean");
resultManhattan <- Kmeans(myData, 6, method = "manhattan");
resultGower <- Kmeans(myData, 6, method="gower");
resultCosine <- Kmeans(myData, 6, method="cosine");
答案 0 :(得分:1)
一种相当普遍的误解是,k-means使距离最小化,因为它“将每个点分配到最近的质心”。但那只是k-means的一半。 K-means然后重新计算中心,不最小化其他距离,但只有很少。
均值是最小二乘估计,最小化sum_d (x[d] - center[d])^2
。即它最小化了欧几里德平方。
如果在将点分配到中心时也使用平方欧几里德,那么该方法将可靠地工作和收敛。
这使得严格的限制了k-means可以使用的距离(Bregman散度)。对于其他距离,存在例如PAM(在medoids周围分区),其中medoid是与所有其他集群成员具有最小距离(使用任何度量)的对象。您可以通过用medoid替换均值来将medoid概念转换为k-means。然后你得到k-medoids。