人工智能--第二天--KNN算法

一、概述

  1.概念:K近邻(k-Nearest Neighbor, 简称KNN)算法是一种非常简单的机器学习监督算法。

  2.主要思想:即时给定一个训练数据集,对于新的数据样本,在训练集中找到与该样本最邻近的k个样本,统计这k个样本的多数所属类,就把这个样本归结到这个所属类中。

  3.根据维基百科的图解进行分析

          

  如上图所示,有红色三角形,蓝色正方形俩类数据,图中绿色的圆点代表带分类的数据,下面我们根据k近邻算法给绿色圆点进行分类

  如果k=3,绿色圆点最近邻的三个点是 2红 1 蓝,结果显而易见,少数从属于多数,将绿色圆点判定为红色三角形一类

  如果k=5,绿色圆点最近零的五个点是 3蓝 2红,最终将绿色圆点判定为蓝色正方形类

  4.原理中涉及的问题

    从上面例子我们可以看出,k近邻的算法思想非常的简单,也非常的容易理解,但是要用到项目中,还是用需要注意的,比如k怎么确定的,k为多少效果最好呢?所谓的最近邻又是如何来判断给定呢?

二、K值的选取,特征归一化

  1.首先说明一下 k 的参数 非常难选取。

    如果我们选取较小的k值,那么就会意味着我们的整体模型会变得复杂,容易发生过拟合

    所谓的过拟合就是在训练集上准确率非常高,而在测试集上准确率低,经过上例,我们可以得到k太小会导致过拟合,很容易将一些噪声(如上图离五边形很近的黑色圆点)学习到模型中,而忽略了数据真实的分布!

    如果我们选取较大的k值,就相当于用较大邻域中的训练数据进行预测,这时与输入实例较远的(不相似)训练实例也会对预测起作用,使预测发生错误,k值的增大意味着整体模型变得简单。

    k值增大怎么就意味着模型变得简单了,我们猜想,如果k=N(N为训练样本的个数),那么无论输入实例是什么,都将简单地预测它属于在训练实例中最多的类。这时,模型是不是非常简单,这相当于你压根就没有训练模型呀!直接拿训练数据统计了一下各个数据的类别,找最大的而已。

    k值既不能过大,也不能过小,那么我们一般怎么选取呢?

    李航博士书上讲到,我们一般选取一个较小的数值,通常采取 交叉验证法来选取最优的k值。(也就是说,选取k值很重要的关键是实验调参,类似于神经网络选取多少层这种,通过调整超参数来得到一个较好的结果)

  2.特征归一化  

    首先举例如下,我用一个人身高(cm)与脚码(尺码)大小来作为特征值,类别为男性或者女性。我们现在如果有5个训练样本,分布如下:

      A [(179,42),男] B [(178,43),男] C [(165,36)女] D [(177,42),男] E [(160,35),女]

    通过上述训练样本,很容易看到第一维身高特征是第二维脚码特征的4倍左右,那么在进行距离度量的时候,我们就会偏向于第一维特征。这样造成俩个特征并不是等价重要的,最终可能会导致距离计算错误,从而导致预测错误。

   测试验证:一个测试样本 F(167,43),让我们来预测他是男性还是女性,我们采取k=3来预测。

    下面我们用欧式距离分别算出F离训练样本的欧式距离,然后选取最近的3个,多数类别就是我们最终的结果,计算如下:

      

    由计算可以得到,最近的前三个分别是C,D,E三个样本,那么由C,E为女性,D为男性,女性多于男性得到我们要预测的结果为女性。

    这样问题就来了,一个女性的脚43码的可能性,远远小于男性脚43码的可能性,那么为什么算法还是会预测F为女性呢?那是因为由于各个特征量权重的不同,在这里导致了身高的重要性已经远远大于脚码了,这是不客观的。

    所以我们应该让每个特征都是,同等重要的,这也是我们要归一化的原因。

  归一化公式:

      

三、KNN算法总结

  1.k近邻算法的核心思想是,即时给定一个训练数据集,对于新的数据样本,在训练集中找到与该样本最邻近的k个样本,统计这k个样本的多数所属类,就把这个样本归结到这个所属类中。

  2.与该实例最近邻的k个实例,这个最近邻的定义是通过不同距离函数来定义,我们最常用的是欧式距离,还可以采用闵可夫斯基距离, 曼哈顿距离,切比雪夫距离,余弦距离等等

  3.为了保证每个特征同等重要性,我们这里对每个特征进行归一化。

  4.k值的选取,既不能太大,也不能太小,何值为最好,需要实验调整参数确定!

---下一篇:基于面向对象的KNN算法实现

原文地址:https://www.cnblogs.com/cmxbky1314/p/12349564.html

时间: 2024-07-31 17:57:29

