分层聚类预先计算的距离的成对距离矩阵

时间:2015-06-27 05:12:01

标签: python pandas scipy cluster-analysis hierarchical-clustering

我有一个与熊猫一起制作的成对距离数据框:

#Get files
import glob
import itertools
one_dimension = glob.glob('*.pdb')

dataframe = []
for combo in itertools.combinations(one_dimension,2):
    pdb_1 = combo[0]
    pdb_2 = combo[1]
    entry = { 'pdb_1' : pdb_1, 'pdb_2', 'rmsd': get_rmsd(pdb_1,pdb_2)
    dataframe.append(entry)

import pandas
dataframe = Dataframe(dataframe)
dataframe

enter image description here

我想要做的就是以一种方式对数据帧进行聚类,其中所有聚类都包含小于某些截止值的pdbs(比方说小于2)。我已经读到完全联系是要走的路。

例如:

  1. pdb_1,pdb_2的rmsd为1.56
  2. pdb_3,pdb_2有一个rmsd 1.03
  3. pdb_2,pdb_1的rmsd为1.60
  4. 所以他们都可以一起出现在一个集群中。但是,如果有任何新的pdb尝试添加到群集中,如果它是> 2对于已在群集中的任何成员,它将被拒绝。

    据我所知,这是与截止点的完全联系。

    我已经调查了scipy.cluster.hierarchy.linkage,但是我很难格式化数组以进入链接。

    • 完成此任务的最佳方法是什么?

    • 如何从我的数据框架转到可以使用的东西 scipy.cluster?

    • 我应该把它变成R数据帧吗?

    • 如果我转换了,我如何找出群集中的成员 成对距离到阵列。

    我发现thisthisthis问题类似,并发现this tutorial

    更新

    根据cel的回答,我可以得到以下结果:

    >>df
    

    enter image description here

    然后转动

     pivot_table = df.pivot('pdb_1','pdb_2','rmsd').fillna(0)
     >>pivot_table
    

    enter image description here

    然后是数据数组

    piv_arr = pivot_table.as_matrix()
    dist_mat = piv_arr + np.transpose(piv_arr)
    >>dist_mat
    

    enter image description here

    但是,我无法制作方格,因为诊断不等于0 ...

    >>>squareform(dist_mat)
    

    enter image description here

    并且可以验证

    >>dist_mat.diagonal()
    

    enter image description here

1 个答案:

答案 0 :(得分:1)

这可能对您有用:

这些是我们需要的进口产品:

import scipy.cluster.hierarchy as hcl
from scipy.spatial.distance import squareform
import pandas as pd
import numpy as np

假设我们已经计算了距离矩阵,并决定以这种格式存储距离矩阵的上三角部分:

data = pd.DataFrame({
    "a": ["a1", "a1", "a2", "a3", "a2", "a1"],
    "b": ["a2", "a3", "a3", "a3", "a2", "a1"],
    "distance": [1,2,3, 0, 0, 0]
})

所以这是我们的数据框:

a   b   distance
0   a1  a2  1
1   a1  a3  2
2   a2  a3  3
3   a3  a3  0
4   a2  a2  0
5   a1  a1  0

使用DataFrame.pivot,我们可以将数据帧转换为方形距离矩阵:

data_piv = data.pivot("a", "b", "distance").fillna(0)
piv_arr = data_piv.as_matrix()
dist_mat = piv_arr + np.transpose(piv_arr)

这将给我们:

array([[ 0.,  1.,  2.],
       [ 1.,  0.,  3.],
       [ 2.,  3.,  0.]])

我们可以通过squareform转换为压缩距离矩阵并输入到链接算法中:

hcl.linkage(squareform(dist_mat))

这为我们提供了以下链接矩阵:

array([[ 0.,  1.,  1.,  2.],
       [ 2.,  3.,  2.,  3.]])