机器学习 K近邻(K-Nearest-Neighbors)算法剖析

一、 读懂该算法所具备的相关知识

  1. 熟练掌握Python语言

  2. 线性代数矩阵常见的基本运算

  3. 欧几里得定律,计算矩阵中两点之间的距离。

二、 生活案例-K近邻算法

电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问题。每部电影在风格上的确有可能会和同题材的电影相近。那么动作片具有哪些共有特征,使得动作片之间非常类似,而与爱情片存在着明显的差别呢?动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们不能单纯依靠是否存在打斗或者亲吻来判断影片的类型。但是爱情片中的亲吻镜头更多,动作片中的打斗场景也更频繁,基于此类场景在某部电影中出现的次数可以用来进行电影分类。

基于电影中出现的亲吻、打斗出现的次数,使用K近邻算法构造程序,自动划分电影的题材类型。

简单地说,K近邻算法采用测量不同特征值之间的距离方法进行分类。

K近邻算法(K-NN), 它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

现在我们回到前面电影分类的例子,使用K-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,图2-1显示了6部电影的打斗和接吻镜头数。

假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用k-近邻算法来解决这个问题。

接下来有一部未知电影,如图,首先我们需要知道这个未知电影存在多少个打斗镜头和接吻镜头,图中问号位置是该未知电影出现的镜头数图形化展示,具体数字如下图

即使不知道未知电影属于哪种类型,我们也可以通过某种方法计算出来。首先计算未知电影与样本集中其他电影的距离,如下表所示。此处暂时不要关心如何计算得到这些距离值,使用 Python实现电影分类应用时,会提供具体的计算方

以上主要讲解如何在实际环境中应用K-近邻算法,如果通过Python编程语言来实现K-近邻算法进而让机器帮助人类来对电影进行分类,这就是机器学习。在动物界,我们可以开发一个鸟类分类系统,这样鸟类专家就可以下岗了,当有一只未知类型的鸟,我们只需要通过机器学习k近邻算法就可以区分出这只鸟是什么类型的。

现在我们得到了样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到K个距离最近的电影。假定K=3,则三个最靠近的电影依次是<<CaliforniaMan>> <<He’s Not Really into Dudes>> <<BeautifulWoman>> K-近邻算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片

三、 K-近邻算法的基本实现

K-近邻算法的一般实现流程如下:

a) 收集数据:可以使用任何方法

b) 准备数据:距离计算所需要的数值,最好是结构化的数据格式。

c) 分析数据:可以使用任何方法。

d) 训练算法:此步驟不适用于1 近邻算法。

e) 测试算法:计算错误率。

f) 使用算法:首先需要输入样本数据和结构化的输出结果,然后运行女-近邻算法判定输 入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

  1. K-近邻算法训练数据

    在一个坐标中有四组数据如下图,并且这四个数据都有标签,能够标识出这四个数据点都属于什么类别的,即标签类别。现在有一个陌生的数据点过来,请你通过机器学习算法让机器能够判断出该数据点是那个类别的。

group([1, 1], [1, 1.1], [0, 0], [0, 0.1])

A(1, 1) A(1, 1.1) B(0, 0) B(0, 0.1)

Labels= [A, A, B, B]

注意:Label包含的元素个数等于group矩阵的行数

  1. K-近邻算法实现原理

l 计算已知类别数据集中的点与当前点之间的距离;

l 按照距离递增次序排序;

l 选取与当前点距离最小的k个点;

l 确定前k个点所在类别的出现频率;

l 返回前k个点出现频率最高的类别作为当前点的预测分类。

  1. 创建一个名为kNN.py的Python文件,内容如下

from numpy import *

import operator

#算法训练数据集

def createDataSet():

group =array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])# x坐标和y坐标在1附近的归类到A,在0附近的点归类到Blabels =['A','A','B','B']returngroup,labels

#算法实现方法

def classify0(inX, dataSet, labels, k ) :

dataSetSize = daCaSet.shape[0]

#距离计算

diffMat = tile(inX, (dataSetSize,1)) - dataSet

sqDiffMat = diffMat**2

sqDistances = sqDiffMat.sum(axis=l)

distances = sqDistances**O.5

sortedDistIndicies =distances.argaort ()

#选 择 距 离 最 小 的k个点

classCount={}

for i in range(k):

voteIlabel = labels[sortedDistIndicies[i]]

classCount[votellabel] = classCount.get{voteIlabel,0) + 1

sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)

return sortedClassCount[0] [0]

  1. 代码详细注释如下:

'''

导入numpy模块,该模块用于数据NumPy系统

是Python的一种开源的数值计算扩展。

这种工具可用来存储和处理大型矩阵。

'''

fromnumpy import *

importoperator #提供了一系列的函数操作

"""

定义机器学习训练数据集和分类标签数据。

"""

defcreateDataSet():

