K近邻算法 算法解决的是:给定训练数据集,每一个数据已经贴好标签,对于新引入的测试数据,算法如何根据已有的训练集正确分类,因此该算法是一个懒惰学习的分类算法。
采用的策略也是多数表决法,即确定k值后,在训练数据中选出k个度量距离最近的数据,选择多数的数据类别给测试数据贴上标签。
度量距离推荐采用普遍性更强的Lp范数。
KD树的构造 构造二叉平衡树,采用分治法,在一次递归中,对数据进行某一维度上的排序(一般选取方差最大的一个维度),后选取中点作为pivot划分。
K近邻搜索 在二叉搜索的基础上加入了回溯算法,避免最优解在未搜索的子树。
python代码实现
笔者本打算使用c++手搓后放弃转python
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 from sklearn import datasetsfrom sklearn.neighbors import KNeighborsClassifierimport numpy as npiris = datasets.load_iris() iris_x = iris.data iris_y = iris.target print ("num of data:" , len (iris_x))indices = np.random.permutation(len (iris_x)) iris_train = iris_x[indices[:-10 ]] iris_train_label = iris_y[indices[:-10 ]] iris_test = iris_x[indices[-10 :]] iris_test_label = iris_y[indices[-10 :]] knn = KNeighborsClassifier() knn.fit(iris_train, iris_train_label) iris_train_predict = knn.predict(iris_test) print ("the real label is:" , iris_test_label)print ("the predict is: " , iris_train_predict)
1 2 3 4 E:\annaconda\envs\tf_env\python.exe C:\Users\shaoy\Desktop\pythonProject\main.py num of data: 150 the real label is: [2 0 2 2 2 1 2 2 0 1] the predict is: [2 0 2 2 2 1 1 2 0 1]