K近邻法算法(KNN)及其R实现
1. K近邻算法
输入:训练数据集
T=\{(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N)\}
其中, xi∈χ⊆Rnx_i \in \chi \subseteq R^n为实例的特征向量, yi∈Y={c1,c2,⋯,cK}y_i\in Y=\{c_1,c_2,\cdots,c_K\}为实例的类别, i=1,2,⋯,N;i=1,2,\cdots,N;实例特征向量x;
输出:实例x所属的类y。
(1)根据给定的距离度量,在训练数据集T中找出与x最近邻的k个点,涵盖这k个点的x的邻域记做 Nk(x);N_k(x);
(2)在 Nk(x)N_k(x)中根据分类决策规则(如多数表决)决定x 的类别y:
y=arg \quad max_{c_j}\sum_{x_i\in N_k(x)}I(y_i=c_j),i=1,2,\cdots,N; j=1,2,\cdots,K
上式中,I为指示函数,当 yi=cjy_i=c_j时I为1,否则为0.
2 距离度量
设特徵空间χ\chi是n维实数向量空间RnR^n,xi,xj∈χ,xi=(x(1)i,x(2)i,⋯,x(n)i)T,x_i,x_j\in\chi,x_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(n)})^T, xj=(x(1)j,x(2)j,⋯,x(n)j)T,xi,xjx_j=(x_j^{(1)},x_j^{(2)},\cdots,x_j^{(n)})^T, x_i,x_j的距离定义为
闵可夫斯基距离(Minkowski distance):
L_p(x_i,x_j)=(\sum_{l=1}^n|x_i^{(l)}-x_j^{(l)}|^p)^{\frac{1}{p}}, p\ge 1
欧氏距离(Euclidean distance):
L_2(x_i,x_j)=(\sum_{l=1}^n|x_i^{(l)}-x_j^{(l)}|^2)^{\frac{1}{2}}
曼哈顿距离(Manhattan distance):
L_1(x_i,x_j)=\sum_{l=1}^n|x_i^{(l)}-x_j^{(l)}|
切比雪夫距离(Chebyshev distance):
L_\inf(x_i,x_j)=max_{l=1}|x_i^{(l)}-x_j^{(l)}|
3. 分类决策规则
分类损失函数为0-1损失函数,分类函数为
f: R^n\rightarrow\{c_1,c_2,\cdots,c_K\}
那么误分类的概率为
P(Y\ne f(X))=1-P(Y=f(X))
对给定的实例 x∈χx\in\chi,其最近邻的k个训练实例点构成集合 Nk(x).N_k(x).如果涵盖 Nk(x)N_k(x)的区域的类别是 cjc_j,那么误分类率是
\frac{1}{k}\sum_{x_i\in N_k(x)}I(y_i\ne c_j)=1-\frac{1}{k}\sum_{x_i\in N_k(x)}I(y_i=c_j)
要使经验风险最小,则使 ∑xi∈Nk(x)I(yi=cj)\sum_{xi\in N_k(x)}I(y_i=c_j)最大。
4. K近邻算法的实现:kd树
4.1 构造kd树
算法(构造平衡kd树):
输入:k维空间数据集T={x1,x2,⋯,xN}T=\{x_1,x_2,\cdots,x_N\},
其中xi=(x(1)i,x(2)i,⋯,x(k)i)T,i=1,2,⋯,N;x_i=(x_i^{(1)},x_i^{(2)},\cdots,x_i^{(k)})^T,i=1,2,\cdots,N;
输出: kd树。
(1)开始:构造根节点,根节点对应于包含T的k维空间的超矩形区域。选择x(1)x^{(1)}为坐标轴,以T中所有实例的x(1)x^{(1)}坐标的中位数为切分点,将根节点对应的超矩形区域切分成两个子区域。切分由通过切分点并与坐标轴x(1)x^{(1)}垂直的超平面实现。
\quad由根节点生成深度为1的左、右子节点:左子节点对应坐标x(1)x^{(1)}小于切分点的子区域,右子节点对应于坐标x(1)x^{(1)}大于切分点的子区域。
\quad将落在切分超平面上的实例点保存在根节点。
(2)重复:对深度为j的的节点,选择x(l)x^{(l)}为切分的坐标轴,l=j(modk)+1l=j(modk)+1,以该节点的去榆中所有实例的x(l)x^{(l)}坐标的中位数为切分点,将该节点对应的超矩形区域切分为两个子区域,切分由通过切分点并与坐标轴x(l)x^{(l)}垂直的超平面实现。
\quad由该节点生成深度为j+1的左、右子节点:左子节点对应坐标x(l)x^{(l)}小于切分点的子区域,右子节点对应于坐标x(l)x^{(l)}大于切分点的子区域。将落在切分超平面上的实例点保存在该节点。
(3)直到两个子区域没有实例存在时停止,从而形成kd树的区域划分。
4.2 搜索kd树
算法(用kd树的最近邻搜索):
输入:以构造的kd树;目标点x;
输出:x的最近邻。
(1)在kd树中找出包含目标点x的叶节点:从根节点出发,递归地乡下访问kd树。若目标点x当前维的坐标小于切分点的坐标,则移动到左子节点,否则移动到右子节点。直到子节点为叶节点为止。
(2)以此叶节点为“当前最近点”。
(3)递归地向上回退,在每个节点进行以下操作:
\quad(a)如果该节点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”。
\quad(b)当前最近点一定存在与该节点一个子节点对应的区域。检查该子节点的父节点的另一个子节点对应的区域是否有更近的点。具体地,检查另一子节点对应的区域是否与以目标点为球心,以目标点与“当前最近点”间的距离为半径的超球体相交。如果相交,可能在另一个子节点对应的区域内存在距离目标点更近的点,移动到另一个子节点。接着,递归进行最近邻搜索;如果不相交,向上回退。
(4)当回退到根节点时,搜索结束,最后的“当前最近点”即为x的最近邻点。
5. KNN算法的优缺点
优点:
- 简单有效
- 对数据的分布没有要求
- 训练阶段很快
缺点:
- 不产生模型,在发现特征之间关系上的能力有限
- 分类阶段很慢
- 需要大量的内存
- 名义变量(特征)和缺失数据需要额外处理
6. R语言中的KNN算法实现
KNN分类语法
应用class包中的函数knn():
创建分类器并进行预测:
p <- knn(train,test,class,k)
- train: 一个包含数值型训练数据的数据框
- test: 一个包含数值型测试数据的数据框
- class(cl): 包含训练数据每一行分类的一个因子向量
- k: 标识最近邻数目的一个整数
该函数返回一个因子向量,该向量含有测试数据框中的每一行的预测分类。
K近邻法算法(KNN)及其R实现相关推荐
- 机器学习(二):k近邻法(kNN)
引言 一.k近邻法的三要素 1.距离度量 2.k值的选择 3.分类决策规则 二.k近邻算法及代码实现(python) 1.算法 2.代码实现(python) 三.k近邻法的实现:kd树 1.构造kd树 ...
- 经典机器学习算法:k近邻法
基于李航教授的<统计学习方法>,本博客为个人学习笔记. 只记录精华,不讲废话,让看过或没看过的你和我短时间重新领悟该方法. k近邻法(knn)与k-means的比较: 两者共同点: 1.k ...
- 【机器学习】《统计学习方法》学习笔记 第三章 k近邻法
第三章 k k k 近邻法(KNN) 多分类模型,思路是将最近的 N N N 个邻居的分类值中的多数作为自己的分类值.没有显式的学习过程. 三个基本要素:距离度量. k k k 值选择和分类决策规则. ...
- 机器学习-监督学习之分类算法:K近邻法 (K-Nearest Neighbor,KNN)
目录 KNN概述 举个例子: K值选取 距离计算 曼哈顿距离,切比雪夫距离关系(相互转化) k-近邻(KNN)算法步骤 相关代码实现 简单实例:判断电影类别 创建数据集 数据可视化 分类测试 运行结果 ...
- 3. k 近邻法 k-NN
1. k k k-NN k k k-NN 是一种基本的监督学习方法,它和感知机有些不同.具体地,它没有一个明确策略,也就是没有损失函数,因此它没有一个显式的学习过程. 1.1 模型概述 k k k-N ...
- R语言机器学习(1)-R的近邻分析—K近邻法
转载请注明出处:https://blog.csdn.net/xiezhiliang22 对应书籍:<R数据挖掘>薛薇 中国人民大学出版社 1 前言 下面这几个部分主要讲述如何使用R语言来实 ...
- 机器学习基础 KNN(K近邻)算法及sklearn的基本使用(附带一些基础概念)
文章目录 一. K-近邻算法简介 1. 什么是K-近邻算法 1.1 K-近邻算法(KNN)概念 1.2 电影类型分析 1.3 KNN算法流程总结 2. 小结 二.K近邻算法api初步使用 1. Sci ...
- K近邻法(KNN)原理小结
K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出 ...
- K 近邻法(K-Nearest Neighbor, K-NN)
文章目录 1. k近邻算法 2. k近邻模型 2.1 模型 2.2 距离度量 2.2.1 距离计算代码 Python 2.3 kkk 值的选择 2.4 分类决策规则 3. 实现方法, kd树 3.1 ...
最新文章
- 为什么获取crm服务器信息失败,为 Outlook 配置 Microsoft Dynamics CRM 客户端时出现 与 Microsoft Dynamics CRM 服务器通信时出现问题 错误...
- 计划策略的配置参数(2)
- 在终端执行 Python 代码的 6 种方法,原来还能这样!
- Python将JSON格式数据转换为SQL语句以便导入MySQL数据库
- Python稳基修炼的经典案例7(计算机二级、初学者必须掌握的例题)
- java -jar 指定端口_「Linux命令」-Java程序员需要掌握的10个命令
- 毕啸南专栏 | 对话李开复:AI科学家的转型之路
- python如何写代码_如何写出优雅的Python代码?
- python面试资格确认_Python面试必须要看的15个问题
- python的数值类型和运算符_python学习笔记之数据类型---数字类型及运算符
- 关于翻译书籍版权的讨论
- MSDN URL 重写
- 人工智能中常用的词汇
- informatic动态变量的创建和使用
- 如何批量修改文件夹名称排序?
- 6410 UBOOT 支持SD/SDHC卡启动 FAT32文件系统 yaffs2烧录 图片显示烧录状态
- axure中继器求和_axure中继器使用方法图文详解
- js 校验手机号码格式
- 解决高度塌陷的几种方法
- C#实现全盘扫描,找到符合要求的文件,并把路径写入到TXT中