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

机器学习实验一:KNN算法,手写数字数据集(使用汉明距离)(2)

KNN-手写数字数据集:

      使用sklearn中的KNN算法工具包( KNeighborsClassifier)替换实现分类器的构建,注意使用的是汉明距离

 运行结果:(大概要运行4分钟左右)

代码:

import pandas as pd
import os

def hamming(str1, str2):
    if len(str1) != len(str2):
        raise ValueError("两个字符串长度不相等")
    return sum(c1 != c2 for c1, c2 in zip(str1, str2))

def get_train():
    path = 'digits/trainingDigits'
    trainingFileList0 = os.listdir(path)
    trainingFileList = [file[2:] if file.startswith('._') else file for file in trainingFileList0]
    train = pd.DataFrame()
    img = []
    labels = []
    for i in range(len(trainingFileList)):
        filename = trainingFileList[i]
        with open(f'digits/trainingDigits/{filename}', 'r') as f:
            txt = f.read().replace('\n', '')
        img.append(txt)
        filelabel = filename.split('_')[0]
        labels.append(filelabel)
    train['img'] = img
    train['labels'] = labels
    return train

def get_test():
    path = 'digits/testDigits'
    testFileList0 = os.listdir(path)
    testFileList = [file[2:] if file.startswith('._') else file for file in testFileList0]
    test = pd.DataFrame()
    img = []
    labels = []
    for filename in testFileList:
        with open(f'digits/testDigits/{filename}', 'r') as f:
            txt = f.read().replace('\n', '')
        img.append(txt)
        filelabel = filename.split('_')[0]
        labels.append(filelabel)
    test['img'] = img
    test['labels'] = labels
    return test

def handwritingClass(train, test, k):
    n = train.shape[0]
    m = test.shape[0]
    result = []
    for i in range(m):
        dist = []
        for j in range(n):
            d = str(hamming(train.iloc[j, 0], test.iloc[i, 0]))
            dist.append(d)
        dist_l = pd.DataFrame({'dist': dist, 'labels': train.iloc[:, 1]})
        dr = dist_l.sort_values(by='dist')[:k]
        re = dr.loc[:, 'labels'].value_counts()
        result.append(re.index[0])
    result = pd.Series(result)
    test['predict'] = result
    acc = (test.iloc[:, -1] == test.iloc[:, -2]).mean()
    print(f'模型预测准确率为{acc:.5f}')
    return test

# 获取训练集和测试集
train = get_train()
test = get_test()

# 调用函数
handwritingClass(train, test, 3)


http://www.kler.cn/a/105544.html

相关文章:

  • 51单片机的hello world之点灯
  • 【Java技术专题】「入门到精通系列教程」深入探索Java特性中并发编程体系的原理和实战开发指南( 实现可伸缩IO专题)— 上
  • 疯狂java 三-六章
  • 基于 nodejs+vue旅游推荐系统 mysql
  • LeetCode每日一题——2520. Count the Digits That Divide a Number
  • SDL窗口创建以及简单显示(1)
  • 使用ControlNet生成视频(Pose2Pose)
  • 【vue】vue前端、生产(线上)环境请求unicloud云服务空间axios报错
  • 计算机网络整理-简称缩写【期末复习|考研复习】
  • 推荐一个假数据接口网页 适用于示例项目
  • ADC读取数据进入死循环
  • 《动手学深度学习 Pytorch版》 10.4 Bahdanau注意力
  • java-后端调用第三方接口返回图片流给前端
  • 哪一个更好?Spring boot还是Node.js
  • windows 安装小乌龟
  • web - Tomcat服务器
  • C++前缀和算法的应用:从栈中取出 K 个硬币的最大面值和 原理源码测试用例
  • 竞赛 深度学习图像修复算法 - opencv python 机器视觉
  • FreeRTOS 事件标志组 详解
  • 各类统计模型R语言的详细使用教程-R语言的线性回归使用教程