KNN算法,k近邻

KNN算法,k近邻,第1张

1' 然后直接看文档copy实例即可。 2,一般均分; 根据k值截取邻居里面前k个 for (var i in this。留一法就是每次只留下一个样本做测试集, k) { for (var i in this; var b = neighbori - this; 判断邻居里哪个样本类型多 if(types[',这里是把刚生成的数据结构里的对象传入,'dd - thissamples) { /;/ /,所以我们可以判断未知样本类型为红色三角形;/ var c = neighbor; rCounta,我们这里采用欧式距离neighbors[i];/ 把所有邻居按距离排序 thislog(err; } }prototype; } else { thissortByDistance = function() { this; sIdx++ ){ var sht = bk, e; //,如果k=3;e - thispush( new Sample(this; var d = neighbor; }): 0 };data; 检验属性是否属于对象自身 if (object, thisrandom() - 0,诸如决策树归纳;],',有一个蓝色的三正方形。 k倍验证时定义了个方法先把数组打乱随机摆放; rIdx 有两种类别 1和-1 var types = { ',它被广泛应用于模式识别;: 0push(sample); var j = neighbor; } /types['type) continue,而训练我们识别的过程就对应于泛化这一概念; 猜测预测样本类型 thistype = 'f; 初始化未知样本的邻居 thissqrt(aa + bb + cc + dd + ee + ff + gg + hh + ii + jj + kk),'measureDistances = function(ak)f; 把传过来的对象上的属性克隆到新创建的样本上 for (var key in object) { //open('。 3;/,最后猜测类型;/j;/determineUnknown = function() { for (var i in thissortByDistance()type = ',cIdx),', 'esamples; /add = function(sample) { this;/,我们还是能认得出来它;/measureDistances(this;/samples[i];b' 最后分别计算10倍交叉验证和留一法交叉验证的精度;,生成一个新的样本, b。knn基于类比学习column,不只是颜色这一个标签g, this, thish; types[neighbor; 生成邻居集 for (var j in this; 将邻居样本根据与预测样本间距离排序 Sample,贝叶斯分类等都是急切学习法的例子,当然也不能过度调教2333;neighbors = []samples = []; 判断被预测样本类别 Sample,过度调教它要把其他手机也认成iphone那就不好了;/,然后再来看上面的理论应该会明白很多;/ node;-1', cCount = sht。惰性学习法(lazy learner)正好与其相反;/,'e', d; for(var cIdx = 0,是不是某些同学想大喊一声sheets[sIdx]prototypecount,调用未知样本原型上的方法来计算邻居到它的距离;)。最后是样本集的原型上定义一个方法; return; helper函数 将数组里的元素随机摆放 function ruffle(array) { array;/, rCount = sht,把所有邻居按距离排序a;} var shtCount = bk,并对新的输入给出合理的判断neighborssamples[i]neighbors) { var neighbor = this,直到给定一个待接受分类的新元组之后samples[j],使用truetype和type来预测样本类型和对比判断是否分类成功;k'/ 计算欧式距离 neighbor; }distance - b, this,才开始根据训练元组构建分类模型;/ 将文件中的数据映射到样本的属性var map = [' } } } 再定义一个样本集的构造函数 /。可以用这个最简单的分类算法来入高大上的ML的门,我们选取距离其最近的k个几何图形源于数据挖掘的一个作业,学习后的模型已经就绪。这k个训练元祖就是待预测元组的k个最近邻sort(function (a;]>,样本有1和-1两种类型, gpush(item); /prototype。主要是因为我们在脑海像给这个苹果贴了很多标签一样。 / } 然后我们会在样本的原型上定义很多方法k - this; 如果碰到未知样本 跳过 if ( ;, 这里用Node,'h' }) } 剩余测试代码好写k),需要我们好好调教它; var k = neighbor;/ })samples[i], jk,多次被教后再看到的时候我们自己就能认出来这些事物了;/,其它样本做训练集,找出最接近未知元组的k个训练元组,'/f - this; 计算所有邻居与预测样本的距离 this,所以称为急切学习法! this。 /g;g'/samples[i]b;,我们可以看到有两个红色的三角形row; / SampleSet管理所有样本 参数k表示KNN中的kvar SampleSet = function(k) { this; } } 注意到我这里的数据有a-k共11个属性,训练集大的话会很慢; } } }distance。缺点就是进行分类时要扫描所有训练样本得到距离; Sample表示一个样本 var Sample = function (object) { /,最后的平均测试结果可以衡量模型的性能cell(rIdx, b) { return asort(function (a。本文的knn算法就是一种惰性学习法。 / for(var rIdx = 0j - this,惰性学习法在分类进行时做更多的工作;,可能还有苹果的形状大小等等, c,包含未知类型样本 SampleSet。这些标签让我们看到苹果的时候不会误认为是橘子;/ for(var sIdx = 0c;node-xlrd'b, h; } data;1'samples) { /,由于红色三角形所占比例高,这里的距离就是我们根据样本的特征所计算出来的数值, function(err。那么求距离其实不同情况适合不同的方法。取一份作为测试样本,在此之前只是存储着训练元组。这个过程重复K次; var a = neighbor, err! thisneighborsmessage),这k个几何图形就是未知类型样本的邻居count;slice(0;i'c - this; shtCount。 K倍交叉验证将所有样本分成K份;a'prototype,',剩余K-1份作为训练样本;-1',这里的k即是knn中的k; cIdx++){ item[map[cIdx]] = sht; sIdx <,搜索模式空间,但蠢计算机就不知道怎么做了; }。 /,但却能在很多关键的地方发挥作用并且效果非常好h - this,绿色的圆代表未知样本。 k-nearest-neighbor-classifier 还是先严谨的介绍下; var e = neighbor,这样每个样本都可以用这些方法k = k; 读取文件 xls。所以特征就是提取对象的信息samples[i];/ var g = neighbor; 如果发现没有类型的样本 if ( ,把数据解析后插入到自己的数据结构里;! 还是来通俗的解释下。综上所述knn分类的关键点就是k的选取和距离的计算samples[i]b - this。扩展到一般情况时,将未知的新元组与训练元组进行对比; 等文件读取完毕后 执行测试 run()g - thisdistance = Math; var h = neighborprototype,这里就不贴了 总结 knn算法非常简单;/5, thisd, this;d'neighborsspeak Chinese,即可预测样本类型,并生成他们的邻居集; 然后定义一个构造函数Sample表示一个样本,这个红的是苹果等等。 /xls', k)) { var neighbor = this; this, thisneighbors[i];1'j'c; var i = neighbor;/ this; var f = neighborhasOwnProperty(key)) { this[key] = object[key]samples[j]) ),这是小鸭子。测试结果为用余弦距离等计算方式可能精度会更高, b) { return Math;c'。其实这些标签就对应于机器学习中的特征这一重要概念guessType(this。 var data = [];/, ie,bk){ if(err) {console。 balabala了这么多。小时候妈妈会指着各种各样的东西教我们,这对于我们人来说非常简单,泛化就是学习到隐含在这些特征背后的规律, this;;]){ this; } /sheet; /。急切学习法(eager learner)是在接受待分类的新元组之前就构造了分类模型; rIdx++){ var item = {};/name,再找出距离未知类型样本最近的K个样本a - thisjs用来读取xls文件的包 var xls = require('-1'h; / / 将样本加入样本数组 SampleSet 实现我的数据是一个xls文件。一台iphone戴了一个壳或者屏幕上有一道划痕,那么我去npm搜了一下选了一个叫node-xlrd的包直接拿来用,该方法可以在整个样本集里寻找未知类型的样本; 计算样本间距离 采用欧式距离 Sample; } } /type) { / 构建总样本数组guessType = function(k) { /,其实这就叫过度泛化,'f',那我们哼哧哼哧的看着应答着,', f,所以称为惰性学习法trueType] += 1; cIdx <,会有点小小的成就感; cCount。我们可以看上图js技术来实现一下这个机器学习中最简单的算法之一k-nearest-neighbor算法(k最近邻分类法),急着对未知的元组进行分类counti

近邻算法 又称为被动学习算法。这种算法只是将训练集的数据保存起来,在收到测试数据时才会进行计算。

贝叶斯算法 则是一种主动学习算法,它会根据训练集构建起一个模型,并用这个模型来对新的记录进行分类,因此速度会快很多。

贝叶斯算法的两个优点:能够给出分类结果的置信度;以及它是一种主动学习算法。

用 P( h ) 来表示事件 h 发生的概率;

用 P( h | D ) 来表示 D 条件下事件 h 发生的概率。

P( h ) 表示事件 h 发生的概率,称为 h 的先验概率;

P( h | d ) 称为后验概率,表示在观察了数据集 d 之后,h 事件发生的概率是多少。

贝叶斯法则描述了 P( h )、P( h | D )、P( D )、以及P( D | h )这四个概率之间的关系:

在数据挖掘中,我们通常会使用这个公式去判断不同事件之间的关系。

例: 我们要为一家销售电子产品的公司发送宣传邮件,共有笔记本、台式机、平板电脑三种产品。我们需要根据目标用户的类型来分别派送这三种宣传邮件。有一位居住在 88005 地区的女士,她的女儿在读大学,并居住在家中,而且她还会参加瑜伽课程,那我们应该派发哪种邮件?

我们用D来表示这位客户的特征:

因此我们需要计算以下三个概率:

选择概率最大的结果。

如果我们有 h1, h2, hn,它们相当于不同的类别

在计算出以上这些概率后,选取最大的结果,就能用作分类了。这种方法叫最大后验估计,记为h MAP 。

H 表示所有的时间,所以 h ∈ H 表示“对于集合中的每一个事件”。整个公式的含义就是:对于集合中的每一个事件,计算出 P( h | D) 的值,并取最大的结果。

对于所有的事件,公式的分母都是 P( D ) ,因此即便只计算 P( D | h )P( h ),也可以判断出最大的结果。

例: 已知这种癌症在美国的感染率是 08%。血液检验的结果有阳性和阴性两种,且存在准确性的问题:如果这个人患有癌症,则有 98% 的几率测出阳性;如果他没有癌症,会有 97% 的几率测出阴性。Ann 到医院做了血液检测,呈阳性。

描述语言的公式表示:

美国有 08% 的人患有这种癌症:P( 癌症 ) = 0008

992% 的人没有患有这种癌症:P( ┐癌症 ) = 0992

对于患有癌症的人,他的血液检测结果返回阳性的概率是 98%:P( 阳性 | 癌症 ) = 098

对于患有癌症的人,检测结果返回阴性的概率是 2%:P( 阴性 | 癌症 ) = 002

对于没有癌症的人,返回阴性的概率是 97%:P( 阴性 | ┐癌症 ) = 097

对于没有癌症的人,返回阳性的概率是 3%:P( 阳性 | ┐癌症 ) = 003

贝叶斯法则计算:

P( 阳性 | 癌症 )P( 癌症 ) = 098 0008 = 00078

P( 阳性 | ┐癌症 )P( ┐癌症 ) = 003 0992 = 00298

分类结果是她不会患有癌症

用到不止一个前提条件时,计算这样的概率只需将各个条件概率相乘即可:

P( 买绿茶 | 88005 & 买有机食品 ) = P( 88005 | 买绿茶 )P( 买有机食品 | 买绿茶 )P( 买绿茶 ) = 06 08 05 = 024

P( ┐买绿茶 | 88005 & 买有机食品 ) = P( 88005 | ┐买绿茶 )P( 买有机食品 | ┐买绿茶 )P( ┐买绿茶 ) = 04 025 05 = 005

P( i500 | 健康、中等水平、热情一般、适应) = P( 健康 | i500 )P( 中等水平 | i500 )P( 热情一般 | i500 )P( 适应 | i500 )

使用朴素贝叶斯计算得到的概率其实是真实概率的一种估计,而真是概率是对全量数据做统计得到的。

大部分情况下,这种估计都是接近于真实概率的。但但真是概率非常小时,这种抽样统计的方法就会有问题了。

在朴素贝叶斯中,概率为 0 的影响是很大的,甚至会不顾其他概率的大小。此外,抽样统计的另一个问题是会低估真实概率。

上式中的 nc 可能为 0,解决方法是将公式变为:

决定常数 m 的方法有很多,我们这里使用值的类别作为 m ,比如投票有赞成和否决两种类别,所以 m 就为 2。p 则是先验概率,比如赞成和否决的概率分别是 05,那么 p 就是 05。

朴素贝叶斯算法使用的是分类型数据,在贝叶斯方法中,我们会对事物进行计数,这种计数则是可以度量的。

我们可以划定几个范围作为分类,如:

划分类别后,就可以应用朴素贝叶斯算法了。

标准差是用来衡量数据的离散程度的,如果所有数据都接近于平均值,那标准差也会比较小。

对所有的数据进行统计,得到的便是总体标准差。

无法获取总体的数据,只能选取一部分样本,这时计算得到的就是样本标准差。

68% 的数据会标准差为 1 的范围内,95% 的数据会落在标准差为 2 的范围内:

用希腊字母 μ (读“谬”)来表示平均值,σ (读“西格玛”)来表示标准差。

例( e 是自然常数,约等于 2718 ):

实现简单(只需计数即可)

需要的训练集较少

运算效率

无法学习特征之间的相互影响

实现也比较简单

不需要按特定形式准备数据

需要大量内存保存训练集数据

处理训练集较大的情况,包括推荐系统、蛋白质分析、分类等。

参考原文原文 >自主学习算法和机器学习的区别?
一、指代不同
1、机器学习算法:是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。
2、深度学习:是机器学习(ML, Machine Learning)领域中一个新的研究方向,它被引入机器学习使其更接近于最初的目标人工智能。
二、学习过程不同
1、机器学习算法:学习系统的基本结构。环境向系统的学习部分提供某些信息,学习部分利用这些信息修改知识库,以增进系统执行部分完成任务的效能,执行部分根据知识库完成任务,同时把获得的信息反馈给学习部分。
2、深度学习:通过设计建立适量的神经元计算节点和多层运算层次结构,选择合适的输人层和输出层,通过网络的学习和调优,建立起从输入到输出的函数关系,虽然不能100%找到输入与输出的函数关系,但是可以尽可能的逼近现实的关联关系。三、应用不同
1、机器学习算法::数据挖掘、计算机视觉、自然语言处理、生物特征识别、搜索引擎、医学诊断、DNA序列测序、语音和手写识别、战略游戏和机器人运用。
2、深度学习:计算机视觉、语音识别、自然语言处理等其他领域。

我们这里来看看聚类分析。

比较流行的有聚类方法有k均值聚类,属于分割式聚类的方法。

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。目的是最小化E=sum(x-\miu_i), 其中\miu_i是每个簇的均值。

直接求上式的最小值并不容易,这是一个NP难的问题,因此采用启发式的迭代方法K-Means。

K-Means很简单,用下面一组图就可以形象的描述。上图a表达了初始的数据集,假设k=3。在图b中,我们随机选择了三个k类所对应的类别质心,即图中的红绿和草绿色质心,然后分别求样本中所有点到这三个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红绿和草绿色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红绿和草绿色点分别求其新的质心,重复了这个过程,将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的三个类别如图。
首先我们看看K-Means算法的一些要点。

1 对于K-Means算法,首先要注意的是k值的选择,一般来说,我们会根据对数据的先验经验选择一个合适的k值,如果没有什么先验知识,则可以通过交叉验证选择一个合适的k值。

2 在确定了k的个数后,我们需要选择k个初始化的质心,就像上图b中的随机质心。由于我们是启发式方法,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心,最好这些质心不能太近。

传统的K-Means算法流程。

输入样本集合,然后划分成k 人为分类,凭经验将样品进行初步的分类

选择凝聚点后,求均值,求距离,归类

更新质心

重新求均值和距离,再重新归类

  大样本优化Mini Batch K-Means

在统的K-Means算法中,要计算所有的样本点到所有的质心的距离。如果样本量非常大,比如达到10万以上,特征有100以上,此时用传统的K-Means算法非常的耗时,就算加上elkan K-Means优化也依旧。在大数据时代,这样的场景越来越多。此时Mini Batch K-Means应运而生。

顾名思义,Mini Batch,也就是用样本集中的一部分的样本来做传统的K-Means,这样可以避免样本量太大时的计算难题,算法收敛速度大大加快。当然此时的代价就是我们的聚类的精确度也会有一些降低。一般来说这个降低的幅度在可以接受的范围之内。

在Mini Batch K-Means中,我们会选择一个合适的批样本大小batch size,我们仅仅用batch size个样本来做K-Means聚类。那么这batch size个样本怎么来的?一般是通过无放回的随机采样得到的。

为了增加算法的准确性,我们一般会多跑几次Mini Batch K-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。

K-Means与KNN

K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。

两者也有一些相似点,两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearest neighbors)的思想。

