KNN算法详解及实现
KNN算法详解及实现
k近邻法(k-nearest neighbor,k-NN)是一种基本的分类和回归方法,是监督学习方法里的一种常用方法。k近邻算法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其k个最近邻的训练实例类别,通过多数表决等方式进行预测。
k近邻算法用一句通俗的古语来说就是:“物以类聚,人以群分”。你要看一个实例的类别,你就可以看它附近是什么类别。如下图1.1所示,当要判断绿色实例的类别的时候,我们可以看看它的附近有哪些类,然后采取多数表决的决策规则(红色2个多于蓝色1个),于是把绿色实例也分类为红色那一类。
kkk近邻法三要素:距离度量、kkk值的选择和分类决策规则。常用的距离度量是欧氏距离及更一般的pL距离。kkk值小时,kkk近邻模型更复杂,容易发生过拟合;kkk值大时,kkk近邻模型更简单,又容易欠拟合。因此kkk值得选择会对分类结果产生重大影响。kkk值的选择反映了对近似误差与估计误差之间的权衡,通常由交叉验证选择最优的kkk。分类决策规则往往是多数表决,即由输入实例的kkk个邻近输入实例中的多数类决定输入实例的类。
距离度量:
设特征空间xxx是nnn维实数向量空间 ,xi,xj∈Xx_{i}, x_{j} \in \mathcal{X}xi,xj∈X,xi=(xi(1),xi(2),⋯,xi(n))Tx_{i}=\left(x_{i}^{(1)}, x_{i}^{(2)}, \cdots, x_{i}^{(n)}\right)^{\mathrm{T}}xi=(xi(1),xi(2),⋯,xi(n))T,xj=(xj(1),xj(2),⋯,xj(n))Tx_{j}=\left(x_{j}^{(1)}, x_{j}^{(2)}, \cdots, x_{j}^{(n)}\right)^{\mathrm{T}}xj=(xj(1),xj(2),⋯,xj(n))T,则:xix_ixi,xjx_jxj的LpL_pLp距离定义为:
Lp(xi,xj)=(∑i=1n∣xi(i)−xj(l)∣p)1pL_{p}\left(x_{i}, x_{j}\right)=\left(\sum_{i=1}^{n}\left|x_{i}^{(i)}-x_{j}^{(l)}\right|^{p}\right)^{\frac{1}{p}}Lp(xi,xj)=(∑i=1n∣∣∣xi(i)−xj(l)∣∣∣p)p1
- p=1p= 1p=1 曼哈顿距离
- p=2p= 2p=2 欧氏距离
- p=∞p= \inftyp=∞ 切比雪夫距离
一般采用二维欧氏距离
交叉验证选取kkk值
在许多实际应用中数据是不充足的。为了选择好的模型,可以采用交叉验证方法。交叉验证的基本想法是重复地使用数据,把给定的数据进行切分,将切分的数据组合为训练集与测试集,在此基础上反复进行训练测试以及模型的选择。在实现过程中将采用sklearn.model_selection.cross_val_score()
实现交叉验证选取kkk值。
分类决策规则
knn
使用的分类决策规则是多数表决,如果损失函数为0-1损失函数,那么要使误分类率最小即使经验风险最小,多数表决规则实际上就等同于经验风险最小化。
KNN实现
实现K近邻算法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索。k近邻法最简单的实现方法是线性扫描,也就是暴力法计算输入实例到每一个训练实例的距离,然后取前k个距离最短的采取多数表决规则进行分类。但是如果训练集的数据量很大时,这种方法就不可行了。为了提高k近邻的搜索效率,可以考虑使用特殊的结构存储训练数据,以减少距离计算的次数,常用的有 kdkdkd(kdkdkd tree)树方法。
KNN算法实现
- sklearnsklearnsklearn封装
KNN
方法解析
sklearn.neighbors.KNeighborsClassifier(n_neighbors = 5,weights='uniform',algorithm = '',leaf_size = '30',p = 2,metric = 'minkowski',metric_params = None,n_jobs = None)
参数如下:
- n_neighbors:这个值就是指 KNN 中的 “K”了。前面说到过,通过调整 K 值,算法会有不同的效果。
- weights(权重):最普遍的 KNN 算法无论距离如何,权重都一样,但有时候我们想搞点特殊化,比如距离更近的点让它更加重要。这时候就需要 weight 这个参数了,这个参数有三个可选参数的值,决定了如何分配权重。参数选项如下:
• ‘uniform’:不管远近权重都一样,就是最普通的 KNN 算法的形式。
• ‘distance’:权重和距离成反比,距离预测目标越近具有越高的权重。
• 自定义函数:自定义一个函数,根据输入的坐标值返回对应的权重,达到自定义权重的目的。- algorithm:在 sklearn 中,要构建 KNN 模型有三种构建方式,1. 暴力法,就是直接计算距离存储比较的那种放松。2. 使用 kd 树构建 KNN 模型 3. 使用球树构建。 其中暴力法适合数据较小的方式,否则效率会比较低。如果数据量比较大一般会选择用 KD 树构建 KNN 模型,而当 KD 树也比较慢的时候,则可以试试球树来构建 KNN。参数选项如下:
• ‘brute’ :蛮力实现
• ‘kd_tree’:KD 树实现 KNN
• ‘ball_tree’:球树实现 KNN
• ‘auto’: 默认参数,自动选择合适的方法构建模型
不过当数据较小或比较稀疏时,无论选择哪个最后都会使用 ‘brute’- leaf_size:如果是选择蛮力实现,那么这个值是可以忽略的,当使用KD树或球树,它就是是停止建子树的叶子节点数量的阈值。默认30,但如果数据量增多这个参数需要增大,否则速度过慢不说,还容易过拟合。
- p:和metric结合使用的,当metric参数是"minkowski"的时候,p=1为曼哈顿距离, p=2为欧式距离。默认为p=2。
- metric:指定距离度量方法,一般都是使用欧式距离。
• ‘euclidean’ :欧式距离
• ‘manhattan’:曼哈顿距离
• ‘chebyshev’:切比雪夫距离
• ‘minkowski’: 闵可夫斯基距离,默认参数- n_jobs:指定多少个CPU进行运算,默认是-1,也就是全部都算。
属性如下:
- classes_ : 分类器已知的类别标签,返回ndarray标签数组。
- effective_metric_ :距离度量,和上述参数中metric参数设定的距离度量一致。
- effective_metric_params_:指标函数附加的关键字参数,对于大多数距离指标,将会和metric参数相同,但如果effective_metric_params_属性设置为‘minkowski’,那么也可能包含p参数的值。返回的形式是字典。
- outputs_2d_:训练时当y的形状为(n,)或(n,1),则返回False,否则返回True。
方法如下:
- fit(X, y):使用X作为训练数据,y作为标签目标数据进行数据拟合训练。
- get_params([deep]):获取参数组成的字典。
- kneighbors([X, n_neighbors, return_distance]):找寻一个点的k个邻居。
- predict(X):根据提供的数据去预测它的类别标签。
- predict_proba(X):返回测试数据X的概率估计值。
- score(X, y[, sample_weight]):返回给定数据和标签的平均准确度。
- set_params(params):设置估值器的参数。
- 交叉验证法选取最佳kkk值
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier#加载鸢尾花数据集
iris = load_iris()
x = iris.data
y = iris.target
k_range = range(1, 31) # 设置循环次数
k_error = []
#循环,取k从1~30,查看误差效果
for k in k_range:knn = KNeighborsClassifier(n_neighbors=k)#cv参数决定数据集划分比例,这里是按照5:1划分训练集和测试集scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy')k_error.append(1 - scores.mean())#画图,x轴为k值,y值为误差值
plt.plot(k_range, k_error)
plt.xlabel('Value of K in KNN')
plt.ylabel('Error')
plt.show()
输出如下:
由这个图我们可以看出大致在k=11的时候,损失值是最小的,所以我们选择k = 11进行训练。
- knnknnknn实例
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
from sklearn import neighbors, datasetsn_neighbors = 11# 加载鸢尾花数据集
iris = datasets.load_iris()
# 选择其中的两个特征
X = iris.data[:, :2]
y = iris.targeth = .02 # 网格步长# 创建色彩图
cmap_light = ListedColormap(['orange', 'cyan', 'cornflowerblue'])
cmap_bold = ListedColormap(['darkorange', 'c', 'darkblue'])# 在两种权重下绘制图像
for weights in ['uniform', 'distance']:# 创建knn分类器实例, 并进行训练拟合clf = neighbors.KNeighborsClassifier(n_neighbors, weights = weights)clf.fit(X,y)# 绘制决策边界x_min, x_max = X[:,0].min() - 1, X[:,0].max() + 1y_min, y_max = X[:,1].min() - 1, X[:,1].max() + 1xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.figure()plt.pcolormesh(xx, yy, Z, cmap = cmap_light)# 绘制训练点plt.scatter(X[:, 0], X[:, 1], c = y, cmap = cmap_bold, edgecolor='k', s=20)plt.xlim(xx.min(), xx.max())plt.ylim(yy.min(), yy.max())plt.title('3-Class classification (k = %i, weights = "%s")' % (n_neighbors, weights))plt.show()
输出如下:
KNN总结
KNN算法优点:
- 简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
- 模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
- 预测效果好。
- 对异常值不敏感
KNN算法缺点:
- 对内存要求较高,因为该算法存储了所有训练数据
- 预测阶段可能很慢
- 对不相关的功能和数据规模敏感
KNN算法详解及实现相关推荐
- 算法代码[置顶] 机器学习实战之KNN算法详解
改章节笔者在深圳喝咖啡的时候突然想到的...之前就有想写几篇关于算法代码的文章,所以回家到以后就奋笔疾书的写出来发表了 前一段时间介绍了Kmeans聚类,而KNN这个算法刚好是聚类以后经常使用 ...
- 3. KNN最近邻算法详解与关键技术剖析(理论篇)
一.KNN算法概述 K最近邻(K-Nearest-Neighbour,KNN)算法可以说是最简单的分类算法,易于理解,其核心思想就是距离的比较,即离谁最近,就被归类于谁(群体投票的方式). 通俗解释: ...
- 【20210922】【机器/深度学习】KNN (K近邻) 算法详解
一.算法概念 KNN, K-near neighbor,即最近邻算法.它是一种分类算法,算法思想是:一个样本与数据集中的 k 个样本最相似,如果这 k 个样本中的大多数属于某一个类别,则该样本也属于这 ...
- KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践
KNN(K Nearest Neighbors)分类是什么学习方法?如何或者最佳的K值?RadiusneighborsClassifer分类器又是什么?KNN进行分类详解及实践 如何使用GridSea ...
- 图解机器学习算法(13) | 聚类算法详解(机器学习通关指南·完结)
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...
- 【机器学习】集成学习及算法详解
集成学习及算法详解 前言 一.随机森林算法原理 二.随机森林的优势与特征重要性指标 1.随机森林的优势 2.特征重要性指标 三.提升算法概述 四.堆叠模型简述 五.硬投票和软投票 1.概念介绍 2.硬 ...
- 邻域保留投影算法(NPE)(Neighborhood Preserving Embedding)算法详解
上一篇降维算法的相关论文为LPP算法,也是何小飞老师的论文https://blog.csdn.net/qq_39187538/article/details/90402961 1.问题导入 2.算法出 ...
- 谱聚类算法详解及代码实现
谱聚类算法详解及代码实现 文章目录 谱聚类算法详解及代码实现 参考 关于谱聚类介绍 谱聚类概述 谱聚类前置知识 无向权重图 邻接矩阵 度矩阵 拉普拉斯矩阵 相似度矩阵 确定目标函数 初始化目标函数(最 ...
- Matlab人脸检测算法详解
这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...
最新文章
- java lambda 变量_java8新特性-lambda(变量捕获)
- codeforces_A. Salem and Sticks_数组/暴力
- mysql压力测试工具Mysqlslap
- springboot中controller单例模式多线程安全的简单理解
- modbus软件开发实战指南_C++核心准则?GSL:指南支持库
- 优质的程序员需为代码效率而呕心沥血
- Java讲课笔记07:计数循环与嵌套循环
- C# Winform播放多媒体文件 [AudioVideoPlayback ]
- 辞职腾讯去了小公司,从0到1搭建后端架构,工资就翻倍了
- Winform文件下载之断点续传
- MATLAB最基础的教程
- 二进制颜色查询对照表
- camera - 滤镜格式 (原生RGGB、RCCB、RCCC、RGB-IR和Monochrome(单色传感器))
- python安装pyaudio_关于python:PyAudio不会安装
- Google 最新版 Chrome 崩溃
- InputStream 、FileInputStream、InputStreamReader 、BufferedReader的区别
- Windows Server 2012 R2更新补丁后:你的电脑将在一分钟后自动重启
- 计算机专业硕士论文评语,硕士论文评审意见范文
- android 清理后自动重启,解决Android后台清理APP后,程序自动重启的问题
- 传统的招投标or在线招投标