算法原理

K近邻是机器学习中常见的分类方法之间,也是相对最简单的一种分类方法,属于监督学习范畴。其实K近邻并没有显式的学习过程,它的学习过程就是测试过程。K近邻思想很简单:先给你一个训练数据集D,包括每个训练样本对应的标签。然后给你一个新的测试样本T,问你测试样本的标签预测是什么,K近邻的方法就是找到T到D中每一个样本的相似度,然后根据相似度大小对D中样本排序,取前K个最相似的样本的标签的众数作为测试样本T的标签(即前K个样本投票决定)。具体相似度怎么度量,是根据测试样本到D中每个训练样本的距离度量,一般用的最多的是欧氏距离,也可以更广泛的p范数(欧氏距离是2范数)。

例如:训练数据集D为二位数据,二维图如下图所示:

三种颜色分别代表三种比同类别的标签,现在给你一个新的测试样本T,只要放到图中取计算T到图中各点的距离,然后选取距离最近的K个点来投票决定测试样本属于哪一类(即是什么颜色)

K近邻算法实现

先给出算法实现,再详细解释各函数实现:

from numpy import * 
import operator

import matplotlib
import matplotlib.pyplot as plot

#########Python做数据处理常用的三个工具包,定义了一些矩阵运算,画图,操作符函数接口######
def classify0(inX,dataSet,labels,k):
    dataSetSize=dataSet.shape[0]                                            #1
    diffMat=tile(inX,(dataSetSize,1))-dataSet                             #2
    sqDiffMat=diffMat**2                                                        #3
    sqDistances=sqDiffMat.sum(axis=1)                                    #4
    distances=sqDistances**0.5                                               #5
    sortedDistIndicies=distances.argsort()                                 #6
    classCount={}                                                                  #7
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]]                            #8
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1       #9
    sortedClasscount=sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)     #10
    return sortedClasscount[0][0]                                                                                         #11

--------------------------分割线----------------------------------------

参数注释:第一个参数表示要测试的样本(n维向量);第二个参数表示训练数据集矩阵(每一行是一个训练样本(m),每一列是一个坐标维度(n));第三个参数是训练数据的样本标签向量(m);第四个参数K是设置的最近的前K个最近的样本

#1:获取训练样本矩阵的行数(即训练数据集中样本数量),array.shape 或者shape(array)是numpy库中函数接口,用来读书矩阵的行数和列数(numpy中矩阵一般用多维数组实现)。array.shape[0]表示行,array.shape[1]表示列。

#2 :tile函数是numpy中的一种类似于扩展函数,对于列表而言,如inX=[1,2,3]

则tile(inX,[2,3])=[[1,2,3,1,2,3,1,2,3] ,2表示扩展两行,3表示扩展成3列。在这里inX扩展后为

           [1,2,3,1,2,3,1,2,3]]

在这里inX扩展后为 ,然后减去训练数据矩阵,得到该测试样本与各训练数据的各维度的差值

#3 各维度的差值平方,方便求欧式距离

#4 numpy.sum(axis)是矩阵求和函数,axis=0表示按行求和,axis=1表示按列求和,这里按列求和,得到测试样本点和训练数据样本点在各维度上的差值的平方和

#5得到的矢量每一列开方

#6对distances矢量排序。array.argsort()是numpy中的排序函数,返回的是按顺序的各值在原列表中的索引,如a=[3 5 6 1]

a.argsort()=[3 0 1 2],因为排完序后是[1 3 5 6],对应在原数组中的位置为[3 0 1 2],默认是按升序排序。此函数的具体其他用法请自己参考其它资料,网上很多。

#7字典,用来存储前K个距离最近的训练样本,其中的key存储K个样本的标签,value存储对应的距离。

#8从距离最小的训练样本点开始,把各点的标签存储进key

#9投票,当前训练样本如果是属于某一标签,就把该key值对应的value加1,如果之前还没出现过该标签,则创建该标签key,并设置默认value值为0

#10对字典内的各键值对按值排序,即按各类别的投票数排序,按降序排序,得到排序后的字典sortedClasscount

#11返回字典的第一个键值对的键值,即标签,作为检测样本的预测标签

--------------------------------分割线------------------------------------

机器学习实战中(Machine Learning in Action)的约会对象分类和手写识别源代码和data文件如有需要,可发邮件到Tjingang@ustc.mail.edu.cn

