【问题标题】:Distance matrix of matrices矩阵的距离矩阵
【发布时间】:2019-02-08 14:14:44
【问题描述】:

我有一个数据集,其中包含 10 个接口的测量值(表示为 A、B、..、J)。每个接口有 3 个传感器 - 所以对于接口 A,我们将这些传感器表示为 A1、A2、A3。

我的目标是测量不同接口的测量值之间的差异。我认为最好使用Frobenius Norm,即——对于2个矩阵A、B,范数定义为:

这意味着最终我想要一个 10x10 对称矩阵,其矩阵距离(当然,对角线为零)。

我的数据集是一个 CSV 文件,包含约 25K 行和 30 列(10 个接口 * 3 个传感器)。使用 python (numpypandas) 执行此计算的最佳方法是什么?我知道如何为列做这件事(例如使用sklearn.metrics.pairwise.euclidean_distances),但我没有找到一种优雅的方法来增强它的矩阵。

编辑

我的数据集看起来如何的一个小例子(而不是行号有时间戳,并不是说它太重要了......):

     A1    A2    A3    ...    J1   J2   J3
1   3.2   12.9  -7.8  ...    5.5  11.2  -6.9
2   3.4   12.7  -8.0  ...    5.6  11.3  -7.9
3   3.2   12.9  -7.8  ...    5.6  11.4  -7.6

【问题讨论】:

  • 我不认为问“最好的方法”是有成效的。您对“足够好的解决方案”的限制是什么?内存复杂度,时间复杂度?
  • 只要不需要用永恒来计算——对我有好处(意思是,没有实际限制......)
  • 你能发布一个你的问题的最小例子吗?不是 25K 行,也许只有 6-9 列?
  • @AlexYu 我加了一个3行的例子

标签: python pandas numpy


【解决方案1】:

你可能想看看scipy.spatial.distance.pdist (docs)

例子:

df
>>     A1    A2   A3   J1    J2   J3  B1  B2  B3
1  3.2  12.9 -7.8  5.5  11.2 -6.9   3   1   2
2  3.4  12.7 -8.0  5.6  11.3 -7.9   3   1   2
3  3.2  12.9 -7.8  5.6  11.4 -7.6   3   1   2

from scipy.spatial import distance
groups = [['A1', 'A2', 'A3'], ['B1', 'B2', 'B3'], ['J1', 'J2', 'J3']]

# based on your formula, simply flatten the data to take element-wise distance
dist = distances(distance.pdist([df[group].values.flatten() for group in groups]))
dist
>> array([26.69138438,  4.88364618, 24.6462979 ])

# if you want matrix form
distance.squareform(dist)
>>array([[ 0.        , 26.69138438,  4.88364618],
   [26.69138438,  0.        , 24.6462979 ],
   [ 4.88364618, 24.6462979 ,  0.        ]])

【讨论】:

    【解决方案2】:

    矩阵的 Frobenius 范数与相应扁平向量上的传统 2 范数相同 - 所以看起来您可以将每个 N*3 矩阵扁平化为一个 3N*1 向量,从而得到一个 @ 987654323@ 数组整体,其中N 是您的行数?此时,您可以调用成对距离函数,例如您提到的与列一起使用的函数。

    N=200时如何在一行中做这个转换的例子:

    In [2]: x = np.empty((200,30))
    
    In [3]: y = x.T.reshape(10,-1).T
    
    In [4]: y.shape
    Out[4]: (600, 10)
    

    【讨论】: