当前位置: 首页 > news >正文

机器学习笔记——K近邻算法、手写数字识别

KNN算法

“物以类聚,人以群分”相似的数据往往拥有相同的类别
其大概原理就是一个样本归到哪一类,当前样本需要归到频次最高的哪个类去
也就是说有一个待分类的样本,然后跟他周围的k个样本来看,k中哪一个类最多,待分类的样本就是哪一个。
那就以手写数字识别为例吧

import matplotlib.pyplot as plt
import numpy as np
import os
#%%
# 读入mnist数据集
m_x = np.loadtxt('./data/mnist_x', delimiter=' ')
m_y = np.loadtxt('./data/mnist_y')
#%%
# 数据集可视化
data = np.reshape(np.array(m_x[0], dtype=int), [28, 28])
plt.figure()
plt.imshow(data, cmap='gray')
#%%
# 将数据集分为训练集和测试集
ratio = 0.8
split = int(len(m_x) * ratio)
# 打乱数据
np.random.seed(0)
idx = np.random.permutation(np.arange(len(m_x))) #随机排序
m_x = m_x[idx]
m_y = m_y[idx]
x_train, x_test = m_x[:split], m_x[split:]
y_train, y_test = m_y[:split], m_y[split:]
#%%
#定义距离函数
def distance(x,y):return np.sqrt(np.sum(np.square(x-y)))#%%
#定义KNN模型
class KNN:def __init__(self,k,label_num):self.k=kself.label_num=label_num #类别的数量def fit(self,x_train,y_train):self.x_train=x_trainself.y_train=y_traindef get_knn_indices(self,x): #获得距离目标样本最近的k个点的标签,a来做self_x.traindis=list(map(lambda a:distance(a,x),self.x_train))knn_indices=np.argsort(dis) #对距离排序,在选择k个出来knn_indices=knn_indices[:self.k]#标签return knn_indicesdef get_label(self,x):#计算k个点中,样本的标签数量是多少knn_indices=self.get_knn_indices(x)label_statistic=np.zeros(shape=[self.label_num])for index in knn_indices:label=int(self.y_train[index])label_statistic[label]+=1return np.argmax(label_statistic) #找出最大的类别def predict(self,x_test):predicted_test_labels=np.zeros(shape=[len(x_test)],dtype=int)for i,x in enumerate(x_test): #枚举predicted_test_labels[i]=self.get_label(x)return predicted_test_labels#%%
for k in range(1,10):knn=KNN(k,label_num=10)knn.fit(x_train,y_train)predicted_labels=knn.predict(x_test)accuracy=np.mean(predicted_labels==y_test)print(f'k的取值为{k},预测准确率为{accuracy*100:.lf}%')

相关文章:

  • 【网络协议】【OSI】一次HTTP请求OSI工作过程详细解析
  • vue详解(4)
  • Android Gradle文件 一次通关
  • 全能集成开发平台Team·IDE
  • MySQL的SQL语句
  • SUPRA:无须额外训练,将Transformer变为高效RNN,推理速度倍增
  • 网络安全等级保护2.0(等保)是什么
  • InTouch历史报警、历史事件按时段查询,导出
  • springboot+vue+mybatis基于java web的公益网站的设计与实现+jsp+PPT+论文+讲解+售后
  • 2000.1-2022.06.17中国经济政策不确定性指数日度数据
  • spring boot3整合邮件服务实现邮件发送功能
  • DB2学习笔记--1
  • grafana + Prometheus + node-exporter + pushgateway + alertmanager的监控解决方案
  • 【大模型】fineturn Q-wen
  • 洛谷 P10374 操作
  • Babel配置的不完全指南
  • Javascript 原型链
  • js继承的实现方法
  • Linux gpio口使用方法
  • OSS Web直传 (文件图片)
  • Python中eval与exec的使用及区别
  • React系列之 Redux 架构模式
  • spring boot 整合mybatis 无法输出sql的问题
  • swift基础之_对象 实例方法 对象方法。
  • 复杂数据处理
  • 如何设计一个比特币钱包服务
  • 使用parted解决大于2T的磁盘分区
  • 消息队列系列二(IOT中消息队列的应用)
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 如何用纯 CSS 创作一个货车 loader
  • ​TypeScript都不会用,也敢说会前端?
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • ## 1.3.Git命令
  • #{} 和 ${}区别
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • $LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams
  • (0)Nginx 功能特性
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Java)【深基9.例1】选举学生会
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (分布式缓存)Redis哨兵
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (论文阅读笔记)Network planning with deep reinforcement learning
  • (三)Kafka 监控之 Streams 监控(Streams Monitoring)和其他
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (数据结构)顺序表的定义
  • (转)linux 命令大全
  • .NET 3.0 Framework已经被添加到WindowUpdate
  • .NET C# 使用 SetWindowsHookEx 监听鼠标或键盘消息以及此方法的坑
  • .NET Core WebAPI中使用swagger版本控制,添加注释