KNN - 三角不等式优化

时间:2017-01-07 04:57:09

标签: knn

我不完全理解三角不等式如何用于优化KNN分类中的距离计算。

我编写了一个python脚本,参考下面提到的步骤

  1. 计算每个训练像素与另一个训练像素之间的距离。
  2. 对于每个测试样品
    • 计算第一个训练样本的距离为dn。这将是当前的最小距离。
    • 计算第二个训练样本(p)的距离为dp。
    • 如果dp< dn assign dn = dp
    • 每个剩余的训练样本(c)
      • 如果以dcp测量的样品c和样品p之间的距离满足          
        dp-dn< dcp< dp + dn
        计算从测试样品到样品c的距离为dp     
        如果dp< dn,assign:dn = dp
      • 否则,请跳过此培训样本。
  3. 如果没有更多培训样本,请停止
  4. n所属的类是估计值。
  5. Python脚本:

    def get_distance(p1 = (0, 0), p2 = (0, 0)):
        return abs(p1[0] - p2[0]) + abs(p1[1] - p2[1])
    
    
    def algorithm(train_set, new_point):
        d_n = get_distance(new_point, train_set[0])
        d_p = get_distance(new_point, train_set[1])
        min_index = 0
    
        if d_p < d_n:
            d_n = d_p
            min_index = 1
    
        for c in range(2, len(train_set)):
            dcp = get_distance(train_set[min_index], train_set[c])
    
            if d_p - d_n < dcp < d_p + d_n:
                d_p = get_distance(new_point, train_set[c])
    
                if d_p < d_n:
                    d_n = d_p
                    min_index = c
    
        print(train_set[min_index], d_n)
    
    
    train_set = [
        (0, 1, 'A'),
        (1, 1, 'A'),
        (2, 5, 'B'),
        (1, 8, 'A'),
        (5, 3, 'C'),
        (4, 2, 'C'),
        (3, 2, 'A'),
        (1, 7, 'B'),
        (4, 8, 'B'),
        (4, 0, 'A'),
    ]
    
    for new_point in train_set:
        # Checking the distances from the points within training set iteself: min distance = 0, used for validation
        result_point = min(train_set, key = lambda x : get_distance(x, new_point))
        print(result_point, get_distance(result_point, new_point))
    
        algorithm(train_set, new_point)
        print('----------')
    

    但它没有给出1点所需的结果。

    我对优化的理解是错误的吗?

    提前感谢您的帮助。

0 个答案:

没有答案