什么是K近邻算法?
K近邻是最为基础的分类和回归算法!他的基本原则就是:对给定的训练实例点和输入实例点,首先确定输入实例点的
k
k
k个最近邻训练实例点,然后利用这
k
k
k个训练实例点的类的多数来预测输入实例点的类。简单的说就是近朱者赤,近墨者黑。该点周围的K个点绝大部分是红色的,那么它是红色的概率也大。如果绝大部分是黑色的,那么它也极有可能是黑色的!
K K K近邻三要素
k k k近邻法三要素有:
-
距离度量
距离度量:就是用何种方式选择 K K K个点:一般的方法就是用欧式距离 -
k k k值的选择
K K K的选择一般是采用交叉验证来选择,它的选择反映出了近似误差与估计误差之间的权衡。 -
分类决策规则
分类决策通常为多数表决,对应于经验风险最小化。也就是少数服从多数。
key point
k k k近邻法的实现需要考虑如何快速搜索k个最近邻点。对于一维变量来说,二叉树是一个不错的先择。对于K维空间则使用kd树(上一篇博客进行过介绍)
距离度量
设特征空间 x x x是 n n n维实数向量空间 , x i , x j ∈ X x_{i}, x_{j} \in \mathcal{X} xi,xj∈X, x i = ( x i ( 1 ) , x i ( 2 ) , ⋯   , x i ( n ) ) T x_{i}=\left(x_{i}^{(1)}, x_{i}^{(2)}, \cdots, x_{i}^{(n)}\right)^{\mathrm{T}} xi=(xi(1),xi(2),⋯,xi(n))T, x j = ( x j ( 1 ) , x j ( 2 ) , ⋯   , x j ( n ) ) T x_{j}=\left(x_{j}^{(1)}, x_{j}^{(2)}, \cdots, x_{j}^{(n)}\right)^{\mathrm{T}} xj=(xj(1),xj(2),⋯,xj(n))T ,则: x i x_i xi, x j x_j xj的 L p L_p Lp距离定义为:
L p ( x i , x j ) = ( ∑ i = 1 n ∣ x i ( i ) − x j ( l ) ∣ p ) 1 p L_{p}\left(x_{i}, x_{j}\right)=\left(\sum_{i=1}^{n}\left|x_{i}^{(i)}-x_{j}^{(l)}\right|^{p}\right)^{\frac{1}{p}} Lp(xi,xj)=(∑i=1n∣∣∣xi(i)−xj(l)∣∣∣p)p1
p
=
1
p= 1
p=1 曼哈顿距离
p
=
2
p= 2
p=2 欧氏距离
p
=
i
n
f
p= inf
p=inf 闵式距离
python实现距离度量
import math
from itertools import combinations
def L(x, y, p=2):
# x1 = [1, 1], x2 = [5,1]
if len(x) == len(y) and len(x) > 1:
sum = 0
for i in range(len(x)):
sum += math.pow(abs(x[i] - y[i]), p)
return math.pow(sum, 1 / p)
else:
return 0
scikit-learning 种的knn
from sklearn.neighbors import KNeighborsClassifier
clf_sk = KNeighborsClassifier()
clf_sk.fit(X_train, y_train)
clf_sk.score(X_test, y_test)
整体的流程
- 划分好训练集,测试集
- 设置好距离度量方法
- 选择出测试点距离最近的K个点
- 对这K个点的标签进行投票
- 获得最终的决策