[英]alternate efficient way to compute distance instead of eucledian distance in knn algorithm
我已经实现了knn算法,这是我计算欧几里得距离的函数。
def euc_dist(self, train, test):
return math.sqrt(((train[0] - test[0]) ** 2) + ((test[1] - train[1]) ** 2))
#
def euc_distance(self, test):
eu_dist = []
for i in range(len(test)):
distance = [self.euc_dist(self.X_train[j], test[i]) for j in range(len(self.X_train))]
eu_dist.insert(i, distance)
return eu_dist
有没有更好的有效方法来执行距离计算?
(1)Python循环非常慢。 学习使用数组计算,例如numpy :
import numpy as np
x = np.array(...)
y = np.array(...)
distances = np.sqrt(np.sum((x-y)**2))
批处理计算允许有效的矢量化甚至并行实现。
(2)如果不需要绝对距离值(例如,您仅比较它们的大小或取平均值或以某种方式归一化结果),则省略平方根运算,这会非常慢。 省略是可能的,因为sqrt是单调函数(即,省略它会保留总顺序)。
squared_distances = np.sum((x-y)**2)
(3)可能存在除Euclidian以外的距离定义,这对您的特定问题可能有意义。 您可以尝试找到更简单,更快速的定义,例如简单的减法或绝对错误。
error = x-y
absolute_error = np.abs(x-y)
(4)在所有情况下,请尝试测量(轮廓)。 在处理运行时性能优化时,不要依赖直觉。
上面的PS代码段未完全(故意)映射到您的代码。 您需要学习如何适应它们。 提示:2D数组;)
如果仅用于比较,则可以使用平方距离(只需删除math.sqrt
慢速操作)。
可能的优化-如果Python操作((train[0] - test[0]) ** 2
使用幂乘幂,则值得将其更改为简单乘法
def squared_euc_dist(self, train, test):
x = train[0] - test[0]
y = train[1] - test[1]
return x * x + y * y
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.