楼主: jxnu_xx
11402 37

[源码分享] [Matlab原创]数据挖掘KNN算法的MATLAB实现_[by jxnu_xx] [推广有奖]

  • 8关注
  • 3粉丝

副教授

1%

还不是VIP/贵宾

-

威望
1
论坛币
532 个
通用积分
0
学术水平
29 点
热心指数
29 点
信用等级
28 点
经验
27536 点
帖子
266
精华
1
在线时间
475 小时
注册时间
2014-11-1
最后登录
2022-1-30

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
        昨天写了一个MATLAB的KNN算法,正好也是昨天看到坛子了有关于KNN算法的Python实现,那篇帖子对算法的原理有非常详细的讲解,所以我这里就不讲那些原理了,就把MATLAB的代码写在这里吧,由于对MATLAB还不太熟,算法写的很粗糙,不管是运行效率还是代码可读性都比较差,所以希望可以得到各位大神们的指点,对算法提出更改意见,欢迎交流。

下面只对该算法做一个简单的介绍:


分类效果图


1、原理:待预测类别与训练集中距离最近的K个类别总数最多的那个类别被认为是预测元组的类别
下面的这个kNN1函数对一个待预测元组进行分类预测


本帖隐藏的内容

  1. function [ maxClass ] = kNN1( toPredictionVector,trainingSet,classVector,k )
  2. %% ******产品信息****************************
  3. %   ------DateTime:2015-3-7-----------------------
  4. %% ******函数说明***************************
  5. %   ------toPredictionVector是一个1×n的向量-------
  6. %   ------trainingSet是一个m×n的训练集-------
  7. %   ------classVector是一个n×1的类别向量----------
  8. %%
  9. % 归一化处理
  10. dataToOne=[toPredictionVector;trainingSet];
  11. newData=toOne(dataToOne);
  12. toPredicionVector_new=newData(1,:);
  13. trainingSet_new=newData(2:end,:);
  14. % 计算向量toPredicionVector_new与矩阵trainingSet_new中各行向量的欧式距离
  15. Distance=pdist2(trainingSet_new,toPredicionVector_new);
  16. % 对距离进行升序排序,并获取原索引值
  17. [~,index]=sort(Distance,'ascend');

  18. sortClass=cell(k,1);
  19. % 获取排序后的类别
  20. for i=1:k
  21.     sortClass(i)=classVector(index(i));
  22. end
  23. % 统计各个类别的数量
  24. stateClass=tabulate(sortClass);
  25. Value=stateClass(:,1);%类别名称
  26. Count=stateClass(:,2);%类别数量
  27. % 获取最大数量类别的名称
  28. [~,maxIndex]=max(cell2mat(Count));
  29. maxClass=Value(maxIndex);
  30. end
复制代码


2、其它函数:toOne()函数对数据归一化处理,kNN()函数对多个元组进行分类预测


  1. function [ newDataSet ] = toOne( dataSet )
  2. %% 对数据集归一化处理
  3. %   ------DateTime:2015-3-7-----------------------
  4. %   ------用于对数据集归一化处理,划为0-1之间的数----
  5. %%
  6. minVector=min(dataSet);
  7. maxVector=max(dataSet);
  8. min_max_D=maxVector-minVector;
  9. dataSetSize=size(dataSet,1);
  10. min_max_D_M=repmat(min_max_D,dataSetSize,1);
  11. minDataSet=repmat(minVector,dataSetSize,1);
  12. newDataSet=(dataSet-minDataSet)./min_max_D_M;
  13. end
复制代码
  1. function [ maxClass ] = kNN( toPredictionSet,trainingSet,classVector,k )
  2. %% ******产品信息****************************
  3. %   ------DateTime:2015-3-7-----------------------
  4. %% ******函数说明***************************
  5. %   ------toPredictionSet是一个m1×n的向量-------
  6. %   ------trainingSet是一个m2×n的训练集矩阵-------
  7. %   ------classVector是一个n×1的类别向量----------
  8. %%
  9. predicionSize=size(toPredictionSet,1);
  10. maxClass=cell(predicionSize,1);
  11. for i=1:predicionSize
  12.     maxClass(i)=kNN1(toPredictionSet(i,:),trainingSet,classVector,k);
  13. end
  14. end
