一. 什么是K近邻法
给定一个训练数据集,对于新的输入实例,找到与该实例最邻近的K个实例,这K个实例大多数属于的某个类,就是这个实例所属的类别。
所以算法的前提是需要有一个已经被标记类别的训练数据集。
二. KNN的三要素
2.1 K值的选取
(1)k值设置过少
k值设置过小会降低分类精度;若选择比较小的k值,只有和输入实例比较接近的点才会对预测结果产生影响。若输入的实例附近恰好为噪声,分类就有可能出错,极有可能出现过拟合。
(2)k值设置过大
假如将k值设置为和样本的规模相同,那么实例永远被分到样本最多的类别。
(3) 经验规则
k值选取一个比较小的数值。通常选用交叉验证的方法选取最优k值。
2.2距离的度量
假设数据有n维,则距离的定义为:
这里p>=1,当p=1时,称为曼哈顿距离;当p=2时,称为欧氏距离,一般使用欧氏距离。
2.3 分类决策规则
kNN的分类规则为少数服从多数的表决规则。即前k个距离最近的点中,样本类别归属最多的类别就是实例样本的类别。
三. 应用sklearn对kNN算法的调用
import numpy as np
from sklearn import neighbors
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris =datasets.load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=0)
knn = neighbors.KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='uniform')
knn.fit(X_train, y_train)
knn.score(X_test,y_test)
输出结果:0.966.....
采用10折交叉验证
from sklearn.model_selection import cross_val_score
scores = cross_val_score(knn,iris.data, iris.target, cv=10)
scores.mean()
输出结果:0.966....
其中,KNeighborsClassifier方法中含有8个参数,以下两个最常用:
n_neighbors: k的取值,默认为5
weights:确定近邻的权重,'uniform'权重一样,'distance'权重为距离的倒数。默认为'uniform'
四. 总结
- kNN没有明显的学习过程,属于惰性学习方法。
- kNN适合于多分类问题,当维数比较大的时候,比SVM快
- k值较小对局部数据敏感,抗噪能力差;k值过大,会因为数据集的不平衡而导致分类出错
- 当数据量较大时,计算量较大,因为对于每个样本的分类都进行全局的计算
- kNN适合于文本分类、模式识别、聚类分析、多分类领域