我正在使用模块hcluster从距离矩阵计算树形图。我的距离矩阵是一个如下生成的数组数组:
import hcluster
import numpy as np
mols = (..a list of molecules)
distMatrix = np.zeros((10, 10))
for i in range(0,10):
for j in range(0,10):
sim = OETanimoto(mols[i],mols[j]) # a function to calculate similarity between molecules
distMatrix[i][j] = 1 - sim
然后我使用命令distVec = hcluster.squareform(distMatrix)
将矩阵转换为压缩矢量,并使用vecLink = hcluster.linkage(distVec)
计算链接矩阵。
所有这一切都运行正常,但如果我使用距离矩阵而不是精简矢量matLink = hcluster.linkage(distMatrix)
来计算链接矩阵,我会得到一个不同的链接矩阵(节点之间的距离要大得多,拓扑结构略有不同)
现在我不确定这是否是因为hcluster只适用于压缩向量,或者我是否在那里犯错误。
感谢您的帮助!
答案 0 :(得分:2)
我敲了一个类似于你的快速随机例子并遇到了同样的问题。 在文档字符串中它确实说:
执行分层/凝聚聚类
浓缩距离矩阵y。 y必须是:数学:{n \choose 2}
大小
向量,其中n是配对的原始观测数
在距离矩阵中。
但是,快速查看代码后,似乎意图是使用矢量形状和矩阵形状的代码: 在hierachy.py中,有一个基于矩阵形状的开关。 然而,似乎信息的关键位在函数链接的docstring中:
- Q : ndarray
A condensed or redundant distance matrix. A condensed
distance matrix is a flat array containing the upper
triangular of the distance matrix. This is the form that
``pdist`` returns. Alternatively, a collection of
:math:`m` observation vectors in n dimensions may be passed as
a :math:`m` by :math:`n` array.
所以我认为界面不允许传递距离矩阵。
相反,它认为你在n维度上传递m
观察向量。
因此结果有差异吗?
这看起来合理吗?
其他只是看看代码本身我相信你能够调试它并找出你的例子不同的原因。
干杯 马特