group =array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])# x坐标和y坐标在1附近的归类到A,在0附近的点归类到Blabels = ['A','A','B','B']return group,labels

"""

实现K-近邻算法,对数据点进行机器自动分类inX:需要让机器进行分类的数据点例如:[0,0] 或者[1.4,1.6]等数据点dataSet:机器学习的训练数据labels:   机器学习的训练数据的已知分类k: inX输入数据与训练数据之间的距离个数的前k个,这个距离会按照从小到达进行排序。

"""

defclassify0(inX, dataSet, labels, k):

'''shape函数用于读取矩阵的长度,shape[0]就是读取矩阵的第一维度的长度根据上面训练数据集的情况,group矩阵第一维的长度是dataSetSize= 4'''dataSetSize = dataSet.shape[0]'''tile函数用于创造一个长度为4的一维矩阵,矩阵中的元素为inX,然后与dataSet训练矩阵做减法矩阵的减法是为了后面这两个矩阵中元素之间的距离计算做准备。tile(inX,(dataSetSize,1))array([[0, 0],[0, 0],[0, 0],[0, 0]])dataSet:array([[ 1. ,  1.1],[ 1. ,  1. ],[ 0. ,  0. ],[ 0. ,  0.1]])两个矩阵做完减法diffMat结果如下:array([[-1. ,-1.1],[-1. , -1. ],[ 0. ,  0. ],[ 0. , -0.1]])'''diffMat = tile(inX,(dataSetSize,1)) -dataSet'''sqDiffMatarray([[ 1.  , 1.21],[ 1.  , 1.  ],[ 0.  , 0.  ],[ 0.  , 0.01]])'''sqDiffMat = diffMat**2 #对矩阵减法结果做幂次运算'''计算矩阵中每个元素幂次运算之后的和sqDistances =array([ 2.21,  2.  , 0.  ,  0.01])'''sqDistances = sqDiffMat.sum(axis=1)'''做开平方运算出inX未知点与训练数据四个点之间的距离array([ 1.48660687,  1.41421356,  0. , 0.1])'''distances = sqDistances**0.5'''按着inX距离训练数据点距离的从小到大顺序的索引值进行排序也及时argsort()函数的返回结果排序后从小到大距离的索引值被放到list中[2,3,1,0]'''sortedDistIndecies = distances.argsort()#选择距离最小的k个点'''定义一个空字典,字典中元素key的值为标签分类名,即是A或者Bvalue的值为根据距离计算出标签类别出现的频率数。'''classCount = {}'''这里k的值是根据训练数据量来设置的,本次训练数据为4个所以k的值可以设置为3就是计算 inX 数据与训练数据4个的距离中取前3个距离来进行统计,看前3个当中inX 得出的标签分类出现的频率数k取3,则在循环中i的值一次为 0 1 2'''for i in range(k):'''sortedDistIndecies[i]的值 当i=0是获得其中第一个元素的值2那么第一个元素2 就是inX距离四个点之间前k个距离的第一个距离的索引值训练数据如下:group =array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels =['A','A','B','B'] # x坐标和y坐标在1附近的归类到A,在0附近的点归类到BsortedDistIndecies= [2,3,1,0][1.0,1.1] [1.0,1.0]    [0,0]  [0,0.1]A(0)      A(1)       B(2)   B(3)array([1.48660687,  1.41421356,  0. , 0.1])

在这里我们计算出了inX数据点与训练数据四个点的距离,计算顺序也是按着矩阵的元素

排练的顺序计算出的,那么这里的顺序很重要,因为在训练数据集中顺序和它的标签分类

是一一对应的,所以计算出的距离索引的值和标签是一对一对应的。当我们把距离索引的值

按着距离的从小到大排列,然后放到一个list当中,此时索引的值就是标签的分类了。

这就是 voteIabel = labels[sortedDistIndecies[i]]这一句话的含义。sortedDistIndecies = [2,3,1,0]