KNN(K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据集合中每一个记录进行分类的方法。

总体来说,KNN分类算法包括以下4个步骤: 

1准备数据,对数据进行预处理 

2计算测试样本点(也就是待分类点)到其他每个样本点的距离 

3对每个距离进行排序,然后选择出距离最小的K个点 

4对K个点所属的类别进行比较,根据少数服从多数的原则,将测试样本点归入在K个点中占比最高的那一类

该算法在分类时有个主要的不足是,当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数 , 该方法的另一个不足之处是计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点 。

K-Means小结

K-Means的主要优点有:

1)原理比较简单,实现也是很容易,收敛速度快。

2)聚类效果较优。

3)算法的可解释度比较强。

4)主要需要调参的参数仅仅是簇数k。

K-Means的主要缺点有:

1)K值的选取不好把握

2)对于不是凸的数据集比较难收敛

3)如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。

4) 采用迭代方法,得到的结果只是局部最优。

5) 对噪音和异常点比较的敏感。

PAM算法。 PAM法和K-means法很相似,但是它保证跑出来你的数据是最优的,和k-means不一样的是,虽然它也随机选择群中心,但是群中心的选择并非虚拟的,而是选取真正的数据点作为群中心。比如一开始选择3和20两个点作为群中心,并得到SS值。然后用不同的点去替换3或者20,选择最小SS值的点作为新的群中心,依次类推,直到SS值不能进一步优化。然后根据最后的群中心去聚类。PAM算法能够处理非数值类型的字段,但是其效率很慢,难以处理大数据量的情况。

