从一个例子来直观感受KNN思想

如下图 , 绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

                    

从这个例子中,我们再来看KNN思想:

, 计算已知类别数据集合中的点与当前点之间的距离(使用欧式距离公司: d =sqrt(pow(x-x1),)+pow(y-y1),)

, 按照距离递增次序排序(由近到远)

, 选取与当前点距离最小的的K个点(如上题中的 k=,k=)

, 确定前K个点所在类别的出现频率

, 将频率最高的那组,作为该点的预测分类

实现代码:

 package com.data.knn;

 /**
* *********************************************************
* <p/>
* Author: XiJun.Gong
* Date: 2016-09-06 12:02
* Version: default 1.0.0
* Class description:
* <p/>
* *********************************************************
*/
public class Point { private double x; //x坐标
private double y; //y坐标
private double dist; //距离另一个点的距离 private String label; //所属类别 public Point() {
this(0d, 0d, "");
} public Point(double x, double y, String label) {
this.x = x;
this.y = y;
this.label = label;
} /*计算两点之间的距离*/
public double distance(final Point a) {
return Math.sqrt((a.x - x) * (a.x - x) + (a.y - y) * (a.y - y));
} public double getX() {
return x;
} public void setX(double x) {
this.x = x;
} public double getY() {
return y;
} public void setY(double y) {
this.y = y;
} public String getLabel() {
return label;
} public void setLabel(String label) {
this.label = label;
} public double getDist() {
return dist;
} public void setDist(double dist) {
this.dist = dist;
}
}

KNN实现

 package com.data.knn;

 import com.google.common.base.Preconditions;
import com.google.common.collect.Maps; import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map; /**
* *********************************************************
* <p/>
* Author: XiJun.Gong
* Date: 2016-09-06 11:59
* Version: default 1.0.0
* Class description:
* <p/>
* *********************************************************
*/
public class knn { private List<Point> dataSet; //统计频率
private Point newPoint; //当前点 //进行KNN分类
public String classify(List<Point> dataSet, final Point newPoint, Integer K) { Preconditions.checkArgument(K < dataSet.size(), "K的值超过了dataSet的元素");
//求解每一个点到新的点的距离
for (Point point : dataSet) {
point.setDist(newPoint.distance(point));
}
//进行排序
Collections.sort(dataSet, new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
//return o1.distance(newPoint) < o2.distance(newPoint) ? 1 : -1;
return o1.getDist() < o2.getDist() ? 1 : -1;
}
}); //统计前K个标签的频率
Map<String, Integer> map = Maps.newHashMap();
Integer maxCnt = -9999; //最高频率
String label = ""; //最高频率标签
Integer currentCnt = 0; //当前标签的频率
Integer times = 0;
for (Point point : dataSet) {
currentCnt = 1;
if (map.containsKey(point.getLabel())) {
currentCnt += map.get(point);
}
if (maxCnt < currentCnt) {
maxCnt = currentCnt;
label = point.getLabel();
}
map.put(point.getLabel(), currentCnt);
times++;
if (times > K) break;
}
return label;
} }
 package com.data.knn;

 import com.google.common.collect.Lists;

 import java.util.List;

 /**
* *********************************************************
* <p/>
* Author: XiJun.Gong
* Date: 2016-09-06 14:45
* Version: default 1.0.0
* Class description:
* <p/>
* *********************************************************
*/
public class Main { public static void main(String args[]) {
List<Point> list = Lists.newArrayList();
list.add(new Point(1., 1.1, "A"));
list.add(new Point(1., 1., "A"));
list.add(new Point(0., 0., "B"));
list.add(new Point(0., 0.1, "B"));
Point point = new Point(0.5, 0.5, null);
KNN knn = new KNN();
System.out.println(knn.classify(list, point, 3));
}
}

结果:

A

  

