矩阵距离矩阵

时间:2019-02-08 14:14:45

标签: python pandas numpy

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

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

enter image description here

这意味着最终我需要一个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

2 个答案:

答案 0 :(得分:2)

您可能想看看scipy.spatial.distance.pdistdocs

示例:

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.        ]])

答案 1 :(得分:1)

关于矩阵的Frobenius范数与对应的平坦向量上的传统2范数相同-因此,您似乎可以将每个N*3矩阵平坦成3N*1向量,导致总体上形成3N*10个数组,其中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)