我已经实现了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
有没有更好的方法来执行距离计算?
答案 0 :(得分:1)
(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)欧几里得以外的距离定义可能对您的特定问题有意义。您可以尝试找到更简单,更快速的定义,例如一个简单的减法或绝对误差。
error = x-y
absolute_error = np.abs(x-y)
(4)在所有情况下,尝试并测量(配置文件)。在处理运行时性能优化时,不要依赖直觉。
P.S。上面的代码段不会完全映射到您的代码(故意)。由您来学习如何适应它们。提示:2D数组;)
答案 1 :(得分:0)
如果仅需要进行比较,您可以使用平方距离(只需删除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