【问题标题】:Calculate condensed distance matrix with varying length data points计算具有不同长度数据点的压缩距离矩阵
【发布时间】:2021-08-07 02:11:12
【问题描述】:

Scipy 的 pdist 函数需要一个形状均匀的 numpy 数组作为输入。

工作示例:

from scipy.spatial.distance import pdist
from scipy.spatial.distance import squareform

#Example distance function.
def dfun(u, v):
    return u.sum() + v.sum()

dat0 = np.array([-1, 1,-3, 1])
dat1 = np.array([-1, 1,-3, 1])
dat2 = np.array([ 1, 1, 1, 1])

data = np.array([dat0, dat1, dat2])
distance_matrix = pdist(data, dfun)
squareform(distance_matrix)

我有一个自定义距离函数,它适用于游程编码数据,因此数组的大小可能会有所不同。使用以下输入时

dat0 = np.array([-1, 1,-4, 1])
dat1 = np.array([-1, 1,-3, 1, 1])
dat2 = np.array([ 1,-6])

即使距离函数可以很好地处理输入,也会引发值错误ValueError: A 2-dimensional array must be passed.。是否存在计算这些值的替代方法?

编辑:上述 sn-p 中的距离函数只是一个度量标准的示例,它不关心数据点内的实际元素数量。在我的例子中,https://github.com/mclmza/AWarp 用于计算稀疏数据集示例系列的 dtw:[1,-456,1,1,-23,1],因此填充数据不是一个有效的选项。

【问题讨论】:

  • Numpy 函数适用于 ND 数组。不支持可变大小的数组集。
  • 你所说的距离矩阵是什么?你能澄清和详细说明吗?
  • 我想得到一个由 pdist 返回的压缩距离矩阵,它可以用作 scipy.cluster.hierarchy.linkage 方法的输入。这个压缩距离矩阵是一个平面有序列表,计算了 n 个观测值之间的成对距离

标签: python numpy scipy


【解决方案1】:

如果我理解正确,您想使用awarp 计算距离,但该距离函数需要不同长度的信号。所以你需要避免创建一个数组,因为 NumPy 不允许“参差不齐”的数组。那么我认为你可以这样做:

from itertools import combinations
from scipy.spatial.distance import squareform

# Example distance function.
def dfun(u, v):
    return u.sum() + v.sum()

dat0 = np.array([-1, 1,-4, 1])
dat1 = np.array([-1, 1,-3, 1, 1])
dat2 = np.array([ 1,-6])
data = [dat0, dat1, dat2]

dists = [dfun(a, b) for a, b in combinations(data, r=2)]
squareform(dists)

对于您的示例,这会产生:

array([[ 0, -4, -8],
       [-4,  0, -6],
       [-8, -6,  0]])

如果dfun = awarp 那么你会得到这些信号的输出:

array([[ 0.        ,  0.        ,  2.23606798],
       [ 0.        ,  0.        ,  2.44948974],
       [ 2.23606798,  2.44948974,  0.        ]])

我想这种方法只有在 dfun 是可交换的情况下才有效,我认为 awarp 是。

【讨论】:

  • 我的问题中的距离函数只是一个例子。实际上它使用的是 awarp.awarp,它不能通过插入零来填充而不增加复杂性github.com/mclmza/AWarp。我编辑了问题以反映这一事实
  • 好的,我现在明白了......我相应地更新了我的答案。感谢您提及awarp,它看起来很有趣。
  • 如果您有兴趣,我在几分钟前发布了对 awarp python 版本的一些细微调整。 github.com/KilianB/AWarp您的回答看起来很合理。我今天完成了,但明天会尝试并接受你的答案,如果它有效。 :)。谢谢,周末愉快。
猜你喜欢
  • 2011-08-08
  • 2016-08-15
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 2018-12-02
  • 2012-10-16
相关资源
最近更新 更多