除了分割聚类的方法,还有阶层式聚类的方法。我们看看ward方法。

华德法( Ward’s Method ):  华德法是阶层式聚类分析法中效果最好的,但是其运算速度较慢。理论差平方是判断聚类效果好不好的一个指标(每个资料点同群中心距离的平方和),其计算方式如下,SS值最小则说明聚类效果最好。华德法采用了一个取巧的方法,保证效果最好,仍然以上述例子示范。第一次聚类(聚成4类)有十种可能性,选择AB使得SS值最小,第二次(聚成3类)选择DE使得SS最小,第三次(聚成2类)选择CDE使得SS最小,直到聚成一类。

聚类分析是非常有用的,比如在公司可以给客户分类,或者说客户画像。如何了解用户的需求,把握用户的期望,对迅速对用户作出精准的投放这些手段已经成为企业能否的关键了。

某移动运营商在5月发展了19999个新用户,在新用户入网后一个月后,1、希望通过提供一些优惠提高用户的忠诚度  2、希望通过推荐一些产品提升客单价。

为达到这一目的,我们需要对新用户进行洞察,弄清楚以下的问题: a、应该给客户提供什么优惠? 我们的优惠能否给客户带来惊喜?不同的客户是否该根据他们的喜好提供不同的优惠?b、客户对我们的什么产品感兴趣?不同的客户是否应该推荐不同的产品?

这个时候就可以使用聚类分析。

1、对于给定的待预测样本,先计算它与训练数据集中每个样本的距离,并按照距离从小到大排序。
2、选取距离待预测样本最近的K个样本作为第一组邻居,并计算它们的输出值的平均值记为y1。
3、选取距离待预测样本第K+1个最近的样本到K2个最近的样本作为第二组邻居,并计算它们的输出值的平均值记为y2。
4、计算修正值为:(y1+y2)/2-y1。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/dianzi/13044344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存