2010-02-07 35 views
1

我打算为kmeans聚类使用orange。我已经阅读了教程,但我仍然有几个问题想要问:Python KMeans橙色框架

我正在处理高维向量上的聚类问题。 1)是否实现了余弦距离? 2)我不想给空值赋零。我试过在空字段中没有任何零,并且出现错误:

SystemError: 'orange.TabDelimExampleGenerator': the number of attribute types does not match the number of attributes 

如何指示空值? 3)有没有一种方法可以将“ID”合并到示例表中?我想用一个ID(不分类)标记我的数据以便于参考。我不会将ID列作为我的数据的官方部分。

4)kmeans聚类有没有办法输出不同的方法? 我更喜欢这种格式的东西:

cluster1: [ <id1>, <id2>, ...] 
cluster2: [ <id3>, ... ] 
rather than just [1, 2, 3,1 , 2, ... ] 

谢谢!

回答

2

在一个问题中的四个问题是非常尴尬的 - 为什么不提出问题的一个问题?这并不像它会花费你;-)。无论如何,WRT“我如何表明一个空值?”,见the docs关于Orange.Value实例的属性value

If value is continuous or unknown, no descriptor is needed. For the latter, the result is a string '?', '~' or '.' for don't know, don't care and other, respectively.

我不知道如果空你的意思是“不知道”或“唐不在乎“,但无论如何你可以指出。

Unknown values are treated correctly only by Euclidean and Relief distance. For other measure of distance, a distance between unknown and known or between two unknown values is always 0.5.

在后者的页面列出的距离是海明,最大,曼哈顿,欧几里德和救济(后者是像曼哈顿但正确的治疗:在the docs从这个其他网页 - 以关心的距离,但是未知值) - 没有提供余弦距离:你必须自己编码。

对于(4),只需要一点Python代码就可以以任何想要的方式格式化结果。一个KMEANS对象的.clusters属性是一个列表,恰好只要数据实例的数量:如果你想要的是数据实例的列表的列表,例如:

def loldikm(data, **k): 
    km = orange.KMeans(data, **k) 
    results = [[] for _ in km.centroids] 
    for i, d in zip(km.clusters, data): 
    results[i].append(d) 
0

我觉得原来的k均值为不适合余弦距离。对于它不在欧几里得空间中,您需要定义余弦距离的质心,并且不能保证收敛。但是如果你的特征向量都是正面的,你可以试试。更多信息:Add API for user defined distance function in k-means