【问题标题】:Hierarchical clustering a pairwise distance matrix of precomputed distances分层聚类预先计算的距离的成对距离矩阵
【发布时间】:2015-09-14 03:05:12
【问题描述】:

我有一个用 pandas 制作的成对距离数据框:

#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

我要做的就是以这样一种方式对数据帧进行集群,其中所有集群都包含小于某个截止值(假设小于 2)的 pdb。我已经读过完整的链接是要走的路。

例如:

  1. pdb_1,pdb_2 的 rmsd 为 1.56
  2. pdb_3,pdb_2 的 rmsd 为 1.03
  3. pdb_2, pdb_1 的 rmsd 为 1.60

所以它们都可以一起出现在一个集群中。但是,如果任何新的 pdb 尝试添加到集群中,如果集群中的任何成员 > 2,它将被拒绝。

我知道这是一个完整的与截止的链接。

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

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

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

  • 我应该把它变成一个 R 数据框吗?

  • 如果我将 到数组的成对距离。

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

更新

根据cel的回答,我可以得到以下信息:

>>df

然后旋转

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

然后是数据数组

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

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

>>>squareform(dist_mat)

并且可以验证

>>dist_mat.diagonal()

【问题讨论】:

  • 不同层次聚类方法的输入是一个压缩距离矩阵。要根据您的观察结果创建这样的距离矩阵,您可能需要查看 pdist docs.scipy.org/doc/scipy-0.15.1/reference/generated/…)
  • 我的输入是预先计算的距离。我无法创建距离的距离

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


【解决方案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.]])

【讨论】:

  • 这看起来很棒!将在早上测试第一件事
  • 你能帮我解释一下最后的数组吗?我知道第一个和第二个数字是节点,第三个数字是节点之间的距离,最后一个数字是集群包含多少个成员。但这与原始数据框有什么关系
  • @jwillis0720,data_piv 的列标题和行标题将集群 id 的 1 到 n 链接到原始数据框指定的相应名称。
  • 几乎!获取正方形时遇到问题(请参阅更新)
  • @jwillis0720,嗯,你可能想找到非零的对角线索引,看看问题出在哪里。我只能猜测。请注意,您必须指定完整的上三角矩阵,否则旋转可能无法为您提供正确的距离矩阵。
猜你喜欢
  • 2020-10-23
  • 2016-08-21
  • 2016-04-09
  • 2019-01-11
  • 2018-08-05
  • 1970-01-01
  • 2020-01-23
  • 2014-10-24
相关资源
最近更新 更多