k近邻法(K-Nearest Neighbor)
KNN 的工作原理
- 计算待分类物体与其他物体之间的距离;
- 统计距离最近的 K 个邻居;
- 对于 K 个最近的邻居,它们属于哪个分类最多,待分类物体就属于哪一类。
K值如何选择
如果 K 值比较小,就相当于未分类物体与它的邻居非常接近才行。分类就会产生过拟合。
如果 K 值比较大,相当于距离过远的点也会对未知物体的分类产生影响,分类产生欠拟合情况.
鲁棒性:在异常和危险情况下系统生存的能力
在工程上,我们一般采用交叉验证的方式选取 K 值。
交叉验证的思路就是,把样本集中的大部分样本作为训练集,剩余的小部分样本用于预测,来验证分类模型的准确性。所以在 KNN 算法中,我们一般会把 K 值选取在较小的范围内,同时在验证集上准确率最高的那一个最终确定作为 K 值。
距离的计算:
- 欧氏距离;
- 曼哈顿距离;
- 闵可夫斯基距离;
- 切比雪夫距离;
K D 树
KNN 的计算过程是大量计算样本点之间的距离。
- 为了减少计算距离次数
- 提升 KNN 的搜索效率
KD 树(K-Dimensional )
- 对数据点在 K 维空间中划分的一种数据结构。
- 在 KD 树的构造中,每个节点都是 k 维数值点的二叉树。
- 既然是二叉树,就可以采用二叉树的增删改查操作,这样就大大提升了搜索效率。
sklearn实现
KNN 既可以做分类器,也可以做回归。
- 做分类,你需要引用:from sklearn.neighbors import KNeighborsClassifier
- 做回归,你需要引用:from sklearn.neighbors import KNeighborsRegressor
KNeighborsClassifier(n_neighbors=5, weights=‘uniform’, algorithm=‘auto’, leaf_size=30)
1.n_neighbors:即 KNN 中的 K 值,代表的是邻居的数量。K 值如果比较小,会造成过拟合。如果 K 值比较大,无法将未知物体分类出来。一般我们使用默认值 5。
2.weights:是用来确定邻居的权重,有三种方式:weights=uniform,代表所有邻居的权重相同;weights=distance,代表权重是距离的倒数,即与距离成反比;自定义函数,你可以自定义不同距离所对应的权重。大部分情况下不需要自己定义函数。
3.algorithm:用来规定计算邻居的方法,它有四种方式:algorithm=auto,根据数据的情况自动选择适合的算法,默认情况选择 auto;
- algorithm=kd_tree,也叫作 KD 树,是多维空间的数据结构,方便对关键数据进行检索,不过 KD 树适用于维度少的情况,一般维数不超过 20,如果维数大于 20 之后,效率反而会下降;
- algorithm=ball_tree,也叫作球树,它和 KD 树一样都是多维空间的数据结果,不同于 KD 树,球树更适用于维度大的情况;
- algorithm=brute,也叫作暴力搜索,它和 KD 树不同的地方是在于采用的是线性扫描,而不是通过构造树结构进行快速检索。当训练集大的时候,效率很低。
4.leaf_size:代表构造 KD 树或球树时的叶子数,默认是 30,调整 leaf_size 会影响到树的构造和搜索速度。