找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1405|回复: 0
打印 上一主题 下一主题
收起左侧

knn算法的MATLAB源码

[复制链接]
跳转到指定楼层
楼主
ID:348244 发表于 2018-6-9 15:57 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. %knn 归一化自写

  2. % 把数据分为测试集和训练集
  3. % train=[wine(1:30,:);wine(60:89,:);wine(131:160,:)];
  4. % test=[wine(31:59,:);wine(90:130,:);wine(161:178,:)];
  5. % train_labels=[wine_labels(1:30,:);wine_labels(60:89,:);wine_labels(131:160,:)];
  6. % test_labels=[wine_labels(31:59,:);wine_labels(90:130,:);wine_labels(161:178,:)];
  7. %把标签加到数据的最后一列
  8. wine(:,14)=wine_labels;
  9. %按行随机打乱数据
  10. wine_data =wine(randperm(size(wine,1)),:);
  11. %取前一百条数据给训练集
  12. train=wine_data(1:100,1:13);
  13. train_labels=wine_data(1:100,14);
  14. %剩下的78条给测试集
  15. test=wine_data(101:178,1:13);
  16. test_labels=wine_data(101:178,14);
  17. %数据归一化
  18. h=max(train,[],1);
  19. l=min(train,[],1);
  20. for i=1:13
  21.     train(:,i)=(train(:,i)-l(i))./(h(i)-l(i));
  22.     test(:,i)=(test(:,i)-l(i))./(h(i)-l(i));
  23. end
  24. %[train,strc]=mapminmax(train');  
  25. %strc归一化返回的参数 max min
  26. %test=mapminmax.apply(test',strc);
  27. %计算测试集与所有训练集间的距离
  28. all_distance=dist(test,train');
  29. %升序排序 B为返回的索引
  30. [A,B]=sort(all_distance,2);
  31. %Knn  K近邻
  32. K=3;
  33. all_labels=train_labels(B(:,1:K));
  34. %统计矩阵中出现的类别
  35. b=unique(all_labels);
  36. %统计各个类别出现的次数
  37. c=histc(all_labels',b);
  38. %新标签赋值
  39. [m,predict_labels]=max(c);
  40. %求准确率
  41. accuracy=1-(length(find((predict_labels-test_labels')~=0))/length(test_labels))
  42. %画图
  43. figure;
  44. hold on;
  45. plot(test_labels,'o');
  46. plot(predict_labels,'*');
  47. xlabel('测试集数据','FontSize',12);
  48. ylabel('类别标签','FontSize',12);
  49. legend('实际测试集分类','预测测试集分类');
  50. title('测试集的实际分类和预测分类图','FontSize',12);
  51. grid on;





  52. %knn 归一化使用mapminmax函数进行的
  53. %knn

  54. % 把数据分为测试集和训练集
  55. % train=[wine(1:30,:);wine(60:89,:);wine(131:160,:)];
  56. % test=[wine(31:59,:);wine(90:130,:);wine(161:178,:)];
  57. % train_labels=[wine_labels(1:30,:);wine_labels(60:89,:);wine_labels(131:160,:)];
  58. % test_labels=[wine_labels(31:59,:);wine_labels(90:130,:);wine_labels(161:178,:)];
  59. %把标签加到数据的最后一列
  60. wine(:,14)=wine_labels;
  61. %按行随机打乱数据
  62. wine_data =wine(randperm(size(wine,1)),:);
  63. %取前一百条数据给训练集
  64. train=wine_data(1:100,1:13);
  65. train_labels=wine_data(1:100,14);
  66. %剩下的78条给测试集
  67. test=wine_data(101:178,1:13);
  68. test_labels=wine_data(101:178,14);
  69. %数据归一化
  70. [train,strc]=mapminmax(train');  
  71. %strc归一化返回的参数 max min
  72. test=mapminmax.apply(test',strc);
  73. %计算测试集与所有训练集间的距离
  74. all_distance=dist(test',train);
  75. %升序排序 B为返回的索引
  76. [A,B]=sort(all_distance,2);
  77. %Knn  K近邻
  78. K=5;
  79. all_labels=train_labels(B(:,1:K));
  80. %统计矩阵中出现的类别
  81. b=unique(all_labels);
  82. %统计各个类别出现的次数
  83. c=histc(all_labels',b);
  84. %新标签赋值
  85. [~,predict_labels]=max(c);
  86. %求准确率
  87. accuracy=1-(length(find((predict_labels-test_labels')~=0))/length(test_labels))
  88. %画图
  89. figure;
  90. hold on;
  91. plot(test_labels,'o');
  92. plot(predict_labels,'*');
  93. xlabel('测试集数据','FontSize',12);
  94. ylabel('类别标签','FontSize',12);
  95. legend('实际测试集分类','预测测试集分类');
  96. title('测试集的实际分类和预测分类图','FontSize',12);
  97. grid on;
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表