目录
K最近邻法简介
思想
近邻算法,又叫K最近邻(KNN,k-NearestNeighbor)分类算法。
kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
kNN也被称为惰性算法,因为它是基于实例的。kNN是无参数学习(这意味着它不会对底层数据的分布做出任何假设),它是基于实例(意味着我们的算法没有显式地学习模型。相反,它选择的是记忆训练实例)并在一个有监督的学习环境中使用。
KNN算法的用途
kNN算法在类别决策时,只与极少量的相邻样本有关。由于kNN主要依靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类别的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为合适。
kNN算法还可用于回归,通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值,如权值与距离成反比。
优点
1、简单,易于理解,易于实现,无需估计参数,无需训练。
2、适合对稀有事件进行分类。
3、特别适合于多分类问题(multi-modal,对象具有多个类别标签),kNN比SVM的表现要好。
缺点
1、计算量较大,对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。
2、可理解性差,无法给出像决策树那样的规则。
改进策略
分类效率方面
- 事先对样本属性进行约简,删除对分类结果影响较小的属性,快速的得出待分类样本的类别。
- 较适用于样本容量大的类域的自动分类
- 样本容量较小的类域采用这种算法比较容易产生误分。
分类效果方面
- 采用权值的方法(和样本距离小的邻居权值大)来改进。
- 依照训练集合中各种分类的文件数量,选取不同数目的最近邻居,来参与分类。
K的取值
k值小意味着噪声会对结果产生较大的影响,而k值大则会使计算成本变高。
k的取值很大程度上取决于你的实际情况,有些情况下最好是遍历每个可能的k值,然后根据实际来选择k值。
实现
API sklearn.neighbors.KNeighborsClassifier
#导入相关库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#导入数据集
dataset = pd.read_csv('./datasets/Social_Network_Ads.csv')
X = dataset.iloc[ :,[2,3]].values
y = dataset.iloc[ :,4].values
#将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.25, random_state = 0)
#特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)
#使用K-NN对训练集数据进行训练
from sklearn.neighbors import KNeighborsClassifier
#创建KNeighborsClassifier对象
#minkowski inequality闵科夫斯基不等式 p=2时为标准欧几里得度量
classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)
classifier.fit(X_train,y_train) #调用fit函数
#对测试集进行预测
y_pred = classifier.predict(X_test) #调用predict函数进行预测
#生成混淆矩阵
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test,y_pred)
print(cm)
#[[64 4]
#[ 3 29]]