在做毕业设计的时候,遇到这样一个需求:
给定一万五千个点,再给定一个目标点,要求离目标点的最近点,说白了就是求“最近邻”问题
传统的方式,就是从第一个点开始算距离,把一万五千个点都算完,再取最小值
但是这样的方式比较慢,所以利用了knn算法中的kd树进行搜索
kd树的原理在李航的《机器学习》书籍中有详细的介绍,包括kd树的构建和kd树的搜索,但是李航的书里面只有kd树搜索最近邻
关于原理性的东西网上有很多资料,在此就不再累赘了
但是我想探究的是,究竟kd树搜索,跟传统线性搜索相比,能够快多少,所以我就写代码验证了
import numpy as np
import time
import random
from sklearn.neighbors import NearestNeighbors
import matplotlib.pyplot as plt
N = 100000
k = 1
method1_time = []
method2_time = []
print("N=", N)
print("k=", k)
for time_i in range(3):
X = [[np.random.random() * 100 for _ in range(2)] for _ in range(N)]
target = [[np.random.random() * 100 for _ in range(2)] for _ in range(k)]
X = np.array(X)
target = np.array(tar