我正在尝试写汉明距离 作为输入,我有两个矩阵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 - 可以)
你知道我怎样才能得到理想的结果?我想我会错过一些数学来正确而快速地做到这一点。
提前谢谢。
答案 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]])