执行K的问题意味着群集

时间:2014-07-25 20:53:21

标签: python list numpy scipy k-means

我正在尝试使用K表示群集来从CSV文件中聚类以下数据。

Sample1,Sample2,45
Sample1,Sample3,69
Sample1,Sample4,12
Sample2,Sample2,46
Sample2,Sample1,78

它基本上是一个图表,其中Samples是节点,数字是边(权重)。

我读了如下文件:

fileopening = fopen('data.csv', 'rU')
reading = csv.reader(fileopening, delimiter=',')

L = list(reading)

我使用了这段代码:https://gist.github.com/betzerra/8744068

此处的群集基于以下内容构建:

num_points, dim, k, cutoff, lower, upper = 10, 2, 3, 0.5, 0, 200
points = map( lambda i: makeRandomPoint(dim, lower, upper), range(num_points) )
clusters = kmeans(points, k, cutoff)

for i,c in enumerate(clusters): 
    for p in c.points:
        print " Cluster: ",i,"\t Point :", p 

我用列表L替换了点。但是我遇到了很多错误:AttributeError, 'int' object has no attribute 'n'等等。

我需要根据我的CSV文件的第三个数字列(边缘)执行K表示聚类。本教程使用随机创建点。但我不确定,如何使用此CSV数据作为此k意味着功能的输入。如何对我的数据执行k表示(k = 2)?如何将CSV文件数据作为输入发送到此k均值函数?

2 个答案:

答案 0 :(得分:2)

简而言之,“你不能”。

答案很长: K-means仅为欧几里德空间定义,它需要有效的点位置,而你只有它们之间的距离,可能不是严格的数学意义,而是某种类型“相似性”。 K-means不适用于相似性矩阵。

你可以做什么?

  1. 您可以使用其他方法以这样的方式在欧几里德空间中嵌入您的点,以便它们密切重新定位您的距离,其中一个工具是多维缩放(MDS):http://en.wikipedia.org/wiki/Multidimensional_scaling
  2. 完成第1点后,您可以运行k-means
  3. 或者你也可以通过执行一些内核学习技术重新编码你的数据然后在生成的Gram矩阵上运行内核k-means来构造一个内核(在Mercer的意义上有效)。

答案 1 :(得分:1)

正如lejlot所说,只有点之间的距离不足以在经典意义上运行k-means。如果你了解k-means的本质,这很容易理解。在较高的层面上,k-means的工作原理如下:

1) Randomly assign points to cluster.
  (Technically, there are more sophisticated ways of initial  partitioning, 
  but that's not essential right now).

2) Compute centroids of the cluster. 
  (This is where you need the actual coordinates of the points.)

3) Reassign each point to a cluster with the closest centroid.

4) Repeat steps 2)-3) until stop condition is met.

因此,正如您所看到的,在经典解释中,k-means将无法工作,因为尚不清楚如何计算质心。但是,我对你能做些什么有几点建议。

建议1。

将您的点嵌入N维空间,其中N是点数,因此每个点的坐标是到所有其他点的距离。

例如您显示的数据:

Sample1,Sample2,45
Sample1,Sample3,69
Sample1,Sample4,12
Sample2,Sample2,46
Sample2,Sample1,78

变为:

Sample1: (0,45,69,12,...)
Sample2: (78,46,0,0,...)

然后你可以合法地使用欧几里德距离。请注意,点之间的实际距离不会被保留,但这可能是一个简单而合理的近似值,用于保持点之间的相对距离。另一个缺点是,如果你有很多积分,那么你的记忆(和运行时间)要求将是N ^ 2的顺序。

建议2。

尝试k-medoids而不是k-means。对于这个,你不需要点的实际坐标,因为你需要计算中心,而不是质心。群集的Medoid是来自此群集的点,whish与此群集中所有其他点的平均距离最小。您可以在线查找实施。或者它实际上很容易实现。运行时间也与N ^ 2成正比。

最后评论。

你为什么要使用k-means?好像你有一个加权有向图。有专门用于图形的聚类算法。这超出了你的问题的范围,但也许这是值得考虑的事情?