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. SQL练习题

    create table Student( Sno varchar(20) primary key, Sname varchar(20) not null, Ssex varchar(20) not ...

  2. Spring task executor同异步

    1. spring提供了哪些任务执行器,是否有同步的任务执行器 有ThreadPoolTaskExecutor等执行器 同步可以用SyncTaskExecutor,但这个可以说不算一个线程池,因为还在 ...

  3. 在RedHat/CentOS下安装Docker(不升级内核)

    由于内核版本问题,最初仅Ubuntu可以较好的支持Docker.不过,由于RedHat系列OS(REHL.CentOS)是目前主流的Linux服务器操作系统,所以令RedHat系列OS支持Docker ...

  4. 夺命雷公狗-----React---11--添加css样式的方法

    <!DOCTYPE> <html> <head> <meta charset="utf-8"> <title></ ...

  5. 关于IP地址的一个细节问题

    使用ip2long()和long2ip()函数把IP地址转成整型存放进数据库而非字符型.这几乎能降低1/4的存储空间.同时可以很容易对地址进行排序和快速查找;

  6. confluence重置admin密码

    复方法: 1. 运行此sql 找到你的管理员帐户: select u.id, u.user_name, u.active from cwd_user u join cwd_membership m o ...

  7. requirejs中 shim

    使用requireJS的shim参数,完成jquery插件的加载 时间 2014-10-31 13:59:10  CSDN博客 原文  http://blog.csdn.net/aitangyong/ ...

  8. PHP 匹配一个汉字

    使用preg_match 必须使用u flag 这个修饰符添加的额外的功能,与Perl的PCRE不兼容. Pattern和字符串均为UTF-8编码. 从PHP 4.1.0 or greater on ...

  9. Why does pthread_cond_signal not work?【转】

    转自:http://stackoverflow.com/questions/16819169/why-does-pthread-cond-signal-not-work# 0 down vote fa ...

  10. WPF:设置弹出子菜单的是否可用状态及效果

    需求: 设置弹出子菜单(二级)项仅首项可用,其他项均不可用:不可用是呈灰色效果. 注: 菜单项都是依据层级数据模板.具体格式如下: StackBlock{TextBlock{Image}.TextBl ...