k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法。
一句话总结: 近朱者赤近墨者黑!
k 近邻算法的输入为实例的特征向量,对应于特征空间的点;输出为实例的类别,可以取多类。k 近邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其 k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此,k近邻算法不具有显式的学习过程。
k 近邻算法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。 k值的选择、距离度量以及分类决策规则是k近邻算法的三个基本要素。
图中绿色的点就是我们要预测的那个点,假设K=3。那么KNN算法就会找到与它距离最近的三个点(这里用圆圈把它圈起来了),看看哪种类别多一些,比如这个例子中是蓝色三角形多一些,新来的绿色点就归类到蓝三角了。
但是,当K=5的时候,判定就变成不一样了。这次变成红圆多一些,所以新来的绿点被归类成红圆。从这个例子中,我们就能看得出K的取值是很重要的。
电影可以按照题材分类,那么如何区分 动作片
和 爱情片
呢?
基于电影中的亲吻、打斗出现的次数,使用 k-近邻算法构造程序,就可以自动划分电影的题材类型。
现在根据上面我们得到的样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到 k 个距离最近的电影。
假定 k=3,则三个最靠近的电影依次是, He's Not Really into Dudes 、 Beautiful Woman 和 California Man。
knn 算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。
KNN 工作原理
KNN 通俗理解
给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的 k 个实例,这 k 个实例的多数属于某个类,就把该输入实例分为这个类。
KNN 开发流程
收集数据: 任何方法
准备数据: 距离计算所需要的数值,最好是结构化的数据格式
分析数据: 任何方法
训练算法: 此步骤不适用于 k-近邻算法
测试算法: 计算错误率
使用算法: 输入样本数据和结构化的输出结果,然后运行 k-近邻算法判断输入数据分类属于哪个分类,最后对计算出的分类执行后续处理
KNN 算法特点
优点: 精度高、对异常值不敏感、无数据输入假定
缺点: 计算复杂度高、空间复杂度高
适用数据范围: 数值型和标称型
4.1 关于距离的衡量方法:具体介绍参见K-means介绍
KNN算法中要求数据的所有特征都可以做量化,若在数据特征中存在非数值类型,必须采用手段将其量化为数值。
在sklearn中,KNN分类器提供了四种距离
4.2 K值的选择问题
在KNN分类中,K值的选择往往没有一个固定的经验,可以通过不停调整(例如交叉验证)到一个合适的K值。
在实际应用中,K 值一般选择一个较小的数值,通常采用交叉验证的方法来选择最优的 K 值。随着训练实例数目趋向于无穷和 K=1 时,误差率不会超过贝叶斯误差率的2倍,如果K也趋向于无穷,则误差率趋向于贝叶斯误差率。(贝叶斯误差可以理解为最小误差)
三种交叉验证方法:
4.3 分类决策的准则
明确K个邻居中所有数据类别的个数,将测试数据划分给个数最多的那一类。即由输入实例的 K 个最临近的训练实例中的多数类决定输入实例的类别。
最常用的两种决策规则:
多数表决法图示说明(其中K=4):
输入: 训练数据集 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) … . . . ( x N , y N ) } , x 1 T=\left\{\left(\mathrm{x}_{1}, \mathrm{y}_{1}\right),\left(\mathrm{x}_{2}, \mathrm{y}_{2}\right) \ldots . . .\left(\mathrm{x}_{\mathrm{N}}, \mathrm{y}_{\mathrm{N}}\right)\right\}, \mathrm{x}_{1} T={(x1,y1),(x2,y2)…...(xN,yN)},x1 为实例的特征向量, y i = { c 1 , c 2 , … c k } \mathrm{yi}=\left\{\mathrm{c}_{1}, \mathrm{c}_{2}, \ldots \mathrm{c}_{k}\right\} yi={c1,c2,…ck} 为实剅类别。
输出: 实例 x \mathrm{x} x 所属的类别 y \mathrm{y} y 。
步骤:
KNN
K-Means
相似点
from sklearn.neighbors import KNeighborsClassifier
train_x = [[45, 2, 9],
[21, 17, 5],
[54, 9, 11],
[39, 0, 31],
[5, 2, 57],
[3, 2, 65],
[2, 3, 55],
[6, 4, 21],
[7, 46, 4],
[9, 39, 8],
[9, 38, 2],
[8, 34, 17]]
train_y = ['喜剧片', '喜剧片','喜剧片','喜剧片',
'动作片', '动作片','动作片','动作片',
'爱情片','爱情片','爱情片','爱情片',]
#构建knn分类模型,并指定 k 值
KNN=KNeighborsClassifier(n_neighbors=3)
#使用训练集训练模型
KNN.fit(train_x,train_y)
#评估模型的得分
score=KNN.score(train_x,train_y)
print(score)
x_test=[[23,3,17]]
predict_result=KNN.predict(x_test)
print(predict_result)
knn与kmeans区别