代码及配套资源已上传到百度网盘
链接:https://pan.baidu.com/s/1AP9AYSVlnCGzr5LyzxSPcw
提取码:ld6f
注意:本程序中需要的包可以通过pip进行下载
pip install <需要安装的包>
# step1 : scikit-learn自带数据集
# 通过sklearn.datasets.load_digits()来加载
# 包含1797个样本,每个样本包括8*8像素的图像和一个【0,9】整数的标签
# step2 : 算法选择-K近邻算法
# K近邻算法假设给定一个训练数据集,其中的实例类别已定,
# 分类时,对新的实例,根据其K个最近的训练实例的类别,
# 通过多数表决等方式进行预测
# 距离新的图片最近的k张已知图片,求新的图片的类别,假如k=10
# 7张属于5类别,2张属于3类别,1张属于2类别,所以新的图片类别是5
from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集
sample_data=datasets.load_digits()
# 对数据进行分类:训练集(80%)和测试集(20%),用四个变量接受
train_data,test_data,train_target,test_target=train_test_split(sample_data.data,sample_data.target,test_size=0.2)
# 实例化一个模型,参数n_neighbors即为参数K =》 影响误差
knn_model=KNeighborsClassifier(n_neighbors=8)
# 训练模型
knn_model.fit(train_data,train_target)
# 应用模型进行预测
pred=knn_model.predict(test_data)
print(pred[0:9])
print(test_target[0:9])
for r in range(0,1791):
print(sample_data.images[r])
print('共训练了%d个样本'%r)
# 对预测结果进行评分
acc=accuracy_score(pred,test_target)
print('准确度: '+str(acc*100)+'%')
# 0.9861111111111112
# # 看看数据集的前几张图片都属于哪个类
# print(sample_data.target[0:6])
# # [0 1 2 3 4 5]
#
# # 看看第二张图片
# print(sample_data.images[1])
# # [[ 0. 0. 0. 12. 13. 5. 0. 0.]
# # [ 0. 0. 0. 11. 16. 9. 0. 0.]
# # [ 0. 0. 3. 15. 16. 6. 0. 0.]
# # [ 0. 7. 15. 16. 16. 2. 0. 0.]
# # [ 0. 0. 1. 16. 16. 3. 0. 0.]
# # [ 0. 0. 1. 16. 16. 6. 0. 0.]
# # [ 0. 0. 1. 16. 16. 6. 0. 0.]
# # [ 0. 0. 0. 11. 16. 10. 0. 0.]]
# # 看看第二张图片本来长什么样子
# # 因为把每张图片都做成了矩阵形式,所以用matshow()
# plt.matshow(sample_data.images[1])
# plt.show()
# KNN算法 伪代码
# 假设x_text为待标记的数据样本,x_train为已标记的数据集,伪代码如下:
# 遍历x_train中的所有样本,计算每个样本与y_test的距离,并把距离保存在 distance数组中
# 对distance进行排序,取距离最近的K个点,几位x_knn
# 在k_nn中统计每个类别的个数,即class_0在k_nn中有几个样本,class_1在x_knn中有几个样本
# 待标记样本的类别,就是在x_knn中样本个数最多的那个类别
# 算法参数: K
# 距离一般用欧式距离或者曼哈顿距离
# 欧氏距离:|x| = √( x[1]2 + x[2]2 + … + x[n]2 )
# 定义:欧几里得度量(euclidean metric)(也称欧氏距离)是一个通常采用的距离定义,指在m维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离