K临近(KNN)算法是一种原理比较简单的机器学习算法,其原理是将待分类数据与所有样本数据计算距离,根据距离由近到远选取K个临近点,根据临近点占比和距离权重对待分类点进行分类。

由于需要做距离计算,样本数据每个特征必须为数值型数据。加入我们需要对不同鸟进行分类,从翼展、身高、体重三个方面对老鹰、鸽子、麻雀三种鸟进行分类计算。下面给出一组假设的样本数据:

分类

翼展

体重

身高

老鹰

2米

5.0kg

1.0米

鸽子

0.5米

0.5kg

0.3米

麻雀

0.2米

0.05kg

0.1米

从数据中可以看出,由于不同特征的值具跨度范围不一致,如果直接进行计算,容易造成权重失衡,为了消除权重失衡需要对每个特征内部进行归一化,即特征内每个值除以其中的最大值。那么归一化后老鹰(1.0,1.0,1.0),鸽子(0.25,0.1,0.3),麻雀(0.1,0.01,0.1)。我们可以将这三个特征数据想象为一个个三维空间中的点,那么待分类对象就是计算一个三维坐标距离样本点的距离。假设一个待分类数据(x,y,z),采用KNN算法进行分类,通过欧式距离可以计算出它离某个样本点(x1,y1,z1)的距离。

计算公式:距离=sqrt((x - x1)^2 + (y - y1)^2 + (z - z1)^2)。

实际实现为了降低计算消耗可以忽略开方运算,只做平方计算,消除值为负数的差值即可。

实现代码:

distance = Math.pow(Double.parseDouble(testData[j]) - Double.parseDouble(sample[j + 1]), 2);

从原理和实现上不难看出,KNN算法没有训练过程,拿到样本数据后就可以直接使用,虽然计算简单,由于需要对每个样本进行距离计算,当样本数量过大后,将会消耗极大的计算时间和内存空间。针对这种问题,可以采用先取出距离较近的一些点,再进行距离计算。即根据待分类数据(x,y,z),我们增加一个参数,查找半径,当样本数据中超过K个数据处于半径范围内,则停止查找。

实现代码:

