1、kNN算法实现原理:
(1)计算数据点与训练集数据之间的距离:
欧式距离:distance = ((xa1-xb1)**2+(xa2-xb2)**2)**0.5
(2)确定前k个距离最小的数据的分类类别
(3)在这k个分类类别里,频率最高的类别为该数据点的分类类别
2、k值选择:
(1)k值太小,容易过拟合
(2)k值太大,容易欠拟合
(3)用交叉验证的方式选择k值
3、kNN实战流程:
(1)加载数据
(2)准备数据:数据探索、数据可视化、数据规范化
(3)特征选择
(4)模型训练
(5)模型评估
(6)使用模型
4、sklearn工具包:
(1)分类工具导入:
from sklearn.neighbors import KNeighborsClassifier
(2)回归工具导入:
from sklearn.neighbors import KNeighborsClassifier
(3)KNeighbersClassifier构造参数:
n_neighber:即k,默认为5
weights:确定邻居的权重,uniform(权重相同),distance(与距离成反比),或者自定义函数
algorithm: 用来确定计算邻居的方法,默认为auto
(4)功能函数:
fit(train_x, train_y):训练分类器模型
predict(test_x):用训练好的分类模型进行预测
5、实战项目:手写识别系统
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_digits
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
# 加载数据
digits = load_digits()
data = digits.data
# 数据探索
print(data.shape)
# 查看第一幅图像
print(digits.images[0])
# 第一幅图像代表的数字
print(digits.target[0])
# 将第一幅图像显示出来
plt.gray()
plt.imshow(digits.images[0])
plt.show()
# 分割数据,75%数据作为训练集,其余作为测试集
train_x, test_x, train_y, test_y = train_test_split(data, digits.target, test_size=0.25, random_state=33)
# 采用z_score规范化数据
ss = preprocessing.StandardScaler()
train_ss_x = ss.fit_transform(train_x)
test_ss_x = ss.transform(test_x)
# 创建knn分类器
knn = KNeighborsClassifier()
knn.fit(train_ss_x, train_y)
predict_y = knn.predict(test_ss_x)
print('knn的准确率为:%.4lf'% accuracy_score(test_y, predict_y))