knn是一种基本分类与回归方法

应用:knn算法不仅可以用于分类,还可以用于回归..

1、文本分类:文本分类主要应用于信息检索,机器翻译,自动文摘,信息过滤,邮件分类等任务.

2、可以使用knn算法做到比较通用的现有用户产品推荐,基于用户的最近邻(长得最像的用户)买了什么产品来推荐是种介于电子商务网站和sns网站之间的精确营销.只需要定期(例如每月)维护更新最近邻表就可以,基于最近邻表做搜索推荐可以很实时

优点:

1、简单,易于理解,易于实现,无需估计参数,无需训练,选择合适的k,对异常值不敏感;

2、适合于多分类问题(multi-modal,对象具有多个类别标签)

3、可拓展性强,添加新实例无需重新构造模型

缺点:

1、当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数.可以采用权值的方法(和该样本距离小的邻居权值大)来改进.

2、计算量较大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点.对于大数据分类,即需要大量的训练样本,计算复杂度高

3、可理解性差,无法给出像决策树那样的规则.

距离度量:

1、高维度对距离衡量的影响:众所周知当变量数越多,欧式距离的区分能力就越差.

2、变量值域对距离的影响:值域越大的变量常常会在距离计算中占据主导作用,因此应先对变量进行标准化.

K值选择:目前采用交叉验证方式,选出误差率最小的对应的K

构造:

1、随着树的深度增加,循环的选取坐标轴,作为分割超平面的法向量。对于3-d tree来说,根节点选取x轴,根节点的孩子选取y轴,根节点的孙子选取z轴,根节点的曾孙子选取x轴,这样循环下去。

2、每次均为所有对应实例的中位数的实例作为切分点,切分点作为父节点,左右两侧为划分的作为左右两子树。

对于n个实例的k维数据来说,建立kd-tree的时间复杂度为O(k*n*logn)。

搜索:

最近邻搜索如下(k最近邻,搜索k次,每次将上一次最近邻删除)

1、首先从根节点出发找到包含目标点的叶节点,目标点的最近邻一定在以目标点为中心,并通过当前叶节点的超球体内部,

2、然后从该叶节点出发,依次回退到父节点,

3、如果父节点的另一子节点的区域与超球体相交,则到该区域继续查找,不断的查找与目标点最近邻的节点,直到不能查找最近邻的节点为止。

############################R语言#########################

library(class)

knn(train,test,cl,k=1,l=0,prob=FALSE,use.all=TRUE)

################################案例###########################################

##############################案例#############################################

library(class)

library(nutshell) ######取数据集spambase做案例#########

library(sampling) ########用抽样函数strata做抽样###################

data(spambase)

spambase.strata<-strata(spambase,stratanames=c("is_spam"),size=c(1269,1951)

,method="srswor") ########变量ID_unit#描述了样本中的行号信息###########

spambase.training<-spambase[rownames(spambase)%in%spambase.strata$ID_unit,]

#####训练集#############

spambase.validation<-spambase[!(rownames(spambase)%in%spambase.strata$ID_unit),]

######验证集###############

spambase.knn<-knn(train=spambase.training,test=spambase.validation,

cl=spambase.training$is_spam)

##########cl:训练数据的响应变量(因子类型)######################

summary(spambase.knn)

table(predicted=spambase.knn,actual=spambase.validation$is_spam)

####################matlab代码:包含分类与回归#######################

functionrelustLabel=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)作为返回结果

%%%%%%%%%%%%%%%%%对于回归而言: relustLabel = avg(trainlabels(IX(1:len)))

end

%主程序:

loaddata;

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(label3,1),data(label3,2),data(label3,3),'bo');

grid on  %归一化处理

maxV = max(dataMat);

minV = min(dataMat);

range = maxV-minV;

newdataMat =  (dataMat-repmat(minV,[len,1]))./(repmat(range,[len,1]));

%测试数据比例

Ratio = 0.1;

numTest = Ratio * len; % 100条测试, 900条训练

%训练数据和测试数据

TrainData=newdataMat(numTest+1:end,:);

TrainLabels=labels(numTest+1:end,:);

TestData=newdataMat(1:numTest,:);

TestLabels=labels(1:numTest,:); %测试,欧氏距离type=1, 夹角余弦type=2

type=1;

for i = 1:numTest

classifyresult =  KNN(TestData(i,:),TrainData,TrainLabels,k,type);

% fprintf('第 %d 条记录,测试结果为:%d  真实结果为:%d\n',[iclassifyresult(i) labels(i)])

[classifyresult labels(i)])

if(classifyresult~=labels(i))

error = error+1;

end

end

