k近邻法
《统计学习方法》李航 第3章 k近邻法
《机器学习》周志华 第10章 降维与度量学习
k近邻法(k-nearest neighbor,k-NN)是一种基本分类与回归方法
输入:实例的特征向量
输出:实例的类别
k近邻法假设给定一个训练数据集,其中的实例类别已定,分类时,对新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测。
即:给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的K个实例,这K个实例的多数属于某个类,就把该输入实例分类到这个类中
实质:利用训练数据集对特征向量空间进行划分,并作为其分类的模型
懒惰学习(lazy learning):没有显示的训练过程,训练时间开销为零,待收到测试样本后再进行处理
k近邻法三要素:
k值的选择、距离度量、分类决策规则
-
3.1 k近邻算法
-
3.2 k近邻模型
1.距离度量:一般使用欧氏距离,不同的距离度量所确定的最近邻点不同
2.k值的选择:
k值小,近似误差会减小,只有与输入实例较近的训练实例才会对预测结果起作用
缺点:“学习”的估计误差增大,预测结果会对近邻的实例点非常敏感,k值的减小意味着整体模型变得复杂,易发生过拟合。
k值大,估计误差会减小
缺点:“学习”的近似误差增大,k值增大意味着整体的模型变得简单
k值一般取一个较小值,通常采用交叉验证法选取最优k值。
3.分类决策规则:
多数表决规则(等价于 经验风险最小化) -
3.3 k近邻法的实现:kd树
1.构造kd树
2.搜索kd树
MOOC 北京理工大学 Python机器学习应用
sklearn中的k近邻分类器
在sklearn库中,可以使用sklearn.neighbors.KNeighborsClassifier 创建一个k近邻分类器,主要参数有:
- n_neighbors:指定k的大小,默认为5
- weights:k个点对分类结果影响的权重
(1)uniform:平均权重(默认)
(2)distance:越近的点权重越大
(3)传入自己编写的以距离为参数的权重计算函数 - algorithm:计算近邻点的方法
(1)auto:根据训练数据自动选择(默认)
(2)ball_tree
(3)kd_tree
(4)brute - metric:距离度量
(1)euclidean:欧式距离(默认)
(2)manhattan:曼哈顿距离
(3)chebyshev:切比雪夫距离
…
e.g.
创建一组数据X和它对应的标签y
X=[[0],[1],[2],[3]] y=[0,0,1,1]
使用import语句导入k近邻分类器
from sklearn.neighbors import KNeighborsClassifier
将创建好的实例赋给变量neigh
neigh=KNeighborClassifier(n_neighbors=3)
调用fit()函数,将训练数据X和标签y送入分类器进行学习
neigh.fit(X,y)
调用predict()函数,对未知分类样本[1.1]进行分类,可以直接将需要分类的数据构造为数组形式作为参数传入,得到的分类标签是返回值
print(neigh.predict([[1.1]]))
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
X=[[0],[1],[2],[3]]
y=[0,0,1,1]
neigh=KNeighborsClassifier(n_neighbors = 3)
neigh.fit(X, y)
print(neigh.predict([[1],[5]]))
输出为:
[0 1]
实际使用
(1)创建数据特征X和标签y,将数据划分为训练集和测试集
(2)使用fit()函数对训练集进行训练
(3)利用predict()函数获得测试集数据的分类结果
k的取值
若k值较小,可能导致过拟合
一般倾向选取较小的k值,使用交叉验证法选取最优k值