机器学习经典算法【第一话】:KNN,K-means

机器学习经典算法【第一话】:KNN,K-means

原理:KNN算法——机器学习的门口:

首先,我们要区分KNN和K-means算法,KNN是分类算法,而K-means是聚类算法

什么为之分类,什么为之聚类?

分类
好比我们已经知道一堆豆子里面有黄豆,红豆,绿豆三种,但我们有新的豆子,需要知道新的豆子属于哪一种,现在我们把豆子和已知的这堆豆子比对,这颗新豆子和哪种类型的豆子相似,那么我们就认定这颗新豆子属于哪一类,这叫分类。有点像近朱者赤近墨者黑的道理。

聚类
而所谓聚类,就好比一堆豆子各种混再一起了,现在我们还不知道这堆豆子有多少类,我们需要定义类别把这堆豆子分出类来。

KNN是输入基于实例的学习,属于懒惰学习,即KNN没有显式的学习过程,也就是说没有训练阶段,数据集事先已有了分类和特征值,待收到新样本后直接进行处理。

KNN是通过测量不同特征值之间的距离进行分类。

算法的描述:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类

经典示例

我们要确定绿点属于哪个颜色(红色或者蓝色),要做的就是选出距离目标点距离最近的k个点,看这k个点的大多数颜色是什么颜色。当k取3的时候,我们可以看出距离最近的三个,分别是红色、红色、蓝色,因此得到目标点为红色。
在这里插入图片描述
K的取值

K:临近数,即在预测目标点时取几个临近的点来预测。

  • 如果当K的取值过小时,一旦有噪声将会对预测产生比较大影响
  • K值的增大就意味着整体的模型变得简单,可以想象:K=所有样本数量的时候
  • K的取值尽量要取奇数,以保证在计算结果最后会产生一个较多的类别,如果取偶数可能会产生相等的情况,不利于预测。

常用的方法是从 k=1 开始,使用检验集估计分类器的误差率。重复该过程,每次K增值1,允许增加一个近邻。选取产生最小误差率的K。

一般k的取值不超过20,上限是n的开方,随着数据集的增大,K的值也要增大。

KNN评价

KNN对于随机分布的数据集分类效果较差,对于类内间距小,类间间距大的数据集分类效果好,而且对于边界不规则的数据效果好于线性分类器。

KNN对于样本不均衡的数据效果不好,需要进行改进。改进的方法时对k个近邻数据赋予权重,比如距离测试样本越近,权重越大。

KNN很耗时,时间复杂度为O(n),一般适用于样本数较少的数据集,当数据量大时,可以将数据以树的形式呈现,能提高速度,常用的有kd-tree和ball-tree。

===============================

原理:K-means算法

前面提到,K-means属于聚类算法,把一堆混再一起的豆子进行分类。

算法的描述:

1)选取多个随机的类别中心点(后面会讲怎样选择)

2)计算所有样本点到所有类别中心点的距离(这里默认使用欧式距离)

3)然后对于每个样本而言选出距离自己最近的那个样本中心,则把自己划分到那类

4)校正样本中心

5)迭代重复 2,3 步,直到收敛(也就是样本中心基本不发生变化的时候)

例子

假如现在我们有一堆二维的点分布如下,假如我们想把它分成三类。那么首先我们锚定三个随机的样本类别中心。

在这里插入图片描述
经过第一次迭代之后(对于每个样本而言选出距离自己最近的那个样本中心,则把自己划分到那类)
我们要对样本中心进行校正。
如下图:
在这里插入图片描述
校正样本中心之后:
在这里插入图片描述
之后不断重复迭代,直到样本中心不再发生大规模偏移,则可认定为收敛,判定为训练完毕。我们需要的就是最后训练出来的所有样本中心。

最初的样本中心选择对结果的影响

假如开始的样本中心都选择在一个距离差不多的地方,容易造成局部最优的现象(局部过度分类)

关于最初始所有样本中心的选择

  • 方法1:多次Random
    取多次随机值,利用概率来把几个样本中心打散。

  • 方法2:最远选取
    先随机选取 K1,然后遍历所有的点,选取最远的作为 K2,(为避免噪声的影响,也可以选择倒数远几个作为 K2)。然后如法炮制,保持剩下的K3,4,5…两两之间距离差不多

展开阅读全文

Git 实用技巧

11-24
这几年越来越多的开发团队使用了Git,掌握Git的使用已经越来越重要,已经是一个开发者必备的一项技能;但很多人在刚开始学习Git的时候会遇到很多疑问,比如之前使用过SVN的开发者想不通Git提交代码为什么需要先commit然后再去push,而不是一条命令一次性搞定; 更多的开发者对Git已经入门,不过在遇到一些代码冲突、需要恢复Git代码时候就不知所措,这个时候哪些对 Git掌握得比较好的少数人,就像团队中的神一样,在队友遇到 Git 相关的问题的时候用各种流利的操作来帮助队友于水火。 我去年刚加入新团队,发现一些同事对Git的常规操作没太大问题,但对Git的理解还是比较生疏,比如说分支和分支之间的关联关系、合并代码时候的冲突解决、提交代码前未拉取新代码导致冲突问题的处理等,我在协助处理这些问题的时候也记录各种问题的解决办法,希望整理后通过教程帮助到更多对Git操作进阶的开发者。 本期教程学习方法分为“掌握基础——稳步进阶——熟悉协作”三个层次。从掌握基础的 Git的推送和拉取开始,以案例进行演示,分析每一个步骤的操作方式和原理,从理解Git 工具的操作到学会代码存储结构、演示不同场景下Git遇到问题的不同处理方案。循序渐进让同学们掌握Git工具在团队协作中的整体协作流程。 在教程中会通过大量案例进行分析,案例会模拟在工作中遇到的问题,从最基础的代码提交和拉取、代码冲突解决、代码仓库的数据维护、Git服务端搭建等。为了让同学们容易理解,对Git简单易懂,文章中详细记录了详细的操作步骤,提供大量演示截图和解析。在教程的最后部分,会从提升团队整体效率的角度对Git工具进行讲解,包括规范操作、Gitlab的搭建、钩子事件的应用等。 为了让同学们可以利用碎片化时间来灵活学习,在教程文章中大程度降低了上下文的依赖,让大家可以在工作之余进行学习与实战,并同时掌握里面涉及的Git不常见操作的相关知识,理解Git工具在工作遇到的问题解决思路和方法,相信一定会对大家的前端技能进阶大有帮助。
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值