我的目标是测量不同接口的测量之间的差异。我认为最好使用Frobenius Norm,即-对于2个矩阵A,B,范数定义为:
这意味着最终我需要一个10x10的矩阵距离对称的矩阵(对角线为零)。
我的数据集是一个CSV文件,具有约25K行和30列(10个接口* 3个传感器)。使用python(使用numpy
和pandas
)执行此计算的最佳方法是什么?我知道如何对列执行此操作(例如,使用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
答案 0 :(得分:2)
您可能想看看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. ]])
答案 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)