2016-11-29 99 views
1

我正在尝试创建Jaccard距离矩阵并对其执行K-means以发出群集ID和群集中元素的ID。它的输入是Twitter推文。以下是代码,我无法理解如何使用kmeans的文件中的初始种子。使用jaccard距离矩阵的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) 

Jaccard Matrix Tweets Matrix

+0

你可以实现自己的kmeans与jaccard的距离,它不应该是困难的。 –

+0

@sandipan不正确。 k-means可能不会为其他距离收敛,除非您也用适当的函数替换平均值。 –

+0

// @ Anony-Mousse真的吗?这有什么理论上的结果吗?它背后的数学直觉是什么?如果不意味着我们可以使用k-medoid类似的函数。尽管与kmeans具有相同的优化功能(只改变了距离度量),但直觉上我不明白为什么它不会收敛。 - sandipan 5小时前 –

回答

0

k均值不不使用距离矩阵

这很容易看出:它不适用于成对距离,但它只需要一个点与中心(通常不是数据集的一个点)的偏差。

它期望连续的数值输入数据进行聚类,并且而不是支持任意距离函数。

k-means的核心思想是最小化方差(这与最小化平方欧几里德距离相同)。与一些教程甚至教科书相反,k-means其实并不是而是将距离最小化(如果距离是欧几里德距离,它最小化平方距离,但可能与最小距离最小值不同)。如果你想要k-means来最小化另一个距离,你必须找到一个合适的“均值”,即一个估计最小距离中心点的函数。已经提出了一些通用的替代品,例如PAM。

如果您将一个Jaccard距离矩阵转换为k-means,它通常会产生一些有用的结果,但这不是您所期望的。而不是由Jaccard比较点数,但是可以用它们的距离向量的平方欧几里德来聚类它们。很容易看出,如果点与所有其他人(包括他们自己)具有相同的Jaccard距离,则值为0,因此特别是他们的Jaccard距离必须为0.但是,如果数据集不平衡(有一些群集有很多对象),那么他们在这个双重空间中也会有太多的重量。

如果您需要其他距离(并且可以承担计算距离矩阵),请使用层次聚类(HAC)而不是k-means!

+0

但我必须使用Jaccard距离,这就是问题所在,并且我得到了一组初始质心,我不知道如何使用它们。我正在处理的确切问题是以下链接:http://www3.nd.edu/~dwang5/courses/spring15/assignments/A2/Assignment2_SocialSensing.html – harsha

+0

kmeans也为jaccard矩阵提供正确的聚类,我也有一个中心列表应该用作kmeans的中心,但仍然有25个作为簇的大小。323906397735641088, 323906483584655360, 323906657333682176, 323907258301939713, ,......, – harsha

+0

注意分配说“提示:请注意,微博不具备欧几里德空间的数字坐标,你可能想**想到的一种明智的方法来计算推文群集的“质心”。“ - 那么,你有什么“明智”的方式来获得集群中心? –