k近邻算法_k最近邻分类算法(KNN)的原理及其实现

1. 算法思路

通过计算每个训练样例到待分类样品的距离,取和待分类样品距离最近的K个训练样例,K个样品中哪个类别的训练样例占多数,则待分类样品就属于哪个类别

核心思想:如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合。

2. 算法描述

  1. 算距离:给定测试对象,计它与训练集中的每个对象的距离

依公式计算 Item 与 D1、D2 … …、Dj 之相似度。得到Sim(Item, D1)、Sim(Item, D2)… …、Sim(Item, Dj)。

  1. 将Sim(Item, D1)、Sim(Item, D2)… …、Sim(Item, Dj)排序,若是超过相似度阈值t则放入邻居案例集合NN。

找邻居:圈定距离最近的k个训练对象,作为测试对象的近邻

  1. 自邻居案例集合NN中取出前k名,依多数决,得到Item可能类别。

做分类:根据这k个近邻归属的主要类别,来对测试对象分类

3. 算法步骤

step.1 ---初始化距离为最大值

step.2---计算未知样本和每个训练样本的距离dist

step.3---得到目前K个最临近样本中的最大距离maxdist

step.4---如果dist小于maxdist,则将该训练样本作为K-最邻近样本

step.5---重复步骤2、3、4,直到未知样本和所有训练样本的距离

step.6---统计K-最近邻样本中每个类标号出现的次数

step.7---选择出现频率最大的类标号作为未知样本的类标号

该算法涉及3个主要因素:训练集、距离或相似的衡量、K的大小。

4. k邻近模型的三个基本要素

三个基本要素为距离度量K值的选择分类决策规则

距离度量:

k近邻算法_k最近邻分类算法(KNN)的原理及其实现_第1张图片

5. 算法

1)优点

简单,易于理解,易于实现,无需估计参数,无需训练;

适合样本容量比较大的分类问题;

特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,KNN比SVM的表现要好

2)缺点

懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢;

可解释性较差,无法给出决策树那样的规则;

对于样本量较小的分类问题,公产生误分

6.常见问题 1)K值设定为多大

k太小,分类结果易受噪声点影响; k太大,近邻中又可能包含多的其它类别点。(对距离加 太大,近邻中又可能包含多的其它类别点。(对距离加 权,可以降低 k值设定的影响) k值通常是采用 交叉检验 来确定(以 k=1为基准) 经验规则: k一般低于训练样本数的平方根

2)类别如何判定最合适

投票法没有考虑近邻的距离远,更也许应该决定最终分类所以加权更恰当一些。

3)如何选定合适的距离衡量

高维度对距离衡量的影响:众所周知当变数越多,欧式区分能力就差。 变量值域对距离的影响:越大常会在计算中占据主导作用,因此应先进行标

4) 训练样本是否要一视同仁

在训练集中,有些样本可能是更值得依赖的。 可以给不同的样本施加不同的权重,加强依赖样本的权重,降低不可信赖样本的影响。

5) 性能问题

KNN是一种懒惰算法,平时不好好学习,考试(对测试样本分类)时才临阵磨枪(临时去找k个近邻)。 懒惰的后果:构造模型很简单,但在对测试样本分类地的系统开销大,因为要扫描全部训练样本并计算距离。 已经有一些方法提高计算的效率,例如压缩训练样本量等。

6)能否大幅度减少训练样本量,同时又保持分类精度?

浓缩技术(condensing)

编辑技术(editing)

6. KNN算法Python实现实例之电影分类

k近邻算法_k最近邻分类算法(KNN)的原理及其实现_第2张图片

示例数据

任务描述:通过打斗次数和接吻来界定电影类型

【1】调用 Python的 sklearn模块求解

import numpy as npfrom sklearn import neighborsknn = neighbors.KNeighborsClassifier() # 调用KNN的分类模型#Out:KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', 8. metric_params=None, n_jobs=1, n_neighbors=5, p=2, 9. weights='uniform')train_data = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]]) # 对应表中的数据:打斗次数,接吻次数test_data = np.array([[18,90]])labels = np.array([1,1,1,2,2,2]) # 制作标记: 1-romance, 2-actionknn.fit(train_data,labels)knn.predict(test_data)
k近邻算法_k最近邻分类算法(KNN)的原理及其实现_第3张图片

运行结果

说明: 首先,用 labels数组中的 数组中的 1和 2代表 Romance和 Aciton,因为 sklearn不接受字符数组作为标志,只 不接受字符数组作为标志,只 能用 1,2这样的 int型数据来表示,后面处理可以将 型数据来表示,后面处理可以将 1和 2映射到 Romance和 Action上来。 fit则是 用 data和 labels进行训练, 进行训练, data对应的是打斗次数和接吻构成向量,称之为特征。 labels则是这个数据所代表的电影属类型。调用 predict 进行预测,将未知 电影的特征向量代入,则能 分析出该未知电影所属的类型。此处计算结果为 1,也就是该未知电影属于 Romance,和直觉相符。

你可能感兴趣的:(k近邻算法)