本文主要是介绍机器学习3:K近邻法K-Nearest-Neighbor Classifier/KNN(基于R languagePython),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
k k k 近邻法是一种基本分类与回归问题。 k k k 近邻法的输入为实例的特征向量,对应于特征空间中的点;输出为实例的类别,可以取很多类。 k k k 近邻法假设给定一个训练数据集,其中的实例类别已定。分类时,对新的实例,根据其 k k k 个最近邻的训练实例的类别,通过多数表决等方式进行预测。因此, k k k 近邻法不具有显式的学习过程。 k k k 近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的“模型”。 k k k 近邻法的三个要素是: k k k 值的选择、距离度量及分类决策规则1。
K近邻法
- 基本原理方法
- k k k 近邻法概述
- 定量变量标准化
- 距离度量
- 定量变量的距离度量
- 定性变量的距离度量
- 缺失值的距离度量
- k k k 值的选择
- 分类决策规则
- KNN分类问题
- 多数表决规则
- 加距离权重的多数表决规则(博主绞尽脑汁搞懂了核函数加权法)
- KNN回归问题
- k k k 近邻法特点
- 优点
- 缺点
- k k k 近邻法评估
- 手算例子
- 代码:R语言
- 分类问题:投票无加权+自变量为定量变量
- 分类问题:投票有加权+自变量为定量变量(手算问题核验)
- 回归问题:有加权+训练集为混合性数据
- 回归问题:有加权+训练集为混合性数据+含缺失数据
- 代码:Python
- sklearn库的KNeighborsClassifier函数简介
- 分类问题:定量变量的情况
- 等权重
- 按距离加权
- 分类问题:定性变量的情况
- 独热编码
- Iris数据调参案例
- Iris数据画分类效果图案例
- 参考资料
基本原理方法
k k k 近邻法概述
k k k 近邻法的算法如下:
输入:训练集 D = { ( x i , y i ) } i = 1 N D=\{(x_i,y_i)\}_{i=1}^N D={(xi,yi)}i=1N ,其中 x i x_i xi 为实例的特征向量, y i y_i yi 为实例的类别
输出:实例 x x x 所属的类别 y y y
(1)根据给定的距离度量,在训练集 D D D 中找出与 x x x 最近邻的 k k k 个点,涵盖这 k k k 个点的 x x x 的邻域称为 N k ( x ) N_k(x) Nk(x);
(2)在 N k ( x ) N_k(x) Nk(x) 中根据分类决策规则(如多数表决)决定 x x x 的类别 y y y: y = a r g m a x c j ∑ x i ∈ N k ( x ) I ( y i = c j ) , i = 1 , 2 , ⋯ , N ; j = 1 , 2 , ⋯ , K y=argmax_{c_j}\sum_{x_i\in N_k(x)} I(y_i=c_j),i=1,2,\cdots,N;j=1,2,\cdots,K y=argmaxcj∑xi∈Nk(x)I(yi=cj),i=1,2,⋯,N;j=1,2,⋯,K,即有 K K K 种类别。
k k k 近邻法是一种惰性学习算法,它存储训练集实例但并没有立刻进行建模,直到获得测试集,必须对其进行分类为止才开始进行建模。
懒惰学习算法:只存储训练数据(或仅进行少量处理)但并不马上进行建模,等到给出测试集才开始建模。
与之相反地,
积极学习算法:给定训练集就立马进行建模,再接收新的测试数据在建立好的模型上进行预测。
懒惰学习算法与积极学习算法的比较 | |
---|---|
时间成本 | 懒惰学习算法训练花的时间更少,但预测花的时间更多 |
准确率 | 惰性学习算法有效地使用了更丰富的假设空间,因为它使用了许多局部线性函数来形成对目标函数的隐式全局近似;积极学习算法则必须遵循涵盖整个实例空间的一个单一假设 |
除了 k k k 近邻法之外,典型的惰性学习算法还有局部加权回归、构造局部近似、基于案例的推理和使用符号表示和基于知识的推理。
KNN算法需要有四个步骤:
- 定量变量标准化
- 距离度量
- 定义邻居个数 k k k
- 预测
- 分类问题:多数投票 Majority Vote
- 回归问题:把邻居的取值平均 Averaging
定量变量标准化
由于计算距离时,会涉及到将变量所有维度相加的计算,故需要对每个变量进行标准化。否则,因为尺度不同的原因,尺度比较大的变量比尺度比较小的变量会有更大的影响。
在叙述具体怎么做标准化之前,有一个重中之重的提醒:训练集标准化完了以后,测试集的标准化是要利用训练集标准化的“工具”来进行的!例如中心标准化,测试集标准化必须用训练集数据的均值和标准差,这是因为在建好模型预测之前是不可以动用测试集的信息的,一切信息只能来源于训练集。
标准化方法主要有两种,一种是 m i n − m a x min-max min−max 归一化(归一化后数据被缩放到 [ 0 , 1 ] [0,1] [0,1] 范围内):
x n o r m a l i z a t i o n = x − m i n ( x ) m a x ( x ) − m i n ( x ) x_{normalization}=\frac{x-min(x)}{max(x)-min(x)} xnormalization=max(x)−min(x)x−min(x)
另一种是 z − s c o r e z-score z−score 标准化:
x s t a n d a r d i z a t i o n = x − m e a n ( x ) s t d ( x ) x_{standardization}=\frac{x-mean(x)}{std(x)} xstandardization=std(x)x−mean(x)
距离度量
定量变量的距离度量
特种空间中两个实例点的距离是两个实例点相似程度的反映。 k k k 近邻模型的特征空间一般是 n n n 维实数向量空间 R n \textbf{R}^n Rn,使用的是欧式距离。一般地,有两种距离度量方式:欧式距离和闵氏距离。
特征空间中两点的欧式距离为:
d ( x i , x j ) = ∑ l = 1 m ( x i ( l ) − x j ( l ) ) 2 d(x_i,x_j)=\sqrt{\sum_{l=1}^m (x_i^{(l)}-x_j^{(l)})^2} d(xi,xj)=l=1∑m(xi(l)−xj(l))2
其中 x i = ( x i 1 , x i 2 , ⋯ , x i m ) x_i=(x_i^{1},x_i^{2},\cdots,x_i^{m}) xi=(xi1,xi2,⋯,xim);
特征空间中两点的曼哈顿距离为:
d ( x i , x j ) = ∑ l = 1 m ∣ x i ( l ) − x j ( l ) ∣ d(x_i,x_j)=\sum_{l=1}^m \mid x_i^{(l)}-x_j^{(l)} \mid d(xi,xj)=l=1∑m∣xi(l)−xj(l)∣
特征空间中两点的闵氏距离为:
d ( x i , x j ) = ( ∑ l = 1 m ∣ x i ( l ) − x j ( l ) ∣ p ) 1 p d(x_i,x_j)=(\sum_{l=1}^m \mid x_i^{(l)}-x_j^{(l)} \mid ^p)^{\frac{1}{p}} d(xi,xj)=(l=1∑m∣xi(l)−xj(l)∣p)p1
以下图为例,绿色的直线代表两点之间的欧式距离,而红色和黄色的线为两点的曼哈顿距离。感受一下两者的不同2:
定性变量的距离度量
定性变量就是属于同一类别的亮点距离为0,属于不同类别的两点距离为1(0-1距离)。
举例说明定性变量的距离度量,X={red},Y={red},Z={blue},d(X,Y)=0,d(X,Z)=1。
缺失值的距离度量
定性变量在0-1距离度量下,取值若为缺失值的点的距离定义:
x1 | x2 | 距离 |
---|---|---|
缺失值 | - | 1 |
- | 缺失值 | 1 |
缺失值 | 缺失值 | 1 |
定量变量在0-1正则化后,取值若为缺失值的点的距离定义:
x1 | x2 | 距离 |
---|---|---|
缺失值 | - | max(x2,1-x2) |
- | 缺失值 | max(x1,1-x1) |
缺失值 | 缺失值 | 1 |
k k k 值的选择
k k k 值的选择会对 k k k 近邻法的结果产生重大影响。
如果选择较小的 k k k 值,即用较小的邻域中的训练集实例进行预测。会导致学习的近似误差(bias)减小——只有与输入实例较近的(相似的训练实例)才会对预测结果起作用;但缺点是学习的估计误差(variance)会增大——预测结果会对近邻的实例点非常敏感:只要变换一下训练集中的实例,邻居实例就会变化很大,从而导致预测结果变化很大。
换句话说, k k k 值的减少就意味着整体模型变得复杂,容易发生过拟合。
如果选择较大的 k k k 值,即用较大的邻域中的训练集实例进行预测。其优点是可以减少学习的估计误差,但缺点是学习的近似误差会增大。这时与输入实例较远的(不相似的)训练实例也会对预测起作用,是预测发生错误。
换句话说, k k k 值的增大就意味着整体模型变得简单。
在应用中, k k k 值一般取取 3~10 或取 n 训 练 集 \sqrt{n_{训练集}} n
这篇关于机器学习3:K近邻法K-Nearest-Neighbor Classifier/KNN(基于R languagePython)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!