前言

大数据以及人工智能越来越火,作为一线攻城狮的我们有必要了解和研究,写本博客的目的在于分享以及自己记录总结,如有不美观之处请谅解,在后面的所有博客中,我们均采用python来进行代码编写,我们的思想是按照面向函数式思想来考虑问题,有时会更好理解一些代码中的函数。 #k近邻简介

k邻近算法是属于监督学习分类算法中比较简单的一种,网上和书上也说它是一种基于实例的学习方法,也就是它是基于已有的分类样本数据来预测未知的数据,它常常用于数据分类。

原理

它不需要花很长时间去训练分类过程,只要给定已知样本数据集后,当有一个新的测试样本输入,我们会通过计算出输入的待分类样本和已知数据集各个样本之间的特征距离,然后,根据距离从小到大排序,选取距离最近的k个样本,计算这k个样本中分类最多的那一类,找出来之后我们即把输入的样本归为这一类,看下面一张图帮助理解:

从原理上来看该算法并不复杂,理解起来也相对简单些,对于每一个算法或是其它理论方法我们应该有这样一个共识,它们都有自己的局限性和优势劣势,我们要做的是找到最有解法来适应最合适的应用场景。

概念解析

每篇博客我们都来接触几个概念,对于每个新事物概念是相当重要的部分,对于每个概念知道它的意义所在,产生这个概念的本质是源于什么目的,深刻理解后才能熟练应用,如同剑客的三个层次,手中无剑心中无剑,感觉英文解释也不错,有时翻译过来可能不太准确,如下:

  • 训练集(Training set): A set of examples used for learning, which is to fit the parameters [i.e., weights] of the classifier.
  • 验证集(Validation set): A set of examples used to tune the parameters [i.e., architecture, not weights] of a classifier, for example to choose the number of hidden units in a neural network.
  • 测试集(Test set): A set of examples used only to assess the performance [generalization] of a fully specified classifier.
  • 近似误差(approximation):网上有很多解析,感觉有一种比较好理解,可以先这样理解,近似误差是相对于训练集,表示预测结果与每个样本真实值的差异大小,当k值过小时,局部性增大过度耦合问题出现,同每个真实样本之间的比较近,则近似误差变小。
  • 估计误差(estimation error):同理,估计误差相对于测试集,k小,训练模型复杂,预测测试数据时会偏离真实值较大,因此近似误差间变大,相反k值变大,近似误差减小。

步骤

  • 1.得到已知样本集合和分类标签
  • 2.计算已知类别数据集中的点与当前点之间的距离
  • 3.按照距离递增排序
  • 4.选取与当前点距离最小的k个点
  • 5.计算k个点中出现类别最高的点,并返回该类别,作为待测点的分类 计算距离 计算出现最高的频路

问题

1.k值得选取

从原理中我们可以看出,k的取值范围是从1-n,n代表样本个数,那我们先从两个极端来分析一下k值 k=1时        k=1的意思即我们只查找距离输入样本距离最近的一个已知样本,它的分类即输入样本的分类,完全或过度依赖于最近的一个实例样本,在现实生活中如果对我们自己进行分类,我身边的朋友是已知分类样本,如果只根据我的一个朋友即把自己分为他那一类感觉是不是有些草率,分类过度依赖于一个人了,这种现象叫做过拟合 k=n        即每次输入待测样本预测时,都把所有已知的样本作为依据来分类,即把所有分类都考虑进去了,把原本离待测样本分类距离较远的也一起计算,且每次分类都是已知样本中分类多的占优势,近似误差增加,估计误差减小 。

2.距离计算方式

计算样本特征之间距离的方式有好几种,常用的有三种分别为 曼哈顿距离、欧氏距离、闵可夫斯基距离,这里我们采用了欧氏距离来计算特征之间的距离计算,有兴趣的可以自行研究。

代码示例

下面我们按着该算法的思路实现一个简单的例子来,该例子是已经一个数据集合,来判断新来的数据可能属于哪一个类别,代码写的注释比较多,大家可以通过看注释看懂啥叫意思,代码如下:

