我试图为K近邻算法找到两个图像之间的欧几里得距离。然而,在探索一些距离函数时,我面临着这种差异。
norm1 = np.sqrt(np.sum(np.square(image1-image2))))
norm2 = np.linalg.norm(image1-image2)
这两条线似乎给出了不同的结果。在用简单的3DNumpy数组尝试同样的东西时,我似乎得到了相同的结果,但对于我的图像,答案是不同的。我不确定哪一个是正确的,所以欢迎任何帮助,提前感谢!
事实上,在您的案例中,两者给出了不同的结果,而方法在数学上是相等的。这是因为image1
和image2
可能属于uint8
类型,并且np.square
不会将结果强制转换为更大的类型。这意味着使用np.square
只会因为溢出而产生错误结果。事实上,减法已经给出了错误的结果。。。您需要将输入强制转换为更大的类型,以避免溢出。这里有一个例子:
norm1 = np.sqrt(np.sum(np.square(image1.astype(np.int32)-image2.astype(np.int32))))
norm2 = np.linalg.norm(image1.astype(np.int32)-image2.astype(np.int32))
这样,您应该会得到几乎相同的结果(可能有几个ULP的差异,在这里应该可以忽略不计(。
请注意,与np.sqrt
+np.sum
+np.square
相比,np.linalg.norm
可能会明显快,因为它不应该创建临时阵列。