'''

voteIlabel =labels[sortedDistIndecies[i]] #获取第k个距离最小的标签分类'''这里的+1 是为了计算classCount字典中key对应的value的值,key其实就是标签的分类value的值,就是某一分类出现的次数,如果相同的key出现了,那么这个key的分类对应的值就加了两次1 变为2. 那么最后我们就可以统计出标签出现频率最高的一个做为陌生inX数据点的分类,最为准确了。'''classCount[voteIlabel] =classCount.get(voteIlabel,0)+1'''循环结束后classCount字典的元素结果为classCount ={['A',1],['B',2]}''''''classCount.iteritems()方法返回一个iterator对象key=operator.itemgetter(1)按着key进行排序,此时的key的值对应的是字典中value的值,即按每个字典元素value的值进行排序reverse=True 指的是反转按着倒序排列。sortedClassCount= [('B',2),('A',1)]'''sortedClassCount =sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)#返回统计分类频率最好的类别元素,作为陌生数据分类的最终结果。return sortedClassCount[0][0]
  1. 测试:classify0([0,0], dataset,label,3);结果分类为:B

机器学习 K-Nearst-Neighbors算法相关推荐

  1. 机器学习——K近邻分类算法及python代码实现

    <机器学习:公式推导与代码实践>鲁伟著读书笔记. K近邻(K-nearest neighbor,K-NN)算法是一种经典的监督学习的分类方法.K近邻算法是依据新样本与k个与其相邻最近的样本 ...

  2. 机器学习-k均值聚类算法-k_means原理14

    非监督学习

  3. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  4. 【机器学习-K近邻算法】

    K-近邻算法 K-近邻算法的快速入门 K-近邻(KNN)算法概念 殴式距离公式 电影分类案例 K-近邻算法API Scikit-learn工具 Scikit-learn包含内容 K-近邻算法API方法 ...

  5. 机器学习——K近邻算法(KNN)(K Nearest Neighbor)

    参考视频与文献: python与人工智能-KNN算法实现_哔哩哔哩_bilibili 机器学习--K近邻算法(KNN)及其python实现_清泉_流响的博客-CSDN博客_python实现knn 机器 ...

  6. 机器学习基础 KNN(K近邻)算法及sklearn的基本使用(附带一些基础概念)

    文章目录 一. K-近邻算法简介 1. 什么是K-近邻算法 1.1 K-近邻算法(KNN)概念 1.2 电影类型分析 1.3 KNN算法流程总结 2. 小结 二.K近邻算法api初步使用 1. Sci ...

  7. 2 机器学习 K近邻算法(KNN) 学习曲线 交叉验证 手写数字识别

    机器学习 1 K-近邻算法介绍 1.1 分类问题 分类问题:根据已知样本的某些特征,判断一个未知样本属于哪种样本类别. 与回归问题相比,分类问题的输出结果是离散值,用于指定输入的样本数据属于哪个类别. ...

  8. 机器学习之无监督学习-K均值聚类算法

    机器学习之无监督学习-K均值聚类算法 对于无监督学习,有两类重要的应用,一个是聚类,一个是降维.我们今天主要学习聚类中的K均值聚类. 我们先看看下图,图a为原始的数据点,我们想要对图a的数据点进行分类 ...

  9. 机器学习实战-61:K均值聚类算法(K-Means)

    K均值聚类算法(K-Means) 深度学习原理与实践(开源图书)-总目录,建议收藏,告别碎片阅读! 机器学习分为监督学习.无监督学习和半监督学习(强化学习).无监督学习最常应用的场景是聚类(clust ...

  10. 机器学习100天(三十):030 K近邻分类算法-K值的选择

    机器学习100天,今天讲的是:K近邻分类算法-K值的选择. <机器学习100天>完整目录:目录 上一节我们讲了 K 折交叉验证的理论,下面我们将 K 折交叉验证算法应用到 K 近邻分类算法 ...

最新文章

  1. STlink下载出现st-link usb communication error解决方法
  2. opc服务器组态文件已写保护_「杰控软件」OPC代理服务,通过OPC方式采集远程OPC服务...
  3. 【CF1311E】Construct the Binary Tree【增量构造】【复杂度证明】
  4. asp.net core mvc视频A:笔记2-4.ActionResult(动作结果,即返回值)
  5. java json 变量所有的属性
  6. vivado使用入门
  7. 计算机科学与技术有几大类,计算机科学与技术类包括哪些专业
  8. 磁盘空间的三种分配方式
  9. pycharm如何更换背景图片
  10. oracle怎么看alter日志,Oracle 11g 日志alter文件位置
  11. C语言解决狐狸找兔子的问题(数组)
  12. 家里宽带网络连接第二台路由器实验二 ----Tenda A6设置无线信号放大模式(WISP)
  13. 业务中台--企业流程优化
  14. 计算机专业—毕业设计题目大全
  15. 江南情节——紫砂壶品茶
  16. 应用宝成腾讯王卡官方应用商店 全部APP下载免流量
  17. 关于ios苹果企业开发者
  18. 一个MMORPG游戏的常规技能系统
  19. 最近远景论坛打不开修改hosts
  20. 第 13 章 可扩展性设计之 MySQL Replication

热门文章

  1. 从零开始写一个Jison解析器(7/10):解析器生成器 `parser generator` 的迭代式开发流程
  2. iOS 5 故事板进阶(1)
  3. 深挖用户需求,只需要这三步就够了!
  4. GUARDED_BY(c) 和 PT_GUARDED_BY(c)
  5. PLL Simulink行为模型
  6. Python编程从入门到实践(第五章练习)
  7. ios游戏和android,20款最受好评的iOS和Android游戏
  8. Java + OpenCV 实现图片年龄识别(JavaCV)
  9. linux环境vmd安装,Ubuntu下VMD安装
  10. 文件管理服务器win7,Win7如何取得文件管理所有权