在knn算法中计算距离而不是eucledian距离的替代有效方法

时间:2017-05-11 02:12:23

标签: python algorithm machine-learning classification knn

我已经实现了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

有没有更好的方法来执行距离计算?

2 个答案:

答案 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