我打算将orange用于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, ... ]
谢谢!
答案 0 :(得分:2)
一个问题中的四个问题非常尴尬 - 为什么不提出一个问题呢?这不像是要花费你;-)。无论如何,wrt“如何指示一个空值?”,请参阅the docs关于value
实例的属性Orange.Value
:
如果值是连续的或未知的,则不 描述符是必需的。对于后者, 结果是字符串'?','〜'或'。' 对于不知道,不关心和其他, 分别
我不确定你是否意味着“不知道”或“不关心”,但无论如何你都可以指出。但要注意距离 - 从the docs中的其他页面开始:
正确处理未知值 只有欧几里德和救济距离。 对于其他距离测量,a 未知和已知或之间的距离 总是在两个未知值之间 0.5。
后一页中列出的距离是Hamming,Maximal,Manhattan,Euclidean和Relief(后者就像曼哈顿,但正确处理未知值) - 没有提供余弦距离:你必须自己编码。
对于(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)
答案 1 :(得分:0)
我认为原始的KMeans不适合余弦距离。因为它不在欧几里得空间,你需要定义余弦距离的质心,你不能保证收敛。但是如果你的特征向量都是正数,你可以试试。更多信息:Add API for user defined distance function in k-means