我试图创建Jaccard距离矩阵并在其上执行K-means以给出群集ID和群集中的元素ID。它的输入是twitter推文。以下是代码,我无法理解如何使用文件中的初始种子进行kmeans。
install.packages("rjson" ,dependencies=TRUE)
library("rjson")
install.packages("jsonlite" ,dependencies=TRUE)
library("jsonlite")
install.packages("stringdist" ,dependencies=TRUE)
library("stringdist")
data <- fromJSON(sprintf("[%s]", paste(readLines(file("C:\\Users\\Yuzuru Onathoshi\\Desktop\\Assignment5_pxv142730_sxl162530\\Part2\\Input\\Tweets.json")),collapse=",")))
t.feature <- data
t.feature$geo<-NULL
Jmatrix<-stringdistmatrix(t.feature$text,t.feature$text,method = "jaccard")
colnames(Jmatrix) <- t.feature$from_user_id
rownames(Jmatrix) <- t.feature$from_user_id
fit <- kmeans(Jmatrix, 10)
答案 0 :(得分:0)
k-means 不使用距离矩阵。
这很容易看出:它不适用于成对距离,但它只需要一个点与 center 的偏差(通常不是数据集的一个点)。
它期望连续的数字输入数据用于聚类,并且不支持任意距离函数。
k-means的核心思想是最小化方差(这与最小化平方欧几里德距离相同)。与一些教程甚至教科书相反,k-means实际上不最小化距离(如果你的距离是欧几里得,它最小化平方距离;但这可能是一个不同的最小值比最小距离最小)。如果你想让k-means最小化另一个距离,你必须找到一个合适的&#34;意思&#34;,即估算最小距离中心点的函数。已经提出了一些通用替代品,例如PAM。
如果你将Jaccard距离矩阵输出为k-means,它通常会产生一些有用的结果,但它并不是你所期望的。而不是通过Jaccard比较点,而是,你通过他们的距离向量的欧几里德方法将它们聚类。很容易看出,如果点与所有其他点(包括它们自己)具有相同的Jaccard距离,则该值为0,因此特别是它们的Jaccard距离必须为0.但是如果您的数据集是不平衡的(有一些在这个双重空间中,它们也会有太多的重量。
如果您需要其他距离(并且能够计算距离矩阵),请使用层次聚类(HAC)而不是k均值!