def createDataSet():'''创建训练集以及对应的分类标签:return: 返回集合和分类标签'''group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])labels = ['A','A','B','B']return group, labelsdef classify0(intX,dataSet,labels,k):'''k均值算法分类器简单实现:param intX: 输入待测样本:param dataSet: 训练集合:param labels: 已知分类标签:param k: 最近的k个样本点:return: 返回待测样本点的分类结果'''# 获取已知样本行数dataSetSize = dataSet.shape[0]# tile 表示重复A 输出,计算intX 与每个样本的差值diffMat = tile(intX,(dataSetSize,1)) - dataSet# 每个值取平方sqDiffMat = diffMat**2print "sqDiffMat = %s" % sqDiffMat# 欧式距离 axis=1 行之和,0 列之和sqDistances = sqDiffMat.sum(axis=1)print "sqDistances = %s" % sqDistances# 开平方distances = sqDistances**0.5# 返回从小到大的索引值sortedDistIndieies = distances.argsort()classCount = {}# 取最近的k个样本点for i in range(k):voteIlabel = labels[sortedDistIndieies[i]]# 用字典保存最近样本点的次数classCount[voteIlabel] = classCount.get(voteIlabel,0)+1sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1),reverse=True)# 返回出现最高的那一个分类print sortedClassCount[0][0]if '__main__==__name__':dataSet,labels = createDataSet()# print dataSet# print labelsclassify0([0,0],dataSet,labels,3)

总结

k均值学习算法作为第一个机器入门级学习算法,该算法的缺点在于时间和空间复杂度都很高,不过很好的帮我们认识了机器学习的过程,感觉在学习机器学习时的困难在于多理解各种概念,弄懂他们的意思和表达的含义,找到一个适合自己的思路去学习才会事半功倍,学习一个东西往往需要从多角度去考察、去学习其实这种思想在我们生活中无处不在,如通过前几天天气预测后面天气、基于每个人的现在情况预测一个人的未来,各种在已有条件发生的案例都可以使用该方法来预测,多观察生活多学习会让自己认识提高。

题外思考

悖论的意义

以前并不知道悖论的意义在哪里,完全是一些不着边际的遐想,在了解了它的意义之后会觉得它是有很大价值的想法,先拿一个例子说来叫”龟速赛跑“,但结论是兔子追不上乌龟。

这样的结论是不是不符合常理,它的逻辑是这样的假设乌龟在兔子前面100米,兔子速度是乌龟10倍,然后他们开始出发,如果兔子想追上乌龟必须达到乌龟的起点,当兔子达到乌龟起点时,乌龟又向前运动了10米,依次类推,兔子永远都是达到乌龟起点,古永远追不上乌龟。类似的悖论还有射箭非动、永远走不到学校等例子,殊不知西方很多科学的进步来自于悖论启发,东方人经常认为这是庸人自扰因为它不符合尝试,没有从常识出发不值得反驳,我们的思维一直强调学以致用、不合理的不去触碰因此我们失去了发现新知的机会,以我们的经验去理解逻辑的问题,有时逻辑中的漏洞往往是科学的巨大发现。

举个物理方面的例子,伽利略发现物体下落和质量无关的结论即源于这样的逻辑推理,在这之前亚里士多德认为质量大的物体下落应该快,人们也一直这么认为,伽利略通过实现做了一个逻辑假设,有两个物体一个10kg,一个1kg,将两个物体绑在一起如果速度跟质量有关,下降速度应该结余10与1之间,与假设矛盾,使得伽利略发明了这一个现象。

机器学习 (二) K近邻算法分析与实现相关推荐

  1. 机器学习:k近邻算法(KNN)介绍

    k近邻算法是一种最简单最经典的机器学习算法之一.该算法的原理为:当对测试样本进行分类时,首先通过扫描训练样本集,找到与该测试样本最相似的k个训练样本,根据这个样本的类别进行投票确定测试样本的类别.也可 ...

  2. 机器学习之k近邻算法

    本文的代码基于书本<机器学习实战> 概念 k-近邻算法采用测量不同特征值之间距离的方法进行分类.工作原理是:存在一个样本数据集合,称作训练样本集,样本中每个数据都存在标签.输入没有标签的新 ...

  3. 机器学习:K近邻算法

    一.K-近邻算法简介 1 什么是K-近邻算法 根据你的"邻居"来推断出你的类别 1.1 K-近邻算法(KNN)概念 K Nearest Neighbor算法又叫KNN算法,这个算法 ...

  4. 机器学习算法K近邻--阿里云天池

    学习内容概括: KNN虽然很简单,但是人们常说"大道至简",一句"物以类聚,人以群分"就能揭开其面纱,看似简单的KNN即能做分类又能做回归, 还能用来做数据预处 ...

  5. 机器学习:K近邻算法(K-NN)

    K近邻(K-Nearest Neighbor, KNN)是一种最经典和最简单的有监督学习方法之一,它非常有效而且易于掌握. 1 K近邻算法概述 一个样本与数据集中的k个样本最相似, 如果这k个样本中的 ...

  6. 机器学习:K近邻(KNN)

    K近邻(K-Nearest Neighor,KNN)学习是一种常用的监督学习方法,它的思想非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的K个训练样本,然后基于这K个邻居的信息进行预测 ...

  7. 机器学习之K近邻(KNN)模型

    机器学习之KNN 本文主要介绍K近邻(KNN)模型,KNN在机器学习中是很常见的: 1.KNN模型介绍 2.KNN数学原理 3.算法及Python实现 4.小结 1.KNN模型介绍 k近邻法(k-ne ...

  8. 机器学习之K近邻算法原理+应用实例

    1. 基本原理 K最近邻(K-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法之一,其基本思路与"近朱者赤,近墨者黑"的原理类似,当对未分类样本进行分类时, ...

  9. k近邻算法_机器学习之K近邻分类算法的实现

    K近邻算法(k-nearest neighbors, KNN)是最基本的机器学习算法之一.所谓的K,就是距离最近的K个邻居的意思.其实,KNN在我们平常的生活中也会不自主的应用,比如,俗语说的&quo ...

最新文章

  1. 贝塞尔曲线开发的艺术
  2. 使用 SQL Server 2000 索引视图提高性能1
  3. javaScript基本操作
  4. java 项目启动初始化_Spring Boot解决项目启动时初始化资源的方法
  5. Mac备忘录笔记教学——强大的内置笔记软件
  6. Activiti工作流之事件监听详解-ActivitiEventListener
  7. python切片输出_Python语言之详解切片
  8. 股票分红对于短期投资有好处吗?
  9. python解释执行器_有关Python脚本相关说明介绍
  10. (2)Linux环境下安装和使用Redis
  11. hosts文件路径及文件介绍
  12. 智能卡卡发卡流程(收藏2)
  13. 51NOD 1432 独木舟
  14. EasyCVR平台如何实现超低延时的安防视频监控直播?
  15. illumina测序两束激发光分别是什么颜色,A/T/C/G四个碱基又分别标记了什么颜色的荧光素呢?
  16. 1-1:Huawei路由交换技术简单知识
  17. matlab从mp4文件中提取音频,怎么提取MP4视频中的音频,将MP4格式转换为MP3格式
  18. python中使用ffmpeg合并音频与视频_ffmpeg 在windows 下的安装和使用(python, 合并音频和视频)...
  19. 根据PLL相噪测试曲线计算jitter的Matlab程序
  20. JAVA简单编写幸运抽奖

热门文章

  1. 【DCIC2022】科技金融子赛道验证码识别0.65+ baseline
  2. win2000 Ntldr 丢失
  3. 巴菲特致股东的一封信:2010年
  4. 江民:核心杀毒技术不过硬,再“云”也不安全
  5. 在Android平台启动Linux C/C++应用程序
  6. mysql查询职位大于3_mysql学习第四天(高级查询)
  7. 用C/C++编程实现挖金子游戏「含项目源码」
  8. x.509数字证书编码详解
  9. 苹果笔记本电脑性能测试软件,mac电脑耐用性测试,拿五年前的苹果电脑测试性能...
  10. 使用希沃白板5怎么上计算机课,希沃5电子白板使用教程