`

MLA Review之一: KNN算法

阅读更多

在看完Machine Learning in Action一书之后,觉得还是需要进行一些回顾,而且由于第一次看的时候Python基础并不牢固,所以这次也当做是Python一些知识回顾和运用的过程。

在回到主题之前插几句话,MLA 一书并不是一本理论著作,相反是使用了一些现成的机器学习方法使用了Python在具体的问题上进行了运用,整书没有使用繁琐的公式和证明过程,属于一本实战类的非学院派著作,因此在网上也有一些人对这本书多有微词,但是不管怎样,作为一个不想搞学术的渣硕,我对偏应用类的东西比较感兴趣,但是终究是要硕士搞搞学术的,所以这一专题也回加一些我所仅知的理论知识。

这是背景,OK,话不多说,回顾这本书的第一章,KNN算法。

 

KNN算法作为一种有监督的学习算法,以其简单易操作,但是时间复杂度和空间复杂度都比较高,其适用的范围为数值型和标称型

 

简单的描述下KNN算法:在给定的训练数据和训练标签情况下,对测试数据进行比较,为了描述简单,我们假设每一个测试数据都是一个向量,训练数据是一个向量组,而且训练数据带有标签。算法是:将测试向量与训练数据的每一个向量进行比较“距离”,选出训练数据中与测试数据向量“距离”最近的K个向量,然后在这K个向量中,统计标签出现的次数,选取次数最高的标签作为测试向量的返回结果。需要说明的是向量之间的距离有多种计算方式,常见的方法是“欧氏距离”,a=(1,2,3),b=(2,3,4),其欧氏距离了就是sqrt((2-1)^2+(3-2)^2+(4-3)^2),和向量空间的计算距离方法差不多。

 

具体问题描述:

手写问题识别:训练数据是多张32*32手写图像的二维矩阵,所谓二维矩阵就是整个图像空白的地方使用0描述,写字的地方使用1描述,现在有一些未经标注的测试图像,已经转换二维矩阵,现在需要识别出其结果。



 

上图就是为0的图像的二维矩阵描述

 

 

KNN代码如下:

 

# -*- coding: UTF8 -*-
"""
KNN算法
author:luchi
date:16/2/4
背景:识别手写数字
"""
from numpy import *
import operator
from os import listdir

#将图片转换成数组
def img2vector(filename):
    returnVect=zeros((1,1024));
    fr=open(filename);
    for i in range(32):
        lineStr=fr.readline();
        for j in range(32):
            returnVect[0,32*i+j]=int(lineStr[j])
    return returnVect
#KNN算法
"""
inVec:输入的向量
dataSet:输入样本数据集
labels:输入样本标签
k:k个近邻
使用最简单的欧氏距离
"""
def KNN(inVec,dataSet,labels,k):
    datasetSize=dataSet.shape[0];
    diffMat=tile(inVec,(datasetSize,1))-dataSet
    sqDiffmat=diffMat**2
    sqDistance=sqDiffmat.sum(axis=1)
    distance=sqDistance**0.5
    sortDistance=distance.argsort()
    classCount={}  #定义一个元组
    for i in range(k):
        label=labels[sortDistance[i]]
        if not classCount.has_key(label):
            classCount[label]=1;
        else:
            classCount[label]=classCount[label]+1
    # print classCount

    sortedClassCount=sorted(classCount.iteritems(),key= operator.itemgetter(1),reverse=True)
    return sortedClassCount[0][0]


# def createDataSet():
#     group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
#     labels=['A','A','B','B']
#     return group,labels
#
# group,labels=createDataSet();
# result=KNN([0,0],group,labels,3)
# print result

#手写问题识别
def handwriting():
    hwLabels=[]
    trainingFileList=listdir('trainingDigits')
    m=len(trainingFileList)
    trainingMat=zeros((m-1,1024))
    for i in range(m):
        fileNameStr=trainingFileList[i]
        if(fileNameStr=='.DS_Store'):
            continue
        fileStr=fileNameStr.split('.')[0]
        classNumStr=int(fileStr.split('_')[0])
        hwLabels.append(classNumStr)#获取标签
        trainingMat[i:]=img2vector('trainingDigits/%s' % fileNameStr)#获取训练向量
    testFileList=listdir('testDigits')#获取测试数据
    errorCount=0
    print (len(hwLabels))
    mTest=len(testFileList)
    for i in range(mTest):
        fileNameStr=testFileList[i]
        if(fileNameStr=='.DS_Store'):
            continue
        fileStr=fileNameStr.split('.')[0]
        classNumStr=int(fileStr.split('_')[0])
        vectorUnderTest=img2vector('testDigits/%s' % fileNameStr)
        classifierResult=KNN(vectorUnderTest,trainingMat,hwLabels,3)
        print('分类器返回值为:%d ,正确的结果应该是:%d' %(classifierResult,classNumStr))
        if(classifierResult!=classNumStr):
            errorCount+=1
    print('错误率是%f' % ((errorCount)/float(mTest)))

if __name__=='__main__':
    handwriting()



 测试结果如下:

 

 

可见其识别率也是相当之高。

 

需要说明的是:程序中的

 

 trainingMat=zeros((m-1,1024))
    for i in range(m):
        fileNameStr=trainingFileList[i]
        if(fileNameStr=='.DS_Store'):
            continue

 是因为程序跑在Mac操作系统中,使用listdir会带出.DS_Store这一个文件夹,因此程序中将其过滤掉了,如果是windows,应该改成

 

 trainingMat=zeros((m,1024))
    for i in range(m):
        fileNameStr=trainingFileList[i]

 当然其他的可以相应的做修改,并不影响程序功能。

 

其实可以比较一下神经网络的训练和KNN的训练,我们可以看出神经网络其复杂度比KNN要高出不少,乍看之下,KNN是比较好的方法,但是对于很对问题,KNN是没办法处理的,比如回归问题,所以KNN在数值类的分类问题上算是一种比较好得方法,但是其运用的范围远没有神经网络那么广,而且神经网络在近些年的发展中也渐渐形成了多个分支,包括深度学习。

 

最后说一说Python中得一些语法:

首先是需要说明的是,程序中计算欧氏距离使用的是numpy提供的array方法,而不是Python自带的list,array能够进行一些类似矩阵运算的方法,而list是不能的,因此需要将向量数据,转换成array,这就使用到了zeros方法

 

 

  • 大小: 16.7 KB
  • 大小: 19.7 KB
0
1
分享到:
评论

相关推荐

    MLA Review之三:朴素贝叶斯分类

    在这个“MLA Review之三:朴素贝叶斯分类”的主题中,我们将会深入探讨朴素贝叶斯的工作原理、优缺点以及实际应用。 首先,朴素贝叶斯分类器的核心是贝叶斯定理,该定理表示了在已知某些证据的情况下,某一假设发生...

    matlab匹配滤波代码-MLA2_Tracking:这是用于在MLA2实验中跟踪动物位置的代码

    matlab匹配滤波代码MLA2_Tracking 这是用于记录,跟踪和分析MLA2实验动物位置的代码。 要在新实验中使用此代码,请从Github存储库中派生或下载并从那里开始使用新数据。 工作流程大纲 盆景: Video_Acquisition....

    MLA Handbook 8thEd (MLA Handbook 第8版,PDF)

    标题《MLA Handbook 第8版,PDF》和描述“PDF格式适配KINDLE的版本”,以及标签“MLA 英语写作”明确指向了该文档的性质和内容,即这是关于MLA(现代语言协会)格式的使用手册的PDF版本,它适配于KINDLE阅读器。MLA...

    latex-mla-template:我个人的 LaTeX MLA 模板

    乳胶-mla-模板 用于生成 mla 格式论文的基本模板。 先决条件 make 一些最新的 LaTeX 发行版(TeXLive、MacTeX、MiKTeX 等) 安装和使用 $ git clone https://github.com/trotod/latex-mla-template <project> $ cd...

    raincell-mla:降雨估计的机器学习算法

    "raincell-mla"项目是一个专注于利用机器学习算法进行降雨估计的研究。在这个项目中,研究者们可能利用了各种先进的数据分析技术,尤其是通过Jupyter Notebook这一强大的交互式计算环境来实现他们的工作。Jupyter ...

    MLA格式参考文献示例.doc

    MLA 格式参考文献示例 MLA 格式参考文献示例文档提供了一些常见的文献类型的引用格式,包括期刊文章、专著、编撰书籍等。下面是对这些文献类型的详细解释和示例。 期刊文章 在 MLA 格式中,期刊文章的引用格式...

    MLA格式说明

    #### 一、MLA格式简介 MLA(Modern Language Association)格式是由美国现代语言协会提出的一种引用格式标准,主要用于英语语言与文学等人文学科的学术论文写作中。这一格式旨在为学术研究提供一个统一且清晰的引用...

    matlab开发-MLAlearning

    在第一周的课程中,可能会介绍一些基本的机器学习算法,比如: 1. **线性回归**:用于预测连续数值输出的模型,如`fitlm`函数。 2. **逻辑回归**:常用于二分类问题,MATLAB的`fitglm`或`fitclogit`可以实现。 3. *...

    mla-data-reconstruction:用于解析,重建和转换MLA测量数据的库

    本文将深入探讨“mla-data-reconstruction”这一Python库,它专为解析、重建和转换MLA(多光子激光共焦显微镜)测量数据而设计。该库为科研人员提供了强大的工具,简化了复杂的数据处理过程,提高了工作效率。 首先...

    mla-data:用于 RhetCompWriting 的 MLA JIL 数据

    这是一个正在进行的项目,旨在提供 (1) 供其他学者分析的纯文本数据资源,以及 (2) 分析用于修辞和写作研究的 MLA JIL 数据。 该项目的原始文本数据是从下载的 PDF 中提取的: : 和 此数据的写作研究相关报告可从...

    MLA Format MLA格式.pdf

    MLA(Modern Language Association)格式是一种广泛应用于人文科学领域的引用规范,主要用于撰写文学论文。MLA格式要求在论文中正确引用他人的观点和内容,确保学术诚信。以下是关于MLA格式的一些关键要点: 1. **...

    pa.mla.unit.addon:mla unit addon mod

    "pa.mla.unit.addon:mla unit addon mod" 是一个针对特定游戏或模拟平台的扩展模组,主要由Python编程语言编写。这个模块可能是为了增强游戏中的单位(unit)功能,提供更多的自定义选项或者引入新的游戏机制。在...

    mla_sani:从头再来的另一个ml

    作为一个数学背景不强的软件工程师,我在理解ML算法方面遇到了很大的困难。 我可能只花了几分钟就知道算法是什么样的,但确实需要一些时间来了解更多细节。 作为一种学习方式,我决定从头开始实现一些基本的ml算法,...

    创意电子关于MLA系列贴片电容选型手册.pdf

    例如,通过“ALCHIPMLA-TM”可以推测,该型号可能是某一品牌如Alchip(应该是指Alchip Technologies Inc.)推出的MLA系列电容器中的TM型号。产品型号是选型的首要依据,它将决定电容器的尺寸、封装形式、容量范围等...

    VDA 6.3 :2016 审核中P2-P7与 MLA解读、审核表格及案例分析

    在这个主题中,我们将深入探讨P2到P7的过程审核元素以及MLA(制造过程能力)的解读,结合实际的审核表格和案例分析,以帮助理解和应用这些概念。 P2-P7是VDA 6.3过程审核的核心部分,它们分别代表: 1. P2 - 过程...

    MLA_Citation_Series_E-book_Merge

    MLA(Modern Language Association)引用格式是人文科学领域内最常用的文献引用风格之一,适用于文学、语言学、文化研究等学科的研究论文。本指南将详细介绍MLA第七版的基本引用规则,涵盖常见的书籍、电子资源及...

    第十届中国机器学习及其应用研讨会 MLA'12

    第十届中国机器学习及其应用研讨会 MLA'12 是一次聚焦于机器学习理论与实践的高端学术会议,该会议于2012年11月3日至4日在中国著名的高等学府——清华大学举行。这次研讨会汇聚了国内外在机器学习领域具有深厚造诣的...

    MLA正文引用+参考文献.pdf

    MLA正文引用+参考文献.pdf 本文将详细介绍MLA格式的正文引用和参考文献的撰写要求。MLA格式是由美国现代语言学会(Modern Language Association)提出的,主要应用于人文学科、社会科学和自然科学等领域。 MLA格式...

    美硕 MLA 双稳态继电器 产品说明书.zip

    《美硕 MLA 双稳态继电器产品说明书》是一份详细阐述美硕品牌MLA系列双稳态继电器技术规格、工作原理、安装与使用的参考资料。这份说明书的重要性在于,它为使用者提供了全面了解和安全操作该产品的关键信息。 首先...

Global site tag (gtag.js) - Google Analytics