matlab学习系列22.knn算法.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
21. KNN算法 KNN算法又称为k近邻分类(k-nearest neighbor classification)算法,是从训练集中找到和新数据最接近的k条记录,然后根据他们的主要分类来决定新数据的类别。该算法涉及3个主要因素:训练集、距离或相似的衡量、k的大小。 一、算法要点 1. 指导思想 其指导思想是“近朱者赤,近墨者黑”,由你的邻居来推断出你的类别。 2. 算法步骤: 1)算距离:计算已知类别数据集合汇总的点与当前点的距离,按照距离递增次序排序; 2)找邻居:选取与当前点距离最近的K个点; 3)做分类:确定距离最近的前K个点所在类别的出现频率,返回距离最近的前K个点中频率最高的类别作为当前点的预测分类。 3. k值设定为多大? k太小,分类结果易受噪声点影响;k太大,近邻中又可能包含太多的其它类别的点。(对距离加权,可以降低k值设定的影响) k值通常是采用交叉检验来确定(以k=1为基准) 经验规则:k一般低于训练样本数的平方根 2.距离或相似度的衡量 什么是合适的距离衡量?距离越近应该意味着这两个点属于一个分类的可能性越大。常用的距离衡量包括欧氏距离、夹角余弦等。 对于文本分类来说,使用余弦(cosine)来计算相似度就比欧式(Euclidean)距离更合适。高维度对距离衡量的影响:众所周知当变量数越多,欧氏距离的区分能力就越差。 变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化。 3.类别的判定 投票决定:少数服从多数,近邻中哪个类别的点最多就分为该类。 加权投票法:根据距离的远近,对近邻的投票进行加权,距离越近则权重越大(权重为距离平方的倒数)。 投票法没有考虑近邻的距离的远近,距离更近的近邻也许更应该决定最终的分类,所以加权投票法更恰当一些。 4. 优缺点 1)优点 简单,易于理解,易于实现,无需估计参数,无需训练。适合对稀有事件进行分类(例如当流失率很低时,比如低于0.5%,构造流失预测模型)。特别适合于多分类问题(multi-modal, 对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM(支持向量机)的表现要好。 2)缺点 懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢。可解释性较差,无法给出决策树那样的规则。 二、Matlab实现 KNN.m function relustLabel=KNN(test,train,trainlabels,k,type) %% test 为一条输入测试数据,train为样本数据,trainlabels为样本标签,选取k个临近值 row = size(train,1); for j=1:row switch type case 1 % 求test到每个样本的欧氏距离 distanceMat(j)=sum((test-train(j,:)).^2); case 2 求test到每个样本的夹角余弦 distanceMat(j)=(train(j,:)*test)/(norm(train(j,:),2)*norm(test,2)); if distanceMat(j)0 distanceMat(j)=(distanceMat(j)+1)/2; end end end distanceMat=distanceMat; [B, IX] = sort(distanceMat,ascend); %距离从小到大排序 len = min(k,length(B)); %选k个邻近值,当然k不能超过训练样本个数 relustLabel = mode(trainlabels(IX(1:len))); % 取众数(即出现频率最高的label)作为返回结果 end 测试数据(部分): 主程序: load data; dataMat = data(:,1:3); labels = data(:,4); len = size(dataMat,1); k = 4; error = 0; %观察可视化数据 label1=find(data(:,4)==1); label2=find(data(:,4)==2); label3=find(data(:,4)==3); plot3(data(label1,1),data(label1,2),data(label1,3),ro); hold on plot3(data(label2,1),data(label2,2),data(label2,3),go); plot3(data(lab

文档评论(0)

wx171113 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档