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

KNN算法

"物以类聚,人以群分"相似的数据往往拥有相同的类别

其大概原理就是一个样本归到哪一类,当前样本需要归到频次最高的哪个类去

也就是说有一个待分类的样本,然后跟他周围的k个样本来看,k中哪一个类最多,待分类的样本就是哪一个。

那就以手写数字识别为例吧

c 复制代码
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=k
        self.label_num=label_num #类别的数量
    def fit(self,x_train,y_train):
        self.x_train=x_train
        self.y_train=y_train
    def get_knn_indices(self,x): #获得距离目标样本最近的k个点的标签,a来做self_x.train
        dis=list(map(lambda a:distance(a,x),self.x_train))
        knn_indices=np.argsort(dis) #对距离排序,在选择k个出来
        knn_indices=knn_indices[:self.k]#标签
        return knn_indices
     def 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]+=1
         return 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}%')
相关推荐
虹科网络安全8 分钟前
艾体宝方案 | 释放数据潜能 · 构建 AI 驱动的自动驾驶实时数据处理与智能筛选平台
人工智能·机器学习·自动驾驶
70asunflower1 小时前
基于锚点(聚类)的LLM微调
机器学习·数据挖掘·聚类
浅念-1 小时前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法
Hcoco_me1 小时前
大模型面试题84:是否了解 OpenAI 提出的Clip,它和SigLip有什么区别?为什么SigLip效果更好?
人工智能·算法·机器学习·chatgpt·机器人
burning_maple1 小时前
mysql数据库笔记
数据库·笔记·mysql
hkNaruto1 小时前
【AI】AI学习笔记:LangGraph 与 LangChain的关系以及系统性学习路线选择
笔记·学习·langchain
jrlong2 小时前
DataWhale大模型基础与量化微调task3学习笔记(第 5章:深入大模型架构_MoE 架构解析)
笔记·学习
BHXDML2 小时前
第九章:EM 算法
人工智能·算法·机器学习
q_35488851532 小时前
AI大模型:python新能源汽车推荐系统 协同过滤推荐算法 Echarts可视化 Django框架 大数据毕业设计(源码+文档)✅
大数据·人工智能·python·机器学习·信息可视化·汽车·推荐算法
wdfk_prog3 小时前
[Linux]学习笔记系列 --[drivers][base]map
linux·笔记·学习