我试图找到类似对象的集群。我为每个对象到对象的比较计算了一个值,并创建了一个形式的矩阵:
header = [1, 2, 3, 4, 5]
matrix = [[0, 100, 0, 0, 0]
[100, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]]
我将矩阵传递给sklearn Affinity Propagation模块:
matrix = np.array(matrix)
cluster = AffinityPropagation(preference="precomputed")
cls = cluster.fit_predict(matrix)
在给出的示例中,我希望将1和2聚类,因为1-2 / 2-1是100,所有其他值都是零。但是cls数组并没有反映出这一点:
cls = [0 0 0 0 1]
表示1,2,3和4是一个群集,5是单独的群集。
我尝试通过右上角三角矩阵,改变值的大小(即0-1副0-100)等,并且没有按预期聚类。
关于我缺少什么的想法?
ADDITIONAL INFO 10/24/2014:
我正在对我的对象进行成对比较,并从中生成一个数字,表示每个对象与其他对象的关系。许多这些对象根本不相关,因此它们会产生“0”值。
这将创建一个稀疏的n乘n矩阵,其中n大约为10到100个对象。
从视觉上来说,对这些对象进行“聚类”以进行进一步分析是微不足道的。在下面的情况中,1涉及2,而2涉及3,但是1和3并不直接相关。我将继续使用1,2和3进行处理,并忽略4和5.(在我的实际数据中,我可能在单个矩阵中有多个有效的聚类)。
header = [1, 2, 3, 4, 5]
matrix = [[0, 100, 0, 0, 0]
[100, 0, 96, 0, 0]
[0, 96, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]]
我的研究表明亲和传播很擅长在稀疏矩阵中找到聚类,而且我的成对比较有效地产生了一个“预先计算的”亲和矩阵。
虽然很容易在视觉上找到这些集群,但我希望将其自动化,以便将其与之前和之后的代码集成。但是,正如原帖所示,我没有生成有意义的集群。
问题:
是否需要进行某种处理以从我描述的矩阵类型开始生成有意义的簇?
我是否忽略了一个步骤或以其他方式在算法中插入错误,使其无法找到我的群集?
我应该在这种数据上使用不同的聚类方法(DBSCAN,k-means等)吗?
答案 0 :(得分:1)
0不是魔术"不链接"值。
由于对象3和4的亲和力是相同到1,2或5,因此它们被分配到的位置并不重要;它们的质量大致相同。
1和2的强大凝聚力可能使得在那里分配3和4更为可取;并且生产不止一次的集群的愿望可能会使这5个集团保持独立。但它也可能只是随机的,对象3和4被分配给最佳亲和力的第一个样本(来自簇1,2);并且对象5仅保持分离以具有至少两个组件。
使用真实数据,而不是手工制作的亲和力。