KNN算法

左手的ㄟ右手 2023-01-19 10:57 86阅读 0赞

记得读研那会,接触过这个算法,算法原理还是比较容易理解,类似机器学习中的预测,在给定的一堆数据,预测当前节点的分类。计算距离,然后排序,计算最相似的分类。

  1. import java.util.Arrays;
  2. /** * KNN又名临近算法 * 实现步骤: * 1. 首先计算出所有的临近距离值 * 2. 对临近值进行排序 * 3. 选出临近值最小的K个数 * 4. 投票选出结果 */
  3. public class Knn {
  4. private static double[][] DATA={
  5. { 5.1, 3.5, 1.4, 0.2, 0 },
  6. { 4.9, 3.0, 1.4, 0.2, 0 }, { 4.7, 3.2, 1.3, 0.2, 0 },
  7. { 4.6, 3.1, 1.5, 0.2, 0 }, { 5.0, 3.6, 1.4, 0.2, 0 },
  8. { 7.0, 3.2, 4.7, 1.4, 1 }, { 6.4, 3.2, 4.5, 1.5, 1 },
  9. //{ 6.9, 3.1, 4.9, 1.5, 1 }, //测试数据
  10. { 5.5, 2.3, 4.0, 1.3, 1 },
  11. { 6.5, 2.8, 4.6, 1.5, 1 }, { 5.7, 2.8, 4.5, 1.3, 1 },
  12. { 6.5, 3.0, 5.8, 2.2, 2 }, { 7.6, 3.0, 6.6, 2.1, 2 },
  13. { 4.9, 2.5, 4.5, 1.7, 2 }, { 7.3, 2.9, 6.3, 1.8, 2 },
  14. { 6.7, 2.5, 5.8, 1.8, 2 }, { 6.9, 3.1, 5.1, 2.3, 2 }
  15. };
  16. private static int K = 6;
  17. private static int CLASSFIY=3;
  18. public static void main(String[] args) {
  19. // 待求解数组
  20. double distince[] = { 6.9, 3.1, 4.9, 1.5, 1};
  21. Knn knn = new Knn();
  22. //求出求解的分类与二维数组间元素的临近距离
  23. double[] questionDistinces = new double[DATA.length];
  24. for(int i=0;i<DATA.length;i++){
  25. double[] item = DATA[i];
  26. questionDistinces[i] = knn.distince(item, distince);
  27. }
  28. System.out.println("临近距离集合:"+Arrays.toString(questionDistinces));
  29. int nearest[] = knn.paraseKDistince(questionDistinces, K);
  30. System.out.println("K 个最临近距离下标集合:"+Arrays.toString(nearest));
  31. System.out.println("{ 6.9, 3.1, 4.9, 1.5, x }的 x 位置求解为:"+knn.vote(nearest));
  32. }
  33. //计算临近距离[除开求解分类]
  34. public double distince(double []paraFirstData,double []paraSecondData){
  35. double tempDistince = 0;
  36. if((paraFirstData!=null && paraSecondData!=null) && paraFirstData.length==paraSecondData.length){
  37. for(int i=0;i<paraFirstData.length-1;i++){
  38. tempDistince += Math.abs(paraFirstData[i] - paraSecondData[i]);
  39. }
  40. }else{
  41. System.out.println("firstData 与 secondData 数据结构不一致");
  42. }
  43. return tempDistince;
  44. }
  45. //对临近距离排序,从小到大[这里采用冒泡排序]
  46. public double[] sortDistinceArray(double []paraDistinceArray){
  47. if(paraDistinceArray!=null && paraDistinceArray.length>0){
  48. for(int i=0;i<paraDistinceArray.length;i++){
  49. for(int j=i+1;j<paraDistinceArray.length;j++){
  50. if(paraDistinceArray[i]>paraDistinceArray[j]){
  51. double temp = paraDistinceArray[i];
  52. paraDistinceArray[i] = paraDistinceArray[j];
  53. paraDistinceArray[j] = temp;
  54. }
  55. }
  56. }
  57. }
  58. return paraDistinceArray;
  59. }
  60. //获取临近值数组中,从近到远获取k个值为新数组
  61. public double[] paraseKDistince(double[] sortedDistinceArray,String sortTypeStr,int k){
  62. double[] kDistince = new double[k];
  63. if("ASC".equals(sortTypeStr)){
  64. for(int i=0;i<k;i++){
  65. kDistince[i] = sortedDistinceArray[i];
  66. }
  67. }
  68. if("DES".equals(sortTypeStr)){
  69. for(int i=0;i<k;i++){
  70. kDistince[i] = sortedDistinceArray[sortedDistinceArray.length-i-1];
  71. }
  72. }
  73. return kDistince;
  74. }
  75. //获取临近距离中的K的距离的下标数组
  76. public int[] paraseKDistince(double[] distinceArray,int k){
  77. double[] tempDistince = new double[k+2];
  78. int[] tempNearest = new int[k+2];
  79. //初始化两个数组
  80. tempDistince[0] = Double.MIN_VALUE;
  81. for(int i=1;i<k+2;i++){
  82. tempDistince[i] = Double.MAX_VALUE;
  83. tempNearest[i] = -1;
  84. }
  85. //准备筛选临近距离
  86. for(int i=0;i<distinceArray.length;i++){
  87. for(int j=k;j>=0;j--){
  88. if(distinceArray[i]<tempDistince[j]){
  89. tempDistince[j+1] = tempDistince[j];
  90. tempNearest[j+1] = tempNearest[j];
  91. }else{
  92. tempDistince[j+1] = distinceArray[i];
  93. tempNearest[j+1] = i;
  94. break;
  95. }
  96. }
  97. }
  98. int[] returnNearests = new int[k];
  99. for (int i = 0; i < k; i++) {
  100. returnNearests[i] = tempNearest[i + 1];
  101. }
  102. return returnNearests;
  103. }
  104. //得到角标对应的分类
  105. public int getClasssify(int index){
  106. return (int)DATA[index][4];
  107. }
  108. //对分类进行投票得到结果[得到分类票数最多的分类]
  109. public int vote(int[] nearestIndex){
  110. int[] votes = new int[CLASSFIY];
  111. for(int i=0;i<nearestIndex.length;i++){
  112. votes[getClasssify(nearestIndex[i])]++;
  113. }
  114. System.out.println("分类投票数集合:"+Arrays.toString(votes));
  115. int tempMajority = -1;
  116. int tempMaximalVotes = -1;
  117. for (int i = 0; i < votes.length; i++) {
  118. if (votes[i] > tempMaximalVotes) {
  119. tempMaximalVotes = votes[i];
  120. tempMajority = i;
  121. }
  122. }
  123. System.out.println("投票数最高:"+tempMaximalVotes+",分类是:"+tempMajority);
  124. return tempMajority;
  125. }
  126. }

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程
博客若对你有用,欢迎扫码打赏,你的打赏是我写作的动力。
在这里插入图片描述
欢迎加入康哥IT粉丝交流QQ群833249482
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,86人围观)

