KNN算法实例---手写数字识别

来源:互联网 发布:教学过程最优化理论 编辑:程序博客网 时间:2024/05/01 21:29

先介绍两个距离公式,欧式距离和夹角余弦。

  • 欧式距离:
    欧式距离是最易理解的一种距离计算方法,源自欧式空间中两点间的距离公式(如图1.9)。目的是计算其间的整体距离即不相似性,距离越近就越相似。
    这里写图片描述

  • 夹角余弦:
    几何中夹角余弦可用来衡量两个向量方向的差异,机器学习中借用这一概念来衡量样本向量之间的差异(如图1.10)。
    这里写图片描述
    这里写图片描述
    夹角余弦取值范围 [ -1,1]。夹角余弦越大表示两个向量的夹角越小,夹角余弦越小表示两向量的夹角越大。当两个向量的方向重合时夹角余弦取最大值1,当两个向量的方向完全相反夹角余弦取最小值-1。

  • 数据准备:
    trainingDigits:训练数据,1934个文件,每个数字大约200个文件。
    testDigits:测试数据,946个文件,每个数字大约100个文件。

  • 手写数字识别—Python代码一(夹角余弦)

import numpy as npfrom imp import reloadfrom os import listdirimport operatorimport matplotlib.pyplot as plt#将图像转换成测试向量def img2vector(filename):    #创建零向量    returnVec = np.zeros((1,1024))    #打开数据文件,读取每行内容    fr = open(filename,'r')    for i in range(32):        lineStr = fr.readline()        for j in range(32):            returnVec[0,32*i+j] = int(lineStr[j]) #将每行前32字符转成int存入向量    return returnVec#夹角余弦距离公式def cosdist(vector1,vector2):    return np.dot(vector1,vector2)/(np.linalg.norm(vector1) * np.linalg.norm(vector2))#KNN实现分类器---测试集:testdata, 训练集:trainSet,类别标签:labels,k:k个邻居数  def classify(testdata,trainSet,labels,k):    dataSetSize = trainSet.shape[0] #返回样本集的行数    distances = np.array(np.zeros(dataSetSize))    for indx in range(dataSetSize):   #计算测试集与训练集之间的距离:夹角余弦        distances[indx] = cosdist(testdata,trainSet[indx])    #夹角余弦按从大到小排序,结果为索引号    sortedDistIndicies = np.argsort(-distances)    classCount = {}    #获取前k项作为参考项    for i in range(k):        #按排序顺序返回样本集对应的类别标签        voteIlabel = labels[sortedDistIndicies[i]]        #为字典classCount赋值,相同key,其value加1        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1    #选取出现的类别次数最多的类别    maxCount = 0    for key,value in classCount.items():        if value > maxCount :            maxCount = value            classes = key    return classesdef handwritingClassTest():    #样本数据标签    hwLabels = []    #读取样本数据文件    trainingFileList = listdir(r'E:\python\KNNData\trainingDigits') #读取txt文件名称    m = len(trainingFileList)    #零矩阵    trainingMat = np.zeros((m,1024))    for i in range(m):        fileNameStr = trainingFileList[i]        fileStr = fileNameStr.split('.')[0]        classNumStr = int(fileStr.split('_')[0])        hwLabels.append(classNumStr)        #将样本数据存入矩阵        trainingMat[i,:] = img2vector(r'E:\python\KNNData\trainingDigits\%s' % fileNameStr)    #读取测试数据    testFileList = listdir(r'E:\python\KNNData\testDigits')    errorCount = 0.0  #错误率    mTest = len(testFileList)    for i in range(mTest):        fileNameStr = testFileList[i]        fileStr = fileNameStr.split('.')[0]        classNumStr = int(fileStr.split('_')[0])        #读取数据向量        vectorUnderTest = img2vector(r'E:\python\KNNData\testDigits\%s' % fileNameStr)        classifierResult = classify(vectorUnderTest,trainingMat,hwLabels,1) #测试数据分类        print('KNN算法的分类结果:%d  ,  真实结果:%d' % (classifierResult,classNumStr))        if(classifierResult != classNumStr): errorCount += 1.0    print('k = 1')    print('错误次数:%d' % errorCount)    print('错误率:%f' % (errorCount/float(mTest)))     return hwLabelslabels = handwritingClassTest()print('labels:',set(labels))
  • 代码二(欧式距离)
