机器学习之分类方法K近邻(KNN)
Posted 小磊要努力哟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习之分类方法K近邻(KNN)相关的知识,希望对你有一定的参考价值。
文章目录
一、原理
1、基本思想及步骤
- k近邻(KNN)是一种基本分类与回归方法,属于有监督学习(带有标签)。分类问题中的k紧邻,输入的是实例的特征向量(特征空间的点),输出的是实例的类别,可以取多类。它的原理很简单,就是服从多数原则。详细来说:给定一个数据集,其中的实例类别已定,在训练数据集中找到与目标实例最近的k各实例,这k个实例若大多数属于某个类别,就把目标实例归分为这个类别。看个例子,就明白了。
- 蓝色方块和红色三角属于给定的数据集,绿色圆圈为待分类,现在让我们分析以下这个绿色圆圈到底属于哪个类?
- 若k=3,则与绿色圆圈最近的有两个红色三角和一个蓝色方块,根据服从多数原则,我们将绿色圆圈划分到红色三角里;若k=5,则与绿色圆圈最近的有两个红色三角和三个蓝色方块,根据服从多数原则,我们将绿色圆圈划分到蓝色方块里;由此可知,待分类数据到底属于哪一类根据k值的不同而不同。
- 步骤:
- 输入:训练集 T = ( x i , y 1 ) , ( x 2 , y 2 ) , … … , ( x n , y n ) T=(x_i,y_1),(x_2,y_2),……,(x_n,y_n) T=(xi,y1),(x2,y2),……,(xn,yn),其中 x i x_i xi为实例的特征向量, y i y_i yi 是实例的真实类别;待分类数据特征向量为x。
- 输出:待分类x的类别y。
- (1)根据给定的距离度量,在训练集T中找出距离实例x最近的k个点。
- (2)在这k个点中根据分类原则(如多数表决)决定x的类别。
- k近邻的特殊情况是k=1的情形,成为最近邻算法。
- 现在我们就基本上理解K近邻的原理了,很简单吧,但其中的K值怎么选取,是K近邻的一大难点,还有两点间的距离选择哪个距离度量和分类决策原则(大部分运用多数表决规则 = 经验风险最小化)呢,也是其中我们需要思考的。
- 缺点:样本不平衡时即一类样本数量远远多于另一类样本,导致虽然离样本距离小的训练样本少,但大容量类的样本占据较大的数量时会导致分类错误。
2、距离度量
-
距离度量主要有三种计算方法:欧氏距离、曼哈顿距离和切比雪夫距离。
-
特征空间中两个实例间的距离是两个实例点相似程度的反映。一般情况下,我们使用的都是欧式距离,但也可以是其他距离,例如更一班的 L p L_p Lp距离或者Minkowski距离。前提要进行归一化。
-
设特征空间 χ \\chi χ是n维实数向量空间 R n R^n Rn, x i , x j ∈ χ x_i,x_j \\in\\chi xi,xj∈χ, x m = ( x i ( 1 ) , x i ( 2 ) , … x i ( n ) ) T , m = i , j x_m=(x_i^(1),x_i^(2),…x_i^(n))^T,m=i,j xm=(xi(1),xi(2),…xi(n))T,m=i,j ,则 x i , x j x_i,x_j xi,xj的 L p L_p Lp距离为:
L p ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ p ) 1 p , p > = 1 L_p(x_i,x_j) =(\\sum_l=1^n|x_i^(l)-x_j^(l)|^p)^\\frac 1 p ,p>=1 Lp(xi,xj)=(l=1∑n∣xi(l)−xj(l)∣p)p1,p>=1 -
当p = 1 时,则为曼哈顿距离,即:
L 1 ( x i , x j ) = ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ L_1(x_i,x_j) =\\sum_l=1^n|x_i^(l)-x_j^(l)| L1(xi,xj)=l=1∑n∣xi(l)−xj(l)∣ -
当p = 2 时,则为欧氏距离,即:
L 2 ( x i , x j ) = ( ∑ l = 1 n ∣ x i ( l ) − x j ( l ) ∣ 2 ) 1 2 L_2(x_i,x_j) =(\\sum_l=1^n|x_i^(l)-x_j^(l)|^2)^\\frac 1 2 L2(xi,xj)=(l=1∑n∣xi(l)−xj(l)∣2)21 -
当p = ∞ \\infty ∞ 时,则为切比雪夫距离,即:
L ∞ ( x i , x j ) = m a x l ∣ x i ( l ) − x j ( l ) ∣ L_\\infty(x_i,x_j) =max_l|x_i^(l)-x_j^(l)| L∞(xi,xj)=maxl∣xi(l)−xj(l)∣
3、K值的选取
-
k值得选取会对k近邻得结果产生很大的影响。
-
如果k值很小,就相当于在很小的领域中训练实例进行预测,学习的“近似误差”会减小,只有与待分类实例较近(相似得)的训练实例才会对预测结果起到作用,但缺点是学习的估计误差会增大,若邻近实例恰好是噪声,则预测结果肯定是错误得,容易产生过拟合;
-
如果k值较大,就相当于在较大的领域中训练实例进行预测,优点是减小学习的估计误差,这时与待分类实例较远的训练实例(不相似得)也会对预测结果起到作用,是预测结果发生错误。
-
如果K=N,则无论输入什么实例,那么改实例得类别都是训练数据集中数据最多的那个类别,模型过于简单,完全忽略了训练实例中得大量有用信息,不可取。
-
在应用中,通常会取一个较小的值,采用交叉验证选取最优K值。
-
近似误差:对现有训练集的训练误差,关注训练集,如果近似误差过小可能会出现过拟合的现象,对现有的训练集能有很好的预测,但是对未知的测试样本将会出现较大偏差的预测。模型本身不是最接近最佳模型。
-
估计误差:可以理解为对测试集的测试误差,关注测试集,估计误差小说明对未知数据的预测能力好,模型本身最接近最佳模型。
二、python实战
1、回归
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsRegressor
np.random.seed(0)
# 随机生成40个(0, 1)之前的数,乘以5,再进行升序 作为特征x 一维的 方便可视化
X = np.sort(5 * np.random.rand(40, 1), axis=0)
# 创建[0, 5]之间的500个数的等差数列, 作为回归后的测试数据 画出回归线
T = np.linspace(0, 5, 500)[:, np.newaxis]
# 使用sin函数得到y值,并拉伸到一维 (X,y) 形成训练集
y = np.sin(X).ravel()
# y值增加噪声
y[::5] += 1 * (0.5 - np.random.rand(8))
# 设置多个k近邻进行比较
n_neighbors = [1, 3, 5, 8, 10, 40]
# 设置图片大小
plt机器学习之KNN(k近邻)算法