最近在看《机器学习实战》这本书,因为自己本身很想深入的了解机器学习算法,加之想学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. CMenu and Dialog-based applications

    [问] Is it possible to put a menu in a dialog based application? How? [答] Yes, it is possible to add ...

  2. Is there anyway to discover which ip addresses are connected to the db?

    From mongo shell run db.currentOp() to show all active connections or db.currentOp(true) to show all ...

  3. 基于redis分布式缓存实现(新浪微博案例)转

    第一:Redis 是什么? Redis是基于内存.可持久化的日志型.Key-Value数据库 高性能存储系统,并提供多种语言的API. 第二:出现背景 数据结构(Data Structure)需求越来 ...

  4. android中RecyclerView控件实现长按弹出PopupMenu菜单功能

    之前写过一篇文章:android中实现简单的聊天功能 现在是在之前功能的基础上,添加一个长按聊天记录,删除对应聊天记录的功能 RecyclerView控件,没有对应的长按事件,我们需要自己手工添加,修 ...

  5. iOS 根据圆心的坐标点、半径、当前手势所在的坐标点,计算出圆的运动轨迹坐标

    /** * 根据圆心的坐标点.半径.当前手势所在的坐标点,计算出圆的运动轨迹坐标 * @param radius 圆心半径 * @param centerCircle 圆心的坐标点 * @param ...

  6. dynamic(2) – ExpandoObject的使用

    一,ExpandoObject使用场合 在传递对象,但是又不想创建一个class或者struct的时候,ExpandoObject就是一个非常好的选择. 假如我们有一个SendMail的函数,功能是发 ...

  7. Android studio 将 Module 打包成 Jar 包

    整理记录 AndroidStudio 把一个 module 项目打包成 jar 包. 一.默认自动生成的 jar 包 众所周知 android studio 会在library所依赖的 app运行 或 ...

  8. Go语言中Socket通信之Tcp客户端

    1.用法: (1)定义远程IP地址.使用net.ResolveTCPAddr()方法,定义一个TCP地址,做为目标连接地址. (2)调用net.DialTCP("tcp",nil, ...

  9. Spring ActiveMQ Caused By: javax.jms.IllegalStateException: Connection closed

    根据 http://www.cnblogs.com/yshyee/p/7448808.html 进行JMS操作时,发送跟监听放到不同的项目中进行时,出现以下异常信息: org.springframew ...

  10. websocket与canvas[转]

    server端还是用tomcat7的方式客户端 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"  ...