最近在看《机器学习实战》这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习。

一 . K-近邻算法(KNN)概述

最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多个训练对象匹配,导致一个训练对象被分到了多个类的问题,基于这些问题呢,就产生了KNN。

KNN是通过测量不同特征值之间的距离进行分类。它的的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

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

由此也说明了KNN算法的结果很大程度取决于K的选择。

在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:

同时,KNN通过依据k个对象中占优的类别进行决策,而不是单一的对象类别决策。这两点就是KNN算法的优势。

接下来对KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

代码实现:

import java.util.*;

/**
* code by me
* <p>
* Data:2017/8/17 Time:16:40
* User:lbh
*/
public class KNN { /**
* KNN数据模型
*/
public static class KNNModel implements Comparable<KNNModel> {
public double a;
public double b;
public double c;
public double distince;
String type; public KNNModel(double a, double b, double c, String type) {
this.a = a;
this.b = b;
this.c = c;
this.type = type;
}
/**
* 按距离排序
*
* @param arg
* @return
*/
@Override
public int compareTo(KNNModel arg) {
return Double.valueOf(this.distince).compareTo(Double.valueOf(arg.distince));
}
} /**
* 计算距离
*
* @param knnModelList
* @param i
*/
private static void calDistince(List<KNNModel> knnModelList, KNNModel i) {
double distince;
for (KNNModel m : knnModelList) {
distince = Math.sqrt((i.a - m.a) * (i.a - m.a) + (i.b - m.b) * (i.b - m.b) + (i.c - m.c) * (i.c - m.c));
m.distince = distince;
}
} /**
* 找出前k个数据中分类最多的数据
*
* @param knnModelList
* @return
*/
private static String findMostData(List<KNNModel> knnModelList) {
Map<String, Integer> typeCountMap = new HashMap<String, Integer>();
String type = "";
Integer tempVal = 0;
// 统计分类个数
for (KNNModel model : knnModelList) {
if (typeCountMap.containsKey(model.type)) {
typeCountMap.put(model.type, typeCountMap.get(model.type) + 1);
} else {
typeCountMap.put(model.type, 1);
}
}
// 找出最多分类
for (Map.Entry<String, Integer> entry : typeCountMap.entrySet()) {
if (entry.getValue() > tempVal) {
tempVal = entry.getValue();
type = entry.getKey();
}
}
return type;
} /**
* KNN 算法的实现
*
* @param k
* @param knnModelList
* @param inputModel
* @return
*/
public static String calKNN(int k, List<KNNModel> knnModelList, KNNModel inputModel) {
System.out.println("1.计算距离");
calDistince(knnModelList, inputModel);
System.out.println("2.按距离(近-->远)排序");
Collections.sort(knnModelList);
System.out.println("3.取前k个数据");
while (knnModelList.size() > k) {
knnModelList.remove(k);
}
System.out.println("4.找出前k个数据中分类出现频率最大的数据");
String type = findMostData(knnModelList);
return type;
} /**
* 测试KNN算法
*
* @param args
*/
public static void main(String[] args) {
// 准备数据
List<KNNModel> knnModelList = new ArrayList<KNNModel>();
knnModelList.add(new KNNModel(1.1, 1.1, 1.1, "A"));
knnModelList.add(new KNNModel(1.2, 1.1, 1.0, "A"));
knnModelList.add(new KNNModel(1.1, 1.0, 1.0, "A"));
knnModelList.add(new KNNModel(3.0, 3.1, 1.0, "B"));
knnModelList.add(new KNNModel(3.1, 3.0, 1.0, "B"));
knnModelList.add(new KNNModel(5.4, 6.0, 4.0, "C"));
knnModelList.add(new KNNModel(5.5, 6.3, 4.1, "C"));
knnModelList.add(new KNNModel(6.0, 6.0, 4.0, "C"));
knnModelList.add(new KNNModel(10.0, 12.0, 10.0, "M"));
// 预测数据
KNNModel predictionData = new KNNModel(5.1, 6.2, 2.0, "NB");
// 计算
String result = calKNN(3, knnModelList, predictionData);
System.out.println("预测结果:"+result);
}
}

结果:

