我试图为K-最近邻算法找到两幅图像之间的欧几里德距离。然而,在探索一些距离函数时,我面临着这种差异。
norm1 = np.sqrt(np.sum(np.square(image1-image2))))
norm2 = np.linalg.norm(image1-image2)这两条线似乎给出了不同的结果。用简单的3D Numpy数组做同样的尝试,我似乎得到了相同的结果,但是对于我的图像,答案是不同的。我不知道哪一个是正确的使用,所以,任何帮助都欢迎,谢谢提前!
发布于 2022-02-19 17:27:08
实际上,这两种方法给出了不同的结果--在您的情况下--,而方法在数学上是相等的。这是因为image1和image2的类型很可能是uint8,而没有将结果转换为更大的类型。这意味着使用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很可能大大加快了,因为它不应该创建临时数组。
https://stackoverflow.com/questions/71186765
复制相似问题