还没有评论,来说两句吧...

相关阅读

    相关 KNN算法

    记得读研那会,接触过这个算法,算法原理还是比较容易理解,类似机器学习中的预测,在给定的一堆数据,预测当前节点的分类。计算距离,然后排序,计算最相似的分类。 impor

    相关 knn算法概述

    数据挖掘算法原理与实践:k-近邻 knn算法概述 201228 > educoder 答案 任务描述 本关任务:使用python实现方法,找出目标样本最近的k个样

    相关 KNN分类算法

    KNN分类算法 最简单最初级的分类器,就是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类 K近邻(k-nea

    相关 kNN算法总结

    一直接触KNN近邻算法,但是一直没有机会系统的总结一下,现在做一下总结,希望加深一下自己对近邻算法的理解。 定义:K-近邻算法采用测量不同特征值之间的距离方法进行分类 优缺

    相关 KNN算法思考

    学习机器学习时,我们可能接触到KNN算法,这是一中间的算法,是利用距离来表征两者之间的相似度。这一算法最经典的应用就是给相似人群做推荐系统。这里对算法内容不做详细解释,只是引发

    相关 KNN算法

    KNN算法即K-近邻算法,KNN的核心思想是通过你的“邻居”来推断出你的类别。 1 K-近邻算法(KNN)原理     k 值取得过小,容易受到异常点的影响   

    相关 KNN算法

    1、kNN算法又称为k近邻分类(k-nearest neighbor classification)算法。 最简单平凡的分类器也许是那种死记硬背式的分类器,记住所有的训练数