KNN

KNN的工作原理

1.计算待分类物体与其他物体之间的距离;

2.统计距离最近的K个邻居;

3.对于K个最近的邻居,他们属于哪个分类多,待分类物体就属于哪一类。

(注:K值的具体大小一般根据交叉验证的方式得出)

距离如何计算

两个样本点之间的距离代表了这两个样本之间的相似度。距离越大,差异性越大。距离越小,相似度越大。

关于距离的计算方式,一般有下面五种方式:

1. 欧氏距离;

2. 曼哈顿距离;

3.闵可夫斯基距离;

4.切比雪夫距离;

5.余弦距离

其中,前三种最为常用。

欧氏距离是我们最常用的距离公式,两点之间的欧式距离为:

KNN_第1张图片

同理,两点在n维空间中的距离:


曼哈顿距离在几何空间中用的比较多,它等于两个点在坐标系上绝对轴距总和。


KNN_第2张图片

闵可夫斯基距离不是一个距离,而是一组距离的定义。对于 n 维空间中的两个点x(x1,x2,…,xn) 和 y(y1,y2,…,yn),x和y两点之间的闵可夫斯基距离为:


KNN_第3张图片

其中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规范化对数据进行规范化处理。

你可能感兴趣的:(KNN)