K近邻 Python实现 机器学习实战(Machine Learning in Action)的更多相关文章

  1. 学习笔记之机器学习实战 (Machine Learning in Action)

    机器学习实战 (豆瓣) https://book.douban.com/subject/24703171/ 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中 ...

  2. 机器学习实战 [Machine learning in action]

    内容简介 机器学习是人工智能研究领域中一个极其重要的研究方向,在现今的大数据时代背景下,捕获数据并从中萃取有价值的信息或模式,成为各行业求生存.谋发展的决定性手段,这使得这一过去为分析师和数学家所专属 ...

  3. 《Machine Learning in Action》—— 剖析支持向量机,单手狂撕线性SVM

    <Machine Learning in Action>-- 剖析支持向量机,单手狂撕线性SVM 前面在写NumPy文章的结尾处也有提到,本来是打算按照<机器学习实战 / Machi ...

  4. 机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据

    机器学习实战(Machine Learning in Action)学习笔记————09.利用PCA简化数据 关键字:PCA.主成分分析.降维作者:米仓山下时间:2018-11-15机器学习实战(Ma ...

  5. 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归

    机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归 关键字:Logistic回归.python.源码解析.测试作者:米仓山下时间:2018- ...

  6. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)

    机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN) 关键字:邻近算法(kNN: k Nearest Neighbors).python.源 ...

  7. 【机器学习实战】Machine Learning in Action 代码 视频 项目案例

    MachineLearning 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远 Machine Learning in Action (机器学习实战) | ApacheCN(apa ...

  8. 机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集

    机器学习实战(Machine Learning in Action)学习笔记————08.使用FPgrowth算法来高效发现频繁项集 关键字:FPgrowth.频繁项集.条件FP树.非监督学习作者:米 ...

  9. 机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析

    机器学习实战(Machine Learning in Action)学习笔记————07.使用Apriori算法进行关联分析 关键字:Apriori.关联规则挖掘.频繁项集作者:米仓山下时间:2018 ...

随机推荐

  1. Java编程规范(二)

    二.格式规范 在上一篇的java编程规范(一)中我们讲述了在Java编码中的一般原则,虽然这些原则并不涉及具体的代码规范,但是这些原则却是我们在Java开发过程中所应该遵循的规范与思想.今天我们将学习 ...

  2. 纪中集训 Day 6

    今天他们回去了,就剩我和DWJ(一位初三大大(后来问云神才知道的ORZ))一起在做题,不得不说他真的是太厉害了,一个升初三大大在各种方面都比我强QAQ 让我突然感觉到自己的高一还是不够努力啊QAQ 连 ...

  3. web及H5 的链接测试

    1:先下载一个Xenu工具 2:安装完成之后,进入页面(将弹出框关闭) 3:进行设置(一般不用修改设置) 4:修改完成之后点击工具栏中的file按钮,并输入想要测试的URL地址 5:点击OK测试完成之 ...

  4. java Log日志规范

    Overview 一个在生产环境里运行的程序如果没有日志是很让维护者提心吊胆的,有太多杂乱又无意义的日志也是令人伤神.程序出现问题时候,从日志里如果发现不了问题可能的原因是很令人受挫的.本文想讨论的是 ...

  5. Struts2之环境配置

    在学习struts2之前,首先我们要明白使用struts2的目的是什么?它能给我们带来什么样的好处? 设计目标 Struts设计的第一目标就是使MVC模式应用于web程序设计.在这儿MVC模式的好处就 ...

  6. 从0移植uboot (二) _uboot启动流程分析

    经过了上一篇的配置,我们已经执行make就可以编译出一个uboot.bin,但这还不够,首先,此时的uboot并不符合三星芯片对bootloader的格式要求,同时,此时的uboot.bin也没有结合 ...

  7. appium初学者,使用之检查appium环境报错Could not detect Mac OS X Version from sw_vers output: '10.12.1’,

    这个问题存在的原因就是appium不兼容最新的mac10.12版本. 由于10.12是最新mac版本,appium1.5.3并未提供支持,所以: 在终端输入grep -rl "Could n ...

  8. Laptop Ubuntu16.04/14.04 安装Nvidia显卡驱动

    笔记本型号 机械革命(MECHREVO)深海泰坦X6Ti-S(黑曜金)15.6英寸 CPU型号 i5-7300HQ 内存 8G 硬盘容量 128SSD+1T机械硬盘 显卡 GeForce GTX 10 ...

  9. SQL server 数据库——数学函数、字符串函数、转换函数、时间日期函数

    数学函数.字符串函数.转换函数.时间日期函数 1.数学函数 ceiling()--取上限  select ceiling(oil) as 油耗上限 from car floor()--取下限 sele ...

  10. CoreGraphics--画线/圆/矩形

    - (void)drawRect:(CGRect)rect { // Drawing code NSLog(@"drawRect自动调用"); //画图步骤 //获取上下文(/画笔 ...