k近邻算法(KNN)是一种基本的分类和回归算法。

理解:给定一个训练好的数据集,输入一个新的数据,在训练好的数据集中能找到与新的数据最邻近的k个数据。如果做分类的话,那就是这k个数据多数属于某个类,那么这个新的数据就属于某个类;如果做回归的话,就把这k个数据求平均值,结果就是回归的结果。

KNN的三要素:k值的选择,距离度量以及分类决策。
解释:k值就是找最近的数据数量,距离度量有很多种,比如:欧式距离,切比雪夫距离、信息熵(决策树用),决策分类就是用多数表决啊还是什么方法进行决策。

算法:
1.输入训练集:T={(x1,y1),(x2,y2)…(xi,yi)}
xi:x的特征向量,也就是f(x)这种函数里的x
yi: y是x的类别,也就是y=f(x)的y
2.根据距离度量找出和x最近的k个点。涵盖这k个点的领域记作Nk(x)
3.利用分类决策法决定x的类别y:
y=arg max∑I(yi=cj) i=1,2…k j=1,2…k

argmax是一种函数,是对函数求参数(集合)的函数。当我们有另一个函数y=f(x)时,若有结果x0= argmax(f(x)),则表示当函数f(x)取x=x0的时候,得到f(x)取值范围的最大值;若有多个点使得f(x)取得相同的最大值,那么argmax(f(x))的结果就是一个点集。换句话说,argmax(f(x))是使得 f(x)取得最大值所对应的变量点x(或x的集合)。

cj:数据可能的种类
yi:数据集中数据的种类

距离度量:两个实例点的相似程度的反应
例如:两个数据(矩阵)xi,xj求距离:
L=(∑|xi(l)-xj(l)|p)1/p
l是样本的第几个特征,如x=[1,2,3] x1就是x的第一个特征1。这里p>=0。
如果p=2那就是欧氏距离。p=1是曼哈顿距离。p=∞就是各个作标距离的最大值。

k值要和实际情况相近,通常用交叉验证来找k值。
没做过项目请忽视,以后会说的.

损失函数:
loss=1/k*∑I(yi≠cj)
意思是在k个最近的实例点中,看看有几个类型错误的实例点。

我们的目的是让loss最小化。

但是如果我们有以前甚至一万个数据的时候,进行线性扫描(一个个数据点算距离)会特别麻烦,计算很耗时,那怎么办呢?
我在这里提出一个kd树的方法。
kd树就是二叉树:

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。


kd树介绍:是一种对k维空间中的实例点进行存储以便进行对其快速检索的树形数据结构。kd树就是二叉树,表示对k维空间的一个划分。构建kd树县东港与不停的用垂直于坐标轴的超平面对k维空间进行划分(树的枝子不断分化,一个枝子变成俩),构成一系列k维超矩形区域。

简单说就是一个实例有多个特征吧,每层对特征不断划分。直到所有特征被划分完。划分就是一个结点分成两个结点,如二叉树的图F分成了C和E两个方向的结点。

那么,咱们是拿什么标准为划分的呢,如:x1=[1,2,3],x2=[3,4,10].x3=[1,2,3]
咱们要划分第一个特征就拿三个数据的第一个特征的中位数,1,3,1的中位数为1所以拿1当切分点(划分的)。

算法:
输入的数据:数据集T={x1,x2,x3…xn}
xi=(x(1),x(2),x(3)…x(l)) i=1,2,3…n
1.我们首先建立根节点,开始深度为0(就是看几层),拿x(1)这个特征作的中位数为分类标准,将根节点对应的超矩形区域切分成两个子区域(就是从根节点分出两个树枝)。其左边小于中位数,右边大于中位数。深度+1/
2.重复进行1,但是深度为j的结点,选择x(l)为切分的坐标轴,l=j(mod k)+1
k是数据维度(特征个数),重复1不断切分。直到分的左右子区域(根生成的左右结点)都没有数据为止

kd树建好了怎么进行搜索呢?
kd树的搜索算法:
输入:kd树,目标数据点x
要求:输出x的最近邻
1.将x从根节点出发,不断向下访问kd树,小于当前结点的数据就向左,否则当前数据结点就向右。直到到达子节点为止。
2.把这个结点当成当前的最近点。
3.慢慢的把结点往上退,不断进行以下操作:
如果该节点保存的实例比当前最近点距离目标点x当坐当亲最近点。
当前最近点一定存在于该结点的一个子结点对应的区域。检查该子节点的父节点的另一个子节点是否有更近的点,具体的,检测另一个子节点对应的区域是否有以目标点为球心,与当前最近点间距离为半径的超球体相交,如果相交,可能存在另一个子节点对应的区域内存在距目标点更近的点,移动到另一个子节点,递归进行最近邻搜索
如果不相交,继续回退。
4.当退回到根节点时,搜索结束,最后的当前最近点就是x的最近点。

kd树的时间复杂度为O(logN),数据数要大于维数才好用。