复制代码

3、运行脚本:

  1. clc,clear
  2. [trainingData,trainingClass]=xlsread('trainingData.xlsx');
  3. [testData,testClass]=xlsread('toPredictionData.xlsx');
  4. toPredictionData=xlsread('toPredictionData.xlsx');
  5. % 归一化处理

  6. % 绘制分类图
  7. pSize=size(toPredictionData,1);
  8. dataToOne=[toPredictionData;trainingData];
  9. newData=toOne(dataToOne);
  10. toPredicionSet_new=newData(1:pSize,:);
  11. trainingSet_new=newData(pSize+1:end,:);
  12. H1=plot(trainingSet_new(:,2),trainingSet_new(:,1),'o');
  13. hold on
  14. H2=plot(toPredicionSet_new(:,2),toPredicionSet_new(:,1),'.');
  15. title('kNN算法实现偏好分类', 'FontWeight','Bold', 'FontSize', 15);
  16. M = {'训练集';'预测集'};
  17. legend([H1,H2],M);

  18. predictionClass_Test=kNN(testData,trainingData,trainingClass,20);
  19. tSize=size(testData,1);
  20. T_count=0;
  21. for i=1:tSize
  22.     A=predictionClass_Test{i};
  23.     B=testClass{i};
  24.     if size(A,2)==size(B,2)
  25.         C=A==B;
  26.         C=C+0;
  27.         if sum(C)==size(A,2)
  28.             T_count=T_count+1;
  29.         end
  30.     end
  31. end
  32. r=T_count/tSize;
  33. if r>=0.90
  34.     predictionClass=kNN(toPredictionData,trainingData,trainingClass,20);
  35. end
复制代码

写的不是很好,欢迎大家讨论,一起进步!



量化投资板块支持C/C++/C#/Java/Matlab/R/Splus/Python/VBA/Perl/PHP/JavaScript/.NET/MySQL/SqlServer/Oracle等各类编程原创,较大奖励加分,好贴直接精华!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:matlab实现 MATLAB matla atlab Knn算法

回帖推荐

Still.. 发表于14楼  查看完整内容

MATLAB精品课程:https://bbs.pinggu.org/thread-3237528-1-1.html
已有 3 人评分经验 威望 论坛币 学术水平 热心指数 信用等级 收起 理由
Nicolle + 20 + 1 + 1 精彩帖子
星野 + 1 感谢您长期以来对论坛的支持!
fantuanxiaot + 50 + 50 + 2 + 2 + 2 精彩帖子

总评分: 经验 + 70  威望 + 1  论坛币 + 50  学术水平 + 3  热心指数 + 3  信用等级 + 2   查看全部评分

本帖被以下文库推荐

关注。。。

使用道具

藤椅
fantuanxiaot 发表于 2015-3-7 20:37:47 |只看作者 |坛友微信交流群
加油加油

使用道具

板凳
Nicolle 学生认证  发表于 2015-3-7 21:48:26 |只看作者 |坛友微信交流群
提示: 作者被禁止或删除 内容自动屏蔽

使用道具

报纸
杰式悦敏 发表于 2015-3-7 21:50:51 |只看作者 |坛友微信交流群
好东西 好代码 看看,学习一下

使用道具

地板
zwzhai 发表于 2015-3-7 22:46:52 |只看作者 |坛友微信交流群
OK.............................................

使用道具

7
mike68097 发表于 2015-3-8 02:31:37 |只看作者 |坛友微信交流群

使用道具

8
shzhy1989 学生认证  发表于 2015-3-8 09:11:02 |只看作者 |坛友微信交流群
看看

使用道具

9
sunyiping 发表于 2015-3-9 08:16:19 |只看作者 |坛友微信交流群
学习学习。

使用道具

10
energy1985 学生认证  发表于 2015-3-9 13:59:37 |只看作者 |坛友微信交流群
感谢楼主分享

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 09:56