在Python中计算加权的成对距离矩阵

rob*_*anf 8 python numpy matrix scipy scikit-learn

我试图找到在Python中执行以下成对距离计算的最快方法.我想使用距离来排列a list_of_objects的相似性.

其中的每个项目的list_of_objects特征在于四个测量a,b,c,d,它们是在非常不同的尺度上制作的,例如:

object_1 = [0.2, 4.5, 198, 0.003]
object_2 = [0.3, 2.0, 999, 0.001]
object_3 = [0.1, 9.2, 321, 0.023]
list_of_objects = [object_1, object_2, object_3]
Run Code Online (Sandbox Code Playgroud)

目的是获得物体的成对距离矩阵list_of_objects.但是,我希望能够通过每个测量一个权重的权重向量来指定距离计算中每个度量的"相对重要性",例如:

weights = [1, 1, 1, 1]
Run Code Online (Sandbox Code Playgroud)

表示所有测量值均等加权.在这种情况下,无论测量范围如何,我都希望每个测量对物体之间的距离做出相同的贡献.或者:

weights = [1, 1, 1, 10]
Run Code Online (Sandbox Code Playgroud)

表明我希望测量d比其他测量值对物体之间的距离贡献10倍.

我当前的算法如下所示:

  1. 计算每次测量的成对距离矩阵
  2. 标准化每个距离矩阵,使最大值为1
  3. 将每个距离矩阵乘以适当的权重 weights
  4. 对距离矩阵求和以生成单个成对矩阵
  5. 使用4中的矩阵提供对象对的排序列表 list_of_objects

这很好,并给我一个加权版本的对象之间的城市块距离.

我有两个问题:

  1. 在不改变算法的情况下,SciPy,NumPy或SciKit-Learn中执行初始距离矩阵计算的最快实现是什么.

  2. 是否存在一种现有的多维距离方法,可以为我完成所有这些工作?

对于问题2,我看过,但找不到任何内置步骤,以我想要的方式做出"相对重要性".

欢迎其他建议.很高兴澄清我是否错过了细节.

Tho*_*anz 10

scipy.spatial.distance是你想要看的模块.它有很多不同的规范,可以很容易地应用.

我建议使用加权的Monkowski Metrik

加权的Minkowski Metrik

您可以使用pdist此包中的方法进行成对距离计算.

例如

import numpy as np
from scipy.spatial.distance import pdist, wminkowski, squareform

object_1 = [0.2, 4.5, 198, 0.003]
object_2 = [0.3, 2.0, 999, 0.001]
object_3 = [0.1, 9.2, 321, 0.023]
list_of_objects = [object_1, object_2, object_3]

# make a 4x3 matrix from list of objects
X = np.array(list_of_objects)

#calculate pairwise distances, using weighted Minkowski norm
distances = pdist(X,wminkowski,2, [1,1,1,10])

#make a square matrix from result
distances_as_2d_matrix = squareform(distances)

print distances
print distances_as_2d_matrix
Run Code Online (Sandbox Code Playgroud)

这将打印

[ 801.00390786  123.0899671   678.0382942 ]
[[   0.          801.00390786  123.0899671 ]
 [ 801.00390786    0.          678.0382942 ]
 [ 123.0899671   678.0382942     0.        ]]
Run Code Online (Sandbox Code Playgroud)

  • `wminkowski` 已被废弃:在最近的 Scipy 版本中它只是 `minkowski` (2认同)