private List<String[]> findNearestNeibor(List<String[]> modelList, String[] testData, double radius, int k) {List<String[]> result = new ArrayList<String[]>();double step = radius;while(true) {for(int i = 0; i < modelList.size(); i++) {String[] modelSample = modelList.get(i);List<Boolean> tempResult = new ArrayList<Boolean>();for(int j = 0; j < testData.length; j++) {double sampleMin = Double.parseDouble(testData[j]) - step;double sampleMax = Double.parseDouble(testData[j]) + step;double modelSampleIndex = Double.parseDouble(modelSample[j + 1]);if (modelSampleIndex >= sampleMin && modelSampleIndex <= sampleMax) {tempResult.add(true);}else {tempResult.add(false);}}if (!tempResult.contains(false)) {result.add(modelSample);}}if (result.size() >= k) {return result;}else {step += radius;}}

当查找到大于K个值后,再进行距离计算,找出最近的K个值并给出结果。假设K=1时,即取离待分类点最近的样本点作为分类结果。

实现代码:

private String getResultTag(List<String[]> nearestList, String[] testData) {String result = new String();double min = testData.length;for(int i = 0; i < nearestList.size(); i++) {String[] nearSample = nearestList.get(i);double distance = 0.0;for(int j = 1; j < testData.length; j++) {distance += Math.pow(Double.parseDouble(testData[j]) - Double.parseDouble(nearSample[j]), 2);}if (distance < min) {result = nearSample[0];min = distance;}}return result;}

接下来,进行算法测试,随机生成一个包含10000个样本三种分类的文本文件,分类A的特征一在0.9左右,特征二0.5左右,特征三0.3左右;分类B的特征一在0.3左右,特征二0.6左右,特征三0.9左右;分类C的特征一在0.6左右,特征二0.9左右,特征三0.3左右;

如图:

同样,为了提高计算速度,默认K为1情况下,采用一边读取一边计算距离,当完成整个样本文件读取后,即完成计算。

实现代码:

public String predict(File model, String[] testData) {String result = new String();double min = testData.length;try {BufferedReader reader = new BufferedReader(new FileReader(model));String line;while ((line = reader.readLine()) != null) {String[] sample = line.split(",");double distance = 0.0;for(int j = 0; j < testData.length; j++) {distance += Math.pow(Double.parseDouble(testData[j]) - Double.parseDouble(sample[j + 1]), 2);}if (distance < min) {result = sample[0];min = distance;}}reader.close();}catch (Exception e) {e.printStackTrace();}return result;}

测试代码及测试结果:

public static void main(String[] args) throws Exception{KNN knn = new KNN();String[] testData = new String[] {"0.32","0.65","0.83"};long time1 = System.currentTimeMillis();String result = knn.predict(new File("C:/Users/admin/Desktop/test/sample.csv"), testData);long time2 = System.currentTimeMillis();System.out.println("计算用时:" + (time2 - time1) + "毫秒");System.out.println(result);}

机器学习入门01-K临近(KNN)的java实现相关推荐

  1. 机器学习入门 01 —— 机器学习概述

    文章目录 系列文章 机器学习概述 1.1.人工智能概述 1 人工智能应用场景 2 人工智能小案例 3 人工智能发展必备三要素 4 人工智能.机器学习和深度学习 5 小结 1.2.人工智能发展历程 1. ...

  2. 01. 机器学习笔记01——K近邻算法 , CV_example

    K近邻算法(K-nearest neighbor,KNN算法) 李航博士<统计学习方法> 最近邻(k-Nearest Neighbors,KNN)算法是一种分类算法 应用场景:字符识别.文 ...

  3. 机器学习入门 —— 超级详细的KNN算法学习笔记、KNN算法的三要素、KNN算法的优缺点

    文章目录 KNN(K nearest neighbors) K值的选择和影响 k取值偏小 k取值偏大 样本点距离的计算方式 闵可夫斯基距离 曼哈顿距离 欧几里得距离 切比雪夫距离 余弦距离 决策函数的 ...

  4. 机器学习入门04-线性回归原理与java实现多元线性回归

    线性回归原理: 线性回归公式:y = b + w*x,w表示权重b表示偏置. 在实际实现中可以将公式写作:y = w[0] * x[0] + w[1] * x[1],x[0]=1,这样就可以很方便的进 ...

  5. 机器学习入门(九):非监督学习:5种聚类算法+2种评估模型

    机器学习入门专栏其他章节: 机器学习入门(一)线性回归 机器学习入门(二)KNN 机器学习入门(三)朴素贝叶斯 机器学习入门(四)决策树 机器学习入门(五)集成学习 机器学习入门(六)支持向量机 机器 ...

  6. 机器学习入门(七):多项式回归, PolynomialFeatures详解

    机器学习入门专栏其他几个章节: 机器学习入门(一)线性回归 机器学习入门(二)KNN 机器学习入门(三)朴素贝叶斯 机器学习入门(四)决策树 机器学习入门(五)集成学习 机器学习入门(六)支持向量机 ...

  7. KNN算法(K临近算法)及使用KNN算法实现手写数字0-9识别

    首先感谢博主倔强的小彬雅,本文使用的素材及部分代码来源其博文机器学习入门-用KNN实现手写数字图片识别(包含自己图片转化),需要下载素材的可以到其博文最后进行下载. 关于KNN算法 knn算法也叫K临 ...

  8. 机器学习入门KNN近邻算法(一)

    1 机器学习处理流程: 2 机器学习分类: 有监督学习 主要用于决策支持,它利用有标识的历史数据进行训练,以实现对新数据的表示的预测 1 分类 分类计数预测的数据对象是离散的.如短信是否为垃圾短信,用 ...

  9. (视频+图文)机器学习入门系列-第7章 KNN算法

    机器学习入门系列,黄海广老师主讲.本站将持续更新,ppt.代码.课后习题见文末. 本系列的目录 01.引言 02.回归 03.逻辑回归 04.朴素贝叶斯 05.机器学习实践 06.机器学习库Sciki ...

最新文章

  1. QEMU+KVM学习笔记
  2. 解决导航守卫router.beforeResolve使用不了this.$store
  3. 互联网技术架构的启示
  4. manjaro kde 21.2.5使用x11桌面可以正常使用搜狗输入法
  5. android activity启动流程_Activity 启动流程(二)
  6. 【原理+实战+视频+源码】docker权限参数
  7. Entity Framework 4中的Code-First, Model-First和Database-First模式(转)
  8. php开发实例大全pdf百度云盘_互联网大厂 主要使用哪些开发语言
  9. 初识JS-基础中的基础
  10. 如何在单击按钮时启动新活动
  11. 宝塔linux跑tomcat,宝塔面板环境的安装(Linux、Tomcat、Node.js、Windows等环境)
  12. mysql5.095下载_战舰世界095版本
  13. Win10:文件夹取消隐藏选项为灰色,无法勾选
  14. 硬盘克隆 计算机更换硬盘,换硬盘数据怎么办 看一招本地磁盘对拷
  15. 【pytest】之parameterize()参数化,实现测试方法数据化
  16. 阿里云 mysql参数_阿里云MYSQL数据库怎么修改参数值?
  17. JAVA旅游信息管理平台SSM【数据库设计、毕业设计、源码、开题报告】
  18. Mysql的数据类型bit 导出数据展示为SOH
  19. Android跟我一起来开发--微影之开篇
  20. CSS中 定位position 和 transform 移动元素的比较

热门文章

  1. 06.node类型设置
  2. 万字图文 | 聊一聊 ReentrantLock 和 AQS 那点事(看完不会你找我)
  3. 如何使 子页面顶部栏 覆盖app.json中的顶部栏
  4. idea新建springboot后端到前端_码云开源项目:利用SpringBoot+Vue 实现留言版
  5. 家用电脑配置_家用电脑无需太高配置,不要听电脑店瞎忽悠,2500元机子够用了!...
  6. shell脚本编译规范(编写第一个脚本,脚本变量的作用,类型 ,了解read命令,let命令,环境变量和预定义变量)
  7. 深入理解linux文件系统( 理解inode与block,理解硬链接软链接,掌握恢复误删文件及其分析方法,掌握用户日志及其查询命令 )
  8. ERROR: No query specified
  9. 计算机应用基础在powerpoint中,计算机应用基础PowerPoint习题1
  10. Xcode搭建真机调试环境 图文实例