一、KNN简单介绍
简单理解就是“近朱者赤近墨者黑”,根据邻近数据来判断未知样本的类别。
1.实现原理
为了判断未知样本的类别,以所有已知类别的样本作为参照,计算未知样本与所有已知样本的距离,从中选取与未知样本距离最近的K个已知样本,根据少数服从多数的投票法则(majority-voting),将未知样本与K个最邻近样本中所属类别占比较多的归为一类。
补充:K这个字母的含义就是要选取的最邻近样本实例的个数。(K的取值很重要!!!)
由于KNN最邻近分类算法在分类决策时只依据最邻近的一个或者几个样本的类别来决定待分类样本所属的类别,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
2.KNN算法关键
(1) 样本的所有特征要做归一化处理。
(2)需要运用一个合适的距离函数计算两个样本之间的距离(公式:欧氏距离或者曼哈顿距离)
(3)k值的确定-- 太大易引起欠拟合,太小容易过拟合,需交叉验证确定K值。
3.KNN算法的优缺点
优点
(1)简单易懂。
(2)无需训练过程。(它直接利用已有的训练数据进行分类或回归预测)
(3)适用于多类别问题。(KNN算法不受类别数目的限制)
(4)对于不平衡数据集有效。(因为它不假设数据分布的先验知识)
缺点
(1)计算复杂度,对每一个样本都要计算它到一直样本的距离。(可以先对样本的某些无用样本进行删除,不计入算法)
(2)不适合大规模数据集。当样某类样本容量过大,其他类的样本容量过小时,算法所获得的K个邻近值多数为过大容量的样本类别。(可以对K邻近点进行加权,近权大,远权小)
二 knn实例
1.代码流程
(1)收集数据:数据集生成器
(2)准备数据:
(3)分析数据:使用画图工具
(4)训练算法:此步骤不适用于k近邻算法。
(5)测试算法:选定文本文件中的部分数据作为测试样本。
# 导入画图工具
import matplotlib.pyplot as plt
# 导入数组工具
import numpy as np
# 导入数据集生成器
from sklearn.datasets import make_blobs
# 导入KNN 分类器
from sklearn.neighbors import KNeighborsClassifier
# 导入数据集拆分工具
from sklearn.model_selection import train_test_split
# 生成样本数为500,分类数为5的数据集
data=make_blobs(n_samples=500, n_features=2,centers=5, cluster_std=1.0, random_state=8)
X,Y=data
# 将生成的数据集进行可视化
# plt.scatter(X[:,0], X[:,1],s=80, c=Y, cmap=plt.cm.spring, edgecolors='k')
#plt.show()
clf = KNeighborsClassifier()
clf.fit(X,Y)
# 绘制图形
x_min,x_max=X[:,0].min()-1,X[:,0].max()+1
y_min,y_max=X[:,1].min()-1,X[:,1].max()+1
xx,yy=np.meshgrid(np.arange(x_min,x_max,.02),np.arange(y_min,y_max,.02))
z=clf.predict(np.c_[xx.ravel(),yy.ravel()])
z=z.reshape(xx.shape)
plt.pcolormesh(xx,yy,z,cmap=plt.cm.Pastel1)
plt.scatter(X[:,0], X[:,1],s=80, c=Y, cmap=plt.cm.spring, edgecolors='k')
plt.xlim(xx.min(),xx.max())
plt.ylim(yy.min(),yy.max())
plt.title("Classifier:KNN")
# 把待分类的数据点用五星表示出来
plt.scatter(0,5,marker='*',c='red',s=200)
# 对待分类的数据点的分类进行判断
res = clf.predict([[0,5]])
plt.text(0.2,4.6,'Classification flag: '+str(res))
plt.text(3.75,-13,'Model accuracy: {:.2f}'.format(clf.score(X, Y)))
plt.show()
2.总结
数据的归一化处理分为 :最值归一化(把所有的数据映射到0~1之间)
均值-方差归一化(把所有数据归一到均值为0方差为1的分布中)