KNN - K nearest neighbor
算法利用的数学思想极少
思想:对于一个新来的点,根据判断k个最近的点,来判断新来的点的类别。
过程:
1)先计算新来的点与样本中每一个点的距离(欧拉距离)
2)找到最近的k个点 (可以用np.argsort)
3)找到k个点中类别最多的点的类
所以k邻近算法可以说是没有模型的算法,也可以说训练集数据就是模型
在scikit-learn中调用这个kNN算法:
from sklearn.neighbors import KNeighborsClassifier
kNN_classifier = KNeighborsClassifier(n_neighbors = 6) #n_neighbors就是k的值
kNN_classifier.fit(X_train, y_train) #拟合
kNN_classifier.predict(x)
超参
在前面的做法中 k个相邻节点的权重都相同,这说明在这k个节点中,离测试点最近最远的点的影响是一样的,所以加上权重可能让我们的模型更好
在sklearn.neighbors.KNeighborsClassifier 下有一个参数就是weights,我们可以通过这个来设置
有时候我们也不单单使用欧拉距离,我们也会使用曼哈顿距离、明可夫斯基距离((∑|xi-yi|^p)^(1/p) (i=1,2,...n))
但是在这个算法下仍然有很大的缺陷:
1)效率低下就是一个很大的问题,训练集有m个样本,每个样本有n个feature的话 那么算法复杂度就是O(m * n)
通常优化这个算法会使用树结构(KD-Tree, Ball-Tree)
2)对outlier太敏感了
3)可能没法去解释这个算法
4)维数灾难:对于高维的feature,距离可能会非常巨大 通常通过PCA去降维后处理