import numpy as npfrom imp import reloadfrom os import listdirimport operator#将图像转换成测试向量def img2vector(filename):    #创建向量    returnVec = np.zeros((1,1024))    #打开数据文件,读取每行内容    fr = open(filename,'r')    for i in range(32):        lineStr = fr.readline()        for j in range(32):            returnVec[0,32*i+j] = int(lineStr[j]) #将每行前32字符转成int存入向量    return returnVec#KNN实现分类器---测试集:testdata, 训练集:trainSet,类别标签:labels,k:k个邻居数  def classify(testdata,trainSet,labels,k):    dataSetSize = trainSet.shape[0] #返回样本集的行数    #计算测试集与训练集之间的距离:欧式距离    diffMat = np.tile(testdata,(dataSetSize,1))- trainSet       sqDiffMat = diffMat**2    sqDistances = sqDiffMat.sum(axis=1)    distances = sqDistances**0.5    #距离从低到高排序    sortedDistIndicies = distances.argsort()    classCount = {}    #获取前k项作为参考项    for i in range(k):        #按排序顺序返回样本集对应的类别标签        voteIlabel = labels[sortedDistIndicies[i]]        #为字典classCount赋值,相同key,其value加1        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1    #选取出现的类别次数最多的类别    maxCount = 0    for key,value in classCount.items():        if value > maxCount :            maxCount = value            classes = key    return classesdef handwritingClassTest():    #样本数据标签    hwLabels = []    #样本数据文件    trainingFileList = listdir(r'E:\python\KNNData\trainingDigits')    m = len(trainingFileList)    trainingMat = np.zeros((m,1024))    for i in range(m):        fileNameStr = trainingFileList[i]        fileStr = fileNameStr.split('.')[0]        classNumStr = int(fileStr.split('_')[0])        hwLabels.append(classNumStr)        #将样本数据存入矩阵        trainingMat[i,:] = img2vector(r'E:\python\KNNData\trainingDigits\%s' % fileNameStr)    #读取测试数据    testFileList = listdir(r'E:\python\KNNData\testDigits')    errorCount = 0.0  #错误率    mTest = len(testFileList)    for i in range(mTest):        fileNameStr = testFileList[i]        fileStr = fileNameStr.split('.')[0]        classNumStr = int(fileStr.split('_')[0])        #读取数据向量        vectorUnderTest = img2vector(r'E:\python\KNNData\testDigits\%s' % fileNameStr)        classifierResult = classify(vectorUnderTest,trainingMat,hwLabels,3) #测试数据分类        print('KNN算法的分类结果:%d  ,  真实结果:%d' % (classifierResult,classNumStr))        if(classifierResult != classNumStr): errorCount += 1.0    print('k = 3')    print('错误次数:%d' % errorCount)    print('错误率:%f' % (errorCount/float(mTest)))handwritingClassTest()

先导篇–KNN算法介绍

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 国美在线没有信用卡分期不了怎么办 手机店办理分期被老板套现了怎么办 美的空调保修卡丢了怎么办 格力空调保修卡丢了怎么办 荣耀9i手机总是滑手怎么办? 春兰空调没发票不给修怎么办 洗衣机顶盖的安全开关坏了怎么办 苹果手机的开关健坏了怎么办 淘宝买的东西快递弄破损了怎么办 京东购买邮来手机里面没有怎么办 孕期建卡病历本丢了怎么办 四维检查胎儿心脏有缺陷怎么办 七个月的宝宝俩个蛋蛋都疝气怎么办 电脑有些网站看视频不能全屏怎么办 小米滑板车坏了售后不保修怎么办 红米4a电池不耐用怎么办 华为手机买个别人退货的怎么办 京东购物怎么查订单查询不到怎么办 退款了又收到货怎么办快递打电话 快递未收到货能退款商家拒绝怎么办 黑色牛仔裤有一块洗白了怎么办 黑色牛仔裤被洗衣液烧了怎么办 在蘑菇街退鞋子商家非说脏了怎么办 牛皮屑怎么办ke靠成都银康 微信订阅号取消关注之后还在怎么办 腾讯新闻红包领取说帐号异常怎么办 计算机职弥报名没选模块怎么办 有人用我手机注册有赞了怎么办 一件代发别人的货被投诉了怎么办 淘宝极速退款后商家拒收快递怎么办 运费险退到天猫垫付账户了怎么办 淘宝卖家食品有问题该怎么办 美团外卖不要辣椒给放了怎么办 旺旺卖家拒收我的消息怎么办 淘宝清空购物车大奖到上限了怎么办 游戏无响应除了退出还能怎么办 淘宝给差评了卖家一直打电话怎么办 电脑说带宽问题无法观看视频怎么办 手机淘宝上的购买信息删除了怎么办 为什么支付宝有钱淘宝付不了怎么办 苹果平板电脑上的淘宝点不开怎么办