scipy.spatial.distance.pdist
返回压缩距离矩阵。来自the documentation:
Returns a condensed distance matrix Y. For each and (where ), the metric dist(u=X[i], v=X[j]) is computed and stored in entry ij.
我以为ij
是指i*j
。但我想我可能错了。考虑
X = array([[1,2], [1,2], [3,4]])
dist_matrix = pdist(X)
然后文件上说dist(X[0], X[2])
应该是dist_matrix[0*2]
。但是,dist_matrix[0*2]
是0——而不是应该是2.8。
给定i
和j
,我应该使用什么公式来访问两个向量的相似性?
你可以这样看:假设
x
是m乘n。一次选择两个m
行的可能对是itertools.combinations(range(m), 2)
,例如,对于m=3
:因此,如果
d = pdist(x)
,combinations(range(m), 2))
中的第k
元组给出与d[k]
相关联的x
行的索引。示例:
第一个元素是
dist(x[0], x[1])
,第二个是dist(x[0], x[2])
,第三个是dist(x[1], x[2])
。或者可以将其视为平方距离矩阵的上三角部分中的元素,并串成一维数组。
例如
压缩矩阵的向量对应于平方矩阵的下三角区域。若要转换该三角形区域中的某个点,需要计算三角形中左侧的点数和列中上方的点数。
可以使用以下函数进行转换:
检查:
压缩距离矩阵到全距离矩阵
pdist返回的压缩距离矩阵可以通过使用
scipy.spatial.distance.squareform
转换为全距离矩阵:使用
squareform
转换为完整矩阵:点i,j之间的距离存储在dist[i,j]中:
指数到凝聚指数
可以将用于访问平方矩阵元素的索引转换为压缩矩阵中的索引:
示例:
索引的压缩索引
另外,如果没有sqaureform(在运行时和内存消耗方面更好),另一个方向也是可能的:
示例:
运行时与squareform的比较
创建sqaureform的过程非常缓慢:
如果我们用最大距离搜索两点,在全矩阵中搜索是O(n),而在压缩形式中搜索只有O(n/2),这并不奇怪:
在这两种情况下,获取两点的最小值几乎不需要时间,但计算压缩索引当然会有一些开销:
相关问题 更多 >
编程相关推荐