优化计算两幅图像之间的欧式距离的性能
Optimize performance for calculation of euclidean distance between two images
我在 python 中实现了 k 最近邻算法来对从 mnist 数据库中随机选取的一些图像进行分类。但是我发现我的距离函数非常慢:针对 10k 图像的训练集对 10 个测试图像进行分析大约需要 2 分钟。图像的分辨率为 28x28 像素。由于我是 python 的新手,我觉得这可能会更快。该函数应该计算两个相同大小的灰度图像之间的欧式距离。
def calculateDistance(image1, image2):
distance = 0
for i in range(len(image1)):
for j in range(len(image1)):
distance += math.pow((image1[i][j]-image2[i][j]),2)
distance = numpy.sqrt(distance)
return distance
1) 将两个图像之间的差异计算到一个临时变量中,然后将该变量乘以自身(整数运算)而不是执行 Math.pow,这是一个浮点运算
2)如果你只是比较距离,例如找到距离最小的一对,不要在最后打扰 sqrt'ing(这实际上不会加快速度,因为它不在循环中但仍然不需要你只使用结果进行相对比较)
如果您使用 numpy 数组来表示图像,则可以改用以下内容:
def calculateDistance(i1, i2):
return numpy.sum((i1-i2)**2)
这应该快得多,因为它使用快速的 C 实现来完成繁重的工作。还可以考虑使用缓存来避免两次计算两个图像的差异。
我在 python 中实现了 k 最近邻算法来对从 mnist 数据库中随机选取的一些图像进行分类。但是我发现我的距离函数非常慢:针对 10k 图像的训练集对 10 个测试图像进行分析大约需要 2 分钟。图像的分辨率为 28x28 像素。由于我是 python 的新手,我觉得这可能会更快。该函数应该计算两个相同大小的灰度图像之间的欧式距离。
def calculateDistance(image1, image2):
distance = 0
for i in range(len(image1)):
for j in range(len(image1)):
distance += math.pow((image1[i][j]-image2[i][j]),2)
distance = numpy.sqrt(distance)
return distance
1) 将两个图像之间的差异计算到一个临时变量中,然后将该变量乘以自身(整数运算)而不是执行 Math.pow,这是一个浮点运算 2)如果你只是比较距离,例如找到距离最小的一对,不要在最后打扰 sqrt'ing(这实际上不会加快速度,因为它不在循环中但仍然不需要你只使用结果进行相对比较)
如果您使用 numpy 数组来表示图像,则可以改用以下内容:
def calculateDistance(i1, i2):
return numpy.sum((i1-i2)**2)
这应该快得多,因为它使用快速的 C 实现来完成繁重的工作。还可以考虑使用缓存来避免两次计算两个图像的差异。