机器学习初级入门(二)KNN相关推荐

  1. 短链服务问题解决-跳转问题-短链生成方案初级入门(二) 连载持续更新中

    目录 1.问题一:长链的关系和短链的关系是一对一还是一对多? 2.问题二:前端访问短链是如何跳转到对应的页面的? 3.问题三:短链码如何是如何生成的 为什么要用62进制转换,不是64进制? 1.问题一 ...

  2. 机器学习分类算法(二)-KNN(近邻)算法

    一.简单k-近邻算法 本文将从k-近邻(kNN)算法的思想开始讲起.并且,并会提供相应的数据集.除此之外,也会对sklearn实现k-近邻算法的方法进行讲解. 并配备一定的实战实例 电影类别分类 约会 ...

  3. Andrew Ng机器学习算法入门(二):机器学习分类

    机器学习的定义 Arthur Samuel给出的定义,Field of Study that gives computers the ability to learn without being ex ...

  4. 机器学习初级入门(一)感知机

    理解:感知机是分类模型,其单个特征向量最终训练结果是{+1,-1}.(这里不用输入空间,输出空间等术语). 函数:y=sign(wx+b) 参数解析:w和b是感知机的模型参数(不了解不要紧,往下看), ...

  5. Meteor 初级入门 三

    废话先: 今天的废话呢有些多,主要是我在学习Meteor中遇到的一些问题,待这些问题解决后我们继续Meteor 初级入门 三的叙述. 前几天我就简单的搞了一个用户注册的界面,这里说明一下,Meteor ...

  6. 短链服务和应用场景介绍-初级入门(一) 连载持续更新中

    目录 1.什么是短链? 2.为什么需要这种短链服务? 3.短链组成 4.最简单的方式 5.短链创建者和访问者周期 6.短链URL生成服务里面的问题你能提前想到哪些? 1.什么是短链? 协议://短链域 ...

  7. 深度学习-机器学习从入门到深入全套资源分享

    深度学习.机器学习从入门到深入,全套资源分享.涉及深度学习.机器学习数学.算法基础理论.实战和工程开发相关最佳资源.深度学习常用模型相关教程,深度学习模型优化.调参相关技巧:深度学习常用的框架,公开数 ...

  8. 用 Python 手写机器学习最简单的 KNN 算法

    作者 | 苏克1900 责编 | 胡巍巍 说实话,相比爬虫,掌握机器学习更实用竞争力也更强些. 目前网上大多这类教程对新手都不友好,要么直接调用 Sklearn 包,要么满篇抽象枯燥的算法公式文字,看 ...

  9. python机器学习快速入门

    机器学习快速入门 这是机器学习小白在csdn更新的第一篇文,课程学习资料来源于黑马程序员的3天快速入门python机器学习课程.由于本小白在学完特征工程后转去看吴恩达在coursera的机器学习课程 ...

最新文章

  1. 2014搜狗前端面经【B事业部】
  2. RxJava实现事件总线——RxBus
  3. java广告投放系统_[Spring cloud 一步步实现广告系统] 5. 投放系统配置+启动+实体类...
  4. WPF Binding
  5. 【2019浙江省赛 - A】Vertices in the Pocket(权值线段树下二分,图,思维)
  6. Spring 经典面试题汇总.pdf(2020版)
  7. iPhone 13 Pro手机壳曝光 网友:更丑了
  8. 在计算机里分数线怎么表示什么意思,高考投档分数线是什么意思 怎么定的
  9. 12 行列式01---定义、计算 与性质、排列、逆序数、n 阶行列式、上三角形行列、矩阵的初等行变换与行列式性质
  10. Oracle Study之案例--在RAW上controlfile多元化
  11. HSV空间改进的多尺度Retinex算法
  12. 21_nips_深度学习损失景观的嵌入原则
  13. 快速开发 HTML5 交互式地铁线路图
  14. 一对一直播源码开发,如何改善音视频通话过程中的用户体验?
  15. python进阶day4
  16. r9 5900x配什么主板、显卡、散热
  17. win7 android usb驱动,在win7系统下安装手机usb驱动软件的教程
  18. java输出字符串的长度_Java格式化字串输出固定长度
  19. 人工智能免遥控 暴风65英寸人工智能电视X5 ECHO评测
  20. scrapy.loader.processors.TakeFirst is deprecated, instantiate itemloaders.processors.TakeFirst inste

热门文章

  1. 软件项目经理新手上路16 - 后记,一切才刚刚开始
  2. 【To Understand !!! DP or 递归】LeetCode 87. Scramble String
  3. 关于显式量化和隐式量化的英文对照
  4. python 求点集的距离矩阵
  5. Golang map的底层实现
  6. 移动端设备管理平台 atx server2实践
  7. 谈谈MySQL的WriteSet并行复制
  8. C++中数字和字符串的转换
  9. 设计模式-------建造者模式(生成器模式)
  10. map/reduce之间的shuffle,partition,combiner过程的详解