Python获取集群数据 - 分层集群

时间:2014-05-25 13:55:07

标签: python cluster-analysis hierarchical-clustering dendrogram

我使用以下python脚本进行分层聚类并打印树形图。请考虑我是数据挖掘的新手。

import numpy as np
import distance
import scipy.cluster.hierarchy
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage

mat = np.array([[ 0. , 1. , 3.  ,0. ,2.  ,3.  ,1.],
 [ 1. , 0. , 3. , 1.,  1. , 2. , 2.],
 [ 3.,  3. , 0.,  3. , 3.,  3. , 4.],
 [ 0. , 1. , 3.,  0. , 2. , 3.,  1.],
 [ 2. , 1.,  3. , 2.,  0. , 1.,  3.],
 [ 3. , 2.,  3. , 3. , 1. , 0. , 3.],
 [ 1. , 2.,  4. , 1. , 3.,  3. , 0.]])

linkage_matrix = linkage(mat, "single")

dendrogram(linkage_matrix,
           color_threshold=1,
           truncate_mode='lastp',
           distance_sort='ascending')

plt.show()

以下是我得到的树形图。我需要打印群集和属于每个群集的数据吗?

cluster1 4,5
cluster2 ..,..
cluster3 ..,..

enter image description here

1 个答案:

答案 0 :(得分:2)

根据scipy.cluster.hierarchy文档

  

(通过运行链接...)返回4乘(n-1)矩阵Z.在第i次迭代中,具有索引Z [i,0]和Z [i,1]的聚类被组合以形成聚类n + i。索引小于n的聚类对应于n个原始观察中的一个。簇Z [i,0]和Z [i,1]之间的距离由Z [i,2]给出。第四个值Z [i,3]表示新形成的簇中的原始观察的数量。

这意味着,我们可以迭代linkage_matrix并找到组合的实际节点以形成新的集群。这是一个小的for循环

n = len(mat)
cluster_dict = dict()
for i in range(0, 6):
    new_cluster_id = n+i
    old_cluster_id_0 = linkage_matrix[i, 0]
    old_cluster_id_1 = linkage_matrix[i, 1]
    combined_ids = list()
    if old_cluster_id_0 in cluster_dict:
        combined_ids += cluster_dict[old_cluster_id_0]
        del cluster_dict[old_cluster_id_0]
    else:
        combined_ids += [old_cluster_id_0]
    if old_cluster_id_1 in cluster_dict:
        combined_ids += cluster_dict[old_cluster_id_1]
        del cluster_dict[old_cluster_id_1]
    else:
        combined_ids += [old_cluster_id_1]
    cluster_dict[new_cluster_id] = combined_ids
    print cluster_dict

代码为该群集中包含的节点创建一个群集ID字典。在每次迭代中,它将linakge_matrix[i, 0]linkage_matrix[i, 1]中的两个节点组合到一个新节点中。最后,它在每次迭代中打印正在运行的集群。输出是

{7: [0.0, 3.0]}
{8: [4.0, 5.0], 7: [0.0, 3.0]}
{8: [4.0, 5.0], 9: [6.0, 0.0, 3.0]}
{8: [4.0, 5.0], 10: [1.0, 6.0, 0.0, 3.0]}
{11: [4.0, 5.0, 1.0, 6.0, 0.0, 3.0]}
{12: [2.0, 4.0, 5.0, 1.0, 6.0, 0.0, 3.0]}

(群集ID以7开头,原始行的索引为0到6)。请注意,不在字典中的ID形成自己的集群。例如,行2.0在迭代2中形成自己的集群。您可以根据停止条件提前停止来获取最终的集群集。

我可以在迭代3,(输出的第3行)停止,然后我的群集将是:

cluster 8: {4, 5}
cluster 9: {6, 0, 3}
cluster 1: {1}
cluster 2: {2}