k近邻算法实现手写体数字识别

代码及配套资源已上传到百度网盘
链接: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维空间中两个点之间的真实距离,或者向量的自然长度(即该点到原点的距离)。在二维和三维空间中的欧氏距离就是两点之间的实际距离



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
k-近邻分类器是一种简单而直观的机器学习算法,可以用于手写体数字识别。这个问题可以通过以下步骤来解决: 1. 数据集准备:首先,我们需要一个手写数字数据集。通常,我们可以使用著名的MNIST数据集,其中包含了大量的手写数字样本。每个样本是一个28x28像素的灰度图像,标记了对应的数字标签。 2. 特征提取:对于每个样本,我们需要将其转换为特征向量。在处理图像数据时,常用的方法是将每个像素的灰度值作为特征。因此,对于MNIST数据集中的每个样本,我们可以得到一个784维的特征向量。 3. 训练阶段:在训练阶段,我们需要利用已知标签的样本来构建一个k-近邻分类器。k-近邻分类器的核心思想是,对于一个未知样本,我们将其与训练样本中的所有样本进行距离计算,并选取距离最近的k个样本。然后,通过投票的方式来确定未知样本的标签。在这个过程中,我们可以使用欧氏距离或其他相似性度量来度量样本之间的距离。 4. 测试阶段:在测试阶段,我们可以利用分类器来对未知样本进行预测。对于一个未知样本,我们可以计算其与训练样本的距离,并选择距离最近的k个训练样本。然后,通过投票来确定未知样本的标签。 5. 性能评估:为了评估分类器的性能,我们可以使用一些评估指标,如准确率、精确率、召回率等。这些指标可以帮助我们了解分类器的预测能力和对不同数字的分类准确性。 总之,通过使用k-近邻分类器,并结合适当的数据集和特征提取方法,我们可以实现手写体数字识别。这个方法简单易用,适用于初学者和小规模的手写体数字识别任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值