汉明距离Python改进

2024-04-19 13:17:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我在写汉明距离。
作为输入,我有两个矩阵M1和M2,一个是40x20,第二个是50x20;它们包含True/False。我需要计算每行之间的距离,所以M1[0]距离用M2[0],M1[0]用M2[1]。。。M1[39]和M2[49]。产生40x50结果矩阵。我的第一次尝试当然是这样循环:

for x_i in range(X.shape[0]):
        for x_train_j in range(X_train.shape[0]):
            distance_results[x_i, x_train_j] = sum(np.logical_xor(x_array[x_i, :], x_train_array[x_train_j, :]))

它是正确的,但是,它对我的数据来说太慢了。我有一些关于乘法M1.dot(M2.T)的想法,它给出了正确的矩阵形状,并且一步求和,但是当需要乘法和求和异或时:
1 * 1 = 1(需要0-坏)
1 * 0 = 0(需要1-坏)
0 * 1 = 0(需要1-坏)
0 * 0 = 0(需要0-可以)
你知道我怎样才能得到理想的结果吗?我想我错过了一些正确而快速的数学题。 提前谢谢。在


Tags: infalsetrue距离forrangetrain矩阵
1条回答
网友
1楼 · 发布于 2024-04-19 13:17:13

M1.dot(M2.T)在某种程度上可以看作是布尔逻辑的AND。对于二进制逻辑,A xor B相当于(A and not B) or (not A and B),因此您可以做一件事

M1.dot(M2.T):
1 * 1 = 1 
1 * 0 = 0 
0 * 1 = 0
0 * 0 = 0

(not M1).dot(M2.T):
0 * 1 = 0
0 * 0 = 0 
1 * 1 = 1
1 * 0 = 0

M1.dot(not M2.T):
1 * 0 = 0 
1 * 1 = 1
0 * 0 = 0
0 * 1 = 0

(not M1).dot(M2.T) or M1.dot(not M2.T):
0 * 1 || 1 * 0 = 0
0 * 0 || 1 * 1 = 1 
1 * 1 || 0 * 0 = 1
1 * 0 || 0 * 1 = 0

要对它进行编码,你需要注意在点之前去掉逻辑,这样就可以计算出和。如果你点在两个逻辑数组上,你不会得到你想要的结果。我只使用-1作为not运算符( True - 1 = 0, False - 1 = -1)。另外,这里的“或”实际上是一个总数,因为你在考虑多个酒精。最后你的距离是负数,很容易用绝对值来修正。在

^{pr2}$

预期产量: [[1,2,1], [1,2,1]]

A = numpy( _A, dtype=bool)
B = numpy( _B, dtype=bool)

numpy.absolute(numpy.dot(A,B.T-1) + numpy.dot(A-1, B.T))

>>>array([[1, 2, 1],
          [1, 2, 1]])

相关问题 更多 >