np线性范数(a-b)和np.sqrt(np.sum(np.square(a-b))之间的区别



我试图为K近邻算法找到两个图像之间的欧几里得距离。然而,在探索一些距离函数时,我面临着这种差异。

norm1 = np.sqrt(np.sum(np.square(image1-image2))))
norm2 = np.linalg.norm(image1-image2)

这两条线似乎给出了不同的结果。在用简单的3DNumpy数组尝试同样的东西时,我似乎得到了相同的结果,但对于我的图像,答案是不同的。我不确定哪一个是正确的,所以欢迎任何帮助,提前感谢!

事实上,在您的案例中,两者给出了不同的结果,而方法在数学上是相等的。这是因为image1image2可能属于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可能会明显快,因为它不应该创建临时阵列

最新更新