KNN的工作原理
1.计算待分类物体与其他物体之间的距离;
2.统计距离最近的K个邻居;
3.对于K个最近的邻居,他们属于哪个分类多,待分类物体就属于哪一类。
(注:K值的具体大小一般根据交叉验证的方式得出)
距离如何计算
两个样本点之间的距离代表了这两个样本之间的相似度。距离越大,差异性越大。距离越小,相似度越大。
关于距离的计算方式,一般有下面五种方式:
1. 欧氏距离;
2. 曼哈顿距离;
3.闵可夫斯基距离;
4.切比雪夫距离;
5.余弦距离
其中,前三种最为常用。
欧氏距离是我们最常用的距离公式,两点之间的欧式距离为:
同理,两点在n维空间中的距离:
曼哈顿距离在几何空间中用的比较多,它等于两个点在坐标系上绝对轴距总和。
闵可夫斯基距离不是一个距离,而是一组距离的定义。对于 n 维空间中的两个点x(x1,x2,…,xn) 和 y(y1,y2,…,yn),x和y两点之间的闵可夫斯基距离为:
其中p代表空间的维数,当p=1时,就是曼哈顿距离;当p=2时,就是欧式距离;当时,就是切比雪夫距离。
余弦距离实际上计算的是两个向量的夹角,是在方向上计算两者之间的差异,对绝对数值不敏感。在兴趣相关性比较上,角度关系比距离的绝对值更重要,因此余弦距离可以用于衡量用户对内容兴趣的区分度。比如我们用搜索引擎搜索某个关键词,它还会给你推荐其他的相关搜索,这些推荐的关键词就是采用余弦距离计算得出的。
为了减少计算距离次数,提升 KNN 的搜索效率,人们提出了KD树(K-Dimensional 的缩写)。KD树是对数据点在K维空间中划分的一种数据结构。在KD树的构造中,每个节点都是K维数值点的二叉树。既然是二叉树,就可以采用二叉树的增删改查操作,这样就大大提升了搜索效率。
用KNN做回归
对于一个新点,我们需要找出这个点的K个最近邻居,然后将这些邻居的属性的平均值赋给该点,就可以得到该点的属性。
在sklearn中使用KNN
可用如下语句引入KNN分类器:
from sklearn.neighbors import KNeighborsClassifier
KNeighborsClassifier有如下几个参数
1.n_neighbors:即 KNN 中的 K 值,代表的是邻居数量。K值太小会造成过拟合,K值太大会造成无法准确分类。
2.weights:用来确定邻居的权重,uniform表示所有权重相同,distance代表权重是距离的倒数。
3.algorithm:用来规定邻居的计算方法,auto会根据情况自动选择。kd_tree表示KD树,一般用于维数不超过20的情况。ball_tree,也叫作球树,它和 KD 树一样都是多维空间的数据结果,不同于 KD 树,球树更适用于维度大的情况;brute,也叫作暴力搜索。
4.leaf_size:代表构造 KD 树或球树时的叶子数,默认是 30,调整 leaf_size 会影响到树的构造和搜索速度。
KNN算法和距离定义相关,通常使用Z-Score规范化对数据进行规范化处理。