机器学习之KNN算法思想及其实现的更多相关文章

  1. 机器学习:k-NN算法(也叫k近邻算法)

    一.kNN算法基础 # kNN:k-Nearest Neighboors # 多用于解决分裂问题 1)特点: 是机器学习中唯一一个不需要训练过程的算法,可以别认为是没有模型的算法,也可以认为训练数据集 ...

  2. JavaScript机器学习之KNN算法

    译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : Part 2 译者: Fundebug 为了保证可读性,本文采用意译而非直 ...

  3. 机器学习之KNN算法

    1 KNN算法 1.1 KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属 ...

  4. 菜鸟之路——机器学习之KNN算法个人理解及Python实现

    KNN(K Nearest Neighbor) 还是先记几个关键公式 距离:一般用Euclidean distance   E(x,y)√∑(xi-yi)2 .名字这么高大上,就是初中学的两点间的距离 ...

  5. 机器学习笔记--KNN算法2-实战部分

    本文申明:本系列的所有实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. 一案例导入:玛利亚小姐最近寂寞了, ...

  6. 机器学习笔记--KNN算法1

    前言 Hello ,everyone. 我是小花.大四毕业,留在学校有点事情,就在这里和大家吹吹我们的狐朋狗友算法---KNN算法,为什么叫狐朋狗友算法呢,在这里我先卖个关子,且听我慢慢道来. 一 K ...

  7. KNN算法思想与实现

    第二章 k近邻 2.1 算法描述 (1)采用测量不同特征值之间的距离进行分类 优点:对异常点不敏感,精度高,无数据输入设定 缺点:空间,计算复杂度高 适合数据:标称与数值 (2)算法的工作原理: 基于 ...

  8. 机器学习入门-Knn算法

    knn算法不需要进行训练, 耗时,适用于多标签分类情况 1. 将输入的单个测试数据与每一个训练数据依据特征做一个欧式距离. 2. 将求得的欧式距离进行降序排序,取前n_个 3. 计算这前n_个的y值的 ...

  9. 初识机器学习之kNN算法

    k近邻(k-Nearest Neighbor,简称kNN)学习是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本.然后基于这k个“邻居”的 ...

随机推荐

  1. Oracle安装错误“程序异常终止

    Oracle安装错误"程序异常终止.发生内部错误.请将以下文件提供给oracle技术支持部   "程序异常终止.发生内部错误.请将以下文件提供给oracle技术支持部门:" ...

  2. 使用Astah制作UML时序图

    Astah制作UML图--详解 时序图的制作 开篇语: 本文为光荣之路原创文章,欢迎转载,但请注明出处. 做测试的难免看到开发画出各种设计图,都很羡慕,比如: 帅么,漂亮么,其实我们测试人员也可以轻松 ...

  3. Java的文件读写操作

    file(内存)----输入流---->[程序]----输出流---->file(内存) 当我们读写文本文件的时候,采用Reader是非常方便的,比如FileReader,InputStr ...

  4. STM32下FatFs的移植,实现了坏块管理,硬件ECC,ECC纠错,并进行擦写均衡分析

    最近因项目需要,做一个数据采集的单片机平台.需要移植 FatFs .现在把最后成果贴上来. 1.摘要 在 STM32 单片机上,成功移植 FatFs 0.12b,使用的 Nand Flash 芯片为 ...

  5. 在Linux上配置Zabbix的环境

    useradd -s /bin/false zabbix mkdir /usr/local/zabbix_agent mv /home/zihexin/zabbix_agents_3.2.0.linu ...

  6. python学习之网页数据获取

    由于需要学习机器学习的内容,了解到python在机器学习中使用很方便,开始学习之,机器学习目前主要在学<机器学习实战>这本书.python是在MOOC中学习<用python玩转数据& ...

  7. 基于Clang的Source to Source源代码转换(一)

    Clang中包含了非常多的关于抽象语法树(AST)的访问和操作的类和接口.我们程序开发人员可以直接通过继承其中的某些类,重写其中的关键成员方法,从而形成我们自己的对抽象语法树的操作. 那么,首先我们简 ...

  8. Oracle数据库的表结构 简单表的建立

  9. Centos7 关闭防火墙(Firewalld ),使用防火墙(iptables)

    1.直接关闭防火墙 systemctl stop firewalld.service: #停止firewall systemctl disable firewalld.service: #禁止fire ...

  10. [OC] 理解Bitcode:一种中间代码

    Tip:参考资料 理解Bitcode:一种中间代码 (内容从该博客摘录的.本随笔摘录些简要内容.) App Distribution Guide – App Thinning (iOS, watchO ...