classifyresult=classifyresult';

fprintf('分类错误的记录标签为:')

Index=find(classifyresult~=TestLabels)

fprintf('准确率为:%f\n',1-error/(numTest))

knn原理与实践的更多相关文章

  1. Atitit 管理原理与实践attilax总结

    Atitit 管理原理与实践attilax总结 1. 管理学分类1 2. 我要学的管理学科2 3. 管理学原理2 4. 管理心理学2 5. 现代管理理论与方法2 6. <领导科学与艺术4 7. ...

  2. Atitit.ide技术原理与实践attilax总结

    Atitit.ide技术原理与实践attilax总结 1.1. 语法着色1 1.2. 智能提示1 1.3. 类成员outline..func list1 1.4. 类型推导(type inferenc ...

  3. Atitit.异步编程技术原理与实践attilax总结

    Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...

  4. Atitit.软件兼容性原理与实践 v5 qa2.docx

    Atitit.软件兼容性原理与实践   v5 qa2.docx 1. Keyword2 2. 提升兼容性的原则2 2.1. What 与how 分离2 2.2. 老人老办法,新人新办法,只新增,少修改 ...

  5. Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法

    Atitit 表达式原理 语法分析 原理与实践 解析java的dsl  递归下降是现阶段主流的语法分析方法 于是我们可以把上面的语法改写成如下形式:1 合并前缀1 语法分析有自上而下和自下而上两种分析 ...

  6. Atitit.gui api自动化调用技术原理与实践

    Atitit.gui api自动化调用技术原理与实践 gui接口实现分类(h5,win gui, paint opengl,,swing,,.net winform,)1 Solu cate1 Sol ...

  7. Atitit.提升语言可读性原理与实践

    Atitit.提升语言可读性原理与实践 表1-1  语言评价标准和影响它们的语言特性1 1.3.1.2  正交性2 1.3.2.2  对抽象的支持3 1.3.2.3  表达性3 .6  语言设计中的权 ...

  8. Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2

    Atitit 网络爬虫与数据采集器的原理与实践attilax著 v2 1. 数据采集1 1.1. http lib1 1.2. HTML Parsers,1 1.3. 第8章 web爬取199 1 2 ...

  9. Atitit.软件兼容性原理与实践 v3 q326.docx

    Atitit.软件兼容性原理与实践 v3 q326.docx 1. 架构兼容性1 2. Api兼容性1 2.1. 新api  vs  修改旧的api1 3. Web方面的兼容性(js,html)1 3 ...

随机推荐

  1. Web Project犯错误!

    创建一个Web Project关于数据库连接,输入doGet中调用req.setCharacterEncoding("utf-8)错误输成uft-8 经常忘记HttpServletReque ...

  2. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...

  3. OWASP WEB会话管理备忘单 阅读笔记

    https://www.owasp.org/index.php/Session_Management_Cheat_Sheet#Session_ID_Properties 会话简介 HTTP是一种无状态 ...

  4. Spring+Mybatis+Maven+MySql搭建实例

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何使用Maven来搭建Spring+Mybatis+MySql的的搭建实例 ...

  5. [原创]如何设计Lighthoused定位接收电路

    本文使用最新出来的专用芯片TS3633 1)电路设计说明 1.电源电路 利用LM317低线性稳压芯片将5V或者12V的电源电压稳压到3.3V为TS3633提供工作电压.其中,磁珠L1主要用于抑制电源线 ...

  6. [python]使用virtualenv处理python版本问题

    1. 更新virutalenv $ sudo easy_install --upgrade virtualenv   2. 新建virtualenv实例, 确保在your home directory ...

  7. 结合Apache和Tomcat实现集群和负载均衡 JK 方式

    本文基本参考自 轻松实现Apache,Tomcat集群和负载均衡,经由实操经历记录而成,碰到些出入,以及个别地方依据个人的习惯,所以在一定程度上未能保持原文的完整性,还望原著者海涵. 因原文中有较多的 ...

  8. java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: NO)

    在更新项目之后,做了一定的改动后发现竟然报错了,刚才还好好的. java.sql.SQLException: Access denied for user 'root'@'localhost' (us ...

  9. js广告弹窗

    生活中我们经常遇到一些烦人的广告页面,比方说弹窗,悬浮等等各种广告.有的同事甚至都下一个屏蔽广告插件到浏览器上.这样就防止了广告的干扰. 但是我们学前端的必须是要知道广告弹窗这个做的过程,甚至是它的原 ...

  10. 使用HttpClient发送数据 到WebApi

    发送和JSON数据 /=============================webAPI接受POST的JOSN数据=============================/ POST api/& ...