Python KMeans 橙色框架

1 投票
2 回答
2027 浏览
提问于 2025-04-15 18:59

我打算使用orange来进行k均值聚类。我看过一些教程,但还有几个问题想问:

我正在处理高维向量的聚类。

1) 有没有实现余弦距离的功能?

2) 我不想给空值填零。我尝试在空字段中不填零,但出现了这个错误:

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

我该如何表示一个空值?

3) 有没有办法在示例表中加入一个“ID”?我想用ID来标记我的数据(不是分类),这样方便参考。我不希望ID列成为我数据的正式部分。

4) 有没有办法以不同的方式输出k均值聚类的结果?我更希望结果是这个格式:

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

谢谢!

2 个回答

0

我觉得原版的KMeans算法不太适合用来计算余弦距离。因为余弦距离不是在欧几里得空间里,你需要定义一个余弦距离的中心点,而且你不能保证算法一定会收敛。不过,如果你的特征向量都是正数的话,你可以试试看。更多信息可以参考这个链接:为KMeans添加用户自定义距离函数的API

3

在一个问题里问四个问题实在是太尴尬了——为什么不把问题简化成一个呢?这样做也不会有什么损失;-)。不过,关于“我怎么表示一个空值?”这个问题,可以看看文档中关于Orange.Value实例的value属性的说明:

如果值是连续的或未知的,就不需要描述符。对于未知的情况,结果会是字符串'?'、'~'或'.',分别表示不知道、不在乎和其他。

我不太确定你说的“空”是指“不知道”还是“不在乎”,不过无论如何你都可以表示这两种情况。不过要注意距离的问题——在文档的另一页中提到:

未知值只有在使用欧几里得距离和Relief距离时才能正确处理。对于其他距离度量,未知值和已知值之间,或者两个未知值之间的距离总是0.5。

在后面这页中列出的距离有汉明距离、最大距离、曼哈顿距离、欧几里得距离和Relief距离(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)

撰写回答