k近邻算法-java实现的更多相关文章

  1. k近邻算法的Java实现

    k近邻算法是机器学习算法中最简单的算法之一,工作原理是:存在一个样本数据集合,即训练样本集,并且样本集中的每个数据都存在标签,即我们知道样本集中每一数据和所属分类的对应关系.输入没有标签的新数据之后, ...

  2. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  3. 基本分类方法——KNN(K近邻)算法

    在这篇文章 http://www.cnblogs.com/charlesblc/p/6193867.html 讲SVM的过程中,提到了KNN算法.有点熟悉,上网一查,居然就是K近邻算法,机器学习的入门 ...

  4. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

  5. 机器学习之K近邻算法(KNN)

    机器学习之K近邻算法(KNN) 标签: python 算法 KNN 机械学习 苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅 from numpy import * import ...

  6. k近邻算法

    k 近邻算法是一种基本分类与回归方法.我现在只是想讨论分类问题中的k近邻法.k近邻算法的输入为实例的特征向量,对应于特征空间的点,输出的为实例的类别.k邻近法假设给定一个训练数据集,其中实例类别已定. ...

  7. KNN K~近邻算法笔记

    K~近邻算法是最简单的机器学习算法.工作原理就是:将新数据的每一个特征与样本集中数据相应的特征进行比較.然后算法提取样本集中特征最相似的数据的分类标签.一般来说.仅仅提取样本数据集中前K个最相似的数据 ...

  8. 机器学习03:K近邻算法

    本文来自同步博客. P.S. 不知道怎么显示数学公式以及排版文章.所以如果觉得文章下面格式乱的话请自行跳转到上述链接.后续我将不再对数学公式进行截图,毕竟行内公式截图的话排版会很乱.看原博客地址会有更 ...

  9. 机器学习——KNN算法(k近邻算法)

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

随机推荐

  1. IDEA 禁止自动导入引用包 取消import包

    http://www.oschina.net/question/2010061_226765 我想拷贝一小段代码,或者我就是不想引入拷贝来的包,我该怎么取消掉idea的自动导入import包呢? 找到 ...

  2. oauth2-server-php-docs 食谱

    一步一步的演练 以下说明提供详细的演练,以帮助您启动并运行OAuth2服务器.要查看实现此库的现有OAuth2服务器的代码库,请查看OAuth2 Demo. 初始化您的项目 为您的项目创建一个目录,并 ...

  3. 论文阅读:Memory Networks

    一.论文所解决的问题 实现长期记忆(大量的记忆),而且实现怎样从长期记忆中读取和写入,此外还增加了推理功能 为什么长期记忆非常重要:由于传统的RNN连复制任务都不行,LSTM预计也够玄乎. 在QA问题 ...

  4. Log4j 2.0在开发中的高级使用具体解释—介绍篇(一)

    Log4j最终迎来了首个apache版本号.Log4j 2 是 Log4j 的升级版本号,该版本号比起其前任来说有着显著的改进,包括非常多在 Logback 中的改进以及Logback 架构中存在的问 ...

  5. Android Toast 使用总结

    本文内容 环境 演示 Toast 使用 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 三星 SM-G3508,Android OS ...

  6. DFS csu1719 Boggle

    传送门:id=1719">点击打开链接 题意:真正的题意是,告诉你一些字符串.然后告诉你非常多个字符格子,问这些字符串是否能在字符格子中连起来,在格子中对角线也觉得是连在一起的.假设格 ...

  7. Spring Boot中Starter是什么

    比如我们要在Spring Boot中引入Web MVC的支持时,我们通常会引入这个模块spring-boot-starter-web,而这个模块如果解压包出来会发现里面什么都没有,只定义了一些POM依 ...

  8. iOS编程(双语版) - 视图 - Transform(转换)

    视图有一个transform属性,它描述了应该如何绘制该视图. 该属性是CGAffineTransform结构体,它代表了3 x 3的变换矩阵(线性代数). 下面的代码让两个矩形视图旋转45度 (Ob ...

  9. jQuery 操作 radio、select、checkbox

    <script type="text/javascript"> $(function () { 一.radio 1.获取选中值,三种方法都可以: $('input:ra ...

  10. LintCode: Cosine Similarity

    C++ class Solution { public: /** * @param A: An integer array. * @param B: An integer array. * @retu ...