汉明距离蟒蛇改善

时间:2017-04-03 12:52:20

标签: python xor

我正在尝试写汉明距离 作为输入,我有两个矩阵M1和M2,一个是40x20,第二个是50x20;它们包含真/假。我需要计算每行之间的距离,因此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)有一些想法,它给出了正确的矩阵形状,并且在一步中求和,但是当需要乘以和求和时,x: 1 * 1 = 1(需要0 - 不好)
1 * 0 = 0(需要1 - 不好)
0 * 1 = 0(需要1 - 不好)
0 * 0 = 0(需要0 - 可以)
你知道我怎样才能得到理想的结果?我想我会错过一些数学来正确而快速地做到这一点。 提前谢谢。

1 个答案:

答案 0 :(得分:1)

对于布尔逻辑,

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

要对其进行编码,您需要注意在点之前抛弃逻辑,以便计算总和。如果你点在2个逻辑阵列上,你就不会得到你想要的结果。我只使用-1作为我的非运算符( True - 1 = 0, False - 1 = -1)。此外,'或'实际上是一个总和,因为你正在考虑多个bool。最后,你最终得到了负面的距离,很容易用绝对的方式来解决。

_A = [[ True,  True,  False],
      [ True,  False, True]]

_B = [[ True,  False, False],
      [ False, False, False],
      [ True,  True,  True ]]

预期产量:     [[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]])