人工智能--第二天--KNN算法的相关文章

Machine Learning In Action 第二章学习笔记: kNN算法

本文主要记录<Machine Learning In Action>中第二章的内容.书中以两个具体实例来介绍kNN(k nearest neighbors),分别是: 约会对象预测 手写数字识别 通过“约会对象”功能,基本能够了解到kNN算法的工作原理.“手写数字识别”与“约会对象预测”使用完全一样的算法代码,仅仅是数据集有变化. 约会对象预测 1 约会对象预测功能需求 主人公“张三”喜欢结交新朋友.“系统A”上面注册了很多类似于“张三”的用户,大家都想结交心朋友.“张三”最开始通过自己筛选的

基于python Knn 算法识别手写数字,计算准确率 ——第二弹

大家好~ 可爱的我又来了~ 今天我会分享一个简单的Knn算法实例,是小白的必备实例! 开始喽~ 首先我是用Jupyter新建的一个python文件 并且在相同文件夹中放了一个‘data’的图片文件夹里面从0-9个有5000张图片. 接下来是代码部分: 这是需要引用的部分数据包 建立X,y两个集合 digit =  cv2.imread('./data/%d/%d_%d.bmp'%(i,i,j)) #读取图片的位置 下面代码是转换数据类型 下面是输出结果 就这些啦!虽然还点粗糙但是我会努力哒~ 原

什么是 kNN 算法?

学习 machine learning 的最低要求是什么?  我发觉要求可以很低,甚至初中程度已经可以.  首先要学习一点 Python 编程,譬如这两本小孩子用的书:[1][2]便可.   数学方面,只需要知道「两点间距离」的公式(中学的座标几何会读到). 这本书第二章介绍 kNN 算法,包括 Python 程序: 其他章节的数学要求可能不同,但我目的是想说明,很多实用的人工智能的原理,其实也很简单的. kNN 是什么?  For example: 开始时,所有 data points 的 l

KNN算法与Kd树

最近邻法和k-近邻法 下面图片中只有三种豆,有三个豆是未知的种类,如何判定他们的种类? 提供一种思路,即:未知的豆离哪种豆最近就认为未知豆和该豆是同一种类.由此,我们引出最近邻算法的定义:为了判定未知样本的类别,以全部训练样本作为代表点,计算未知样本与所有训练样本的距离,并以最近邻者的类别作为决策未知样本类别的唯一依据.但是,最近邻算法明显是存在缺陷的,比如下面的例子:有一个未知形状(图中绿色的圆点),如何判断它是什么形状? 显然,最近邻算法的缺陷--对噪声数据过于敏感,为了解决这个问题,我们可

《机器学习实战》读书笔记2:K-近邻(kNN)算法

声明:文章是读书笔记,所以必然有大部分内容出自<机器学习实战>.外加个人的理解,另外修改了部分代码,并添加了注释 1.什么是K-近邻算法? 简单地说,k-近邻算法采用测量不同特征值之间距离的方法进行分类.不恰当但是形象地可以表述为近朱者赤,近墨者黑.它有如下特点: 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 适用数据范围:数值型和标称型 2.K-近邻算法的工作原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中

【machine learning】KNN算法

适逢学习机器学习基础知识,就将书中内容读读记记,本博文代码参考书本Machine Learning in Action(<机器学习实战>). 一.概述 kNN算法又称为k近邻分类(k-nearest neighbor classification)算法. kNN算法则是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别.该算法涉及3个主要因素:训练集.距离或相似的衡量.k的大小. 二.算法要点 1.指导思想 kNN算法的指导思想是"近朱者赤,近墨者黑&q

【机器学习算法实现】kNN算法__手写识别——基于Python和NumPy函数库

[机器学习算法实现]系列文章将记录个人阅读机器学习论文.书籍过程中所碰到的算法,每篇文章描述一个具体的算法.算法的编程实现.算法的具体应用实例.争取每个算法都用多种语言编程实现.所有代码共享至github:https://github.com/wepe/MachineLearning-Demo     欢迎交流指正! (1)kNN算法_手写识别实例--基于Python和NumPy函数库 1.kNN算法简介 kNN算法,即K最近邻(k-NearestNeighbor)分类算法,是最简单的机器学习算

机器学习实战之kNN算法

机器学习实战这本书是基于python的,如果我们想要完成python开发,那么python的开发环境必不可少: (1)python3.52,64位,这是我用的python版本 (2)numpy 1.11.3,64位,这是python的科学计算包,是python的一个矩阵类型,包含数组和矩阵,提供了大量的矩阵处理函数,使运算更加容易,执行更加迅速. (3)matplotlib 1.5.3,64位,在下载该工具时,一定要对应好python的版本,处理器版本,matplotlib可以认为是python

机器学习之KNN算法

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