knn分类算法学习
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。
算法流程:
/**
* 小顶堆求topN
*/
public class MinHeapPriorityQueue<T extends Comparable<T>> {
private PriorityQueue<T> queue;
private int maxSize; /**
* @param maxSize
*/
public MinHeapPriorityQueue(int maxSize) {
this(maxSize, new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
return o1.compareTo(o2);
}
});
} public MinHeapPriorityQueue(int maxSize, Comparator<T> comparator) {
this.maxSize = maxSize;
this.queue = new PriorityQueue<>(maxSize, comparator);
} public synchronized void insert(T t) {
if (queue.size() < maxSize) {
queue.add(t);
} else {
T tmp = queue.peek();
if (t.compareTo(tmp) > 0) {
queue.poll();
queue.add(t);
}
}
} public synchronized List<T> sortList() {
List<T> list = new LinkedList<>(queue);
Collections.sort(list, new Comparator<T>() {
@Override
public int compare(T o1, T o2) {
return o2.compareTo(o1);
}
});
return list;
} public synchronized List<T> getList(){
List<T> list = new LinkedList<>(queue);
return list;
} public static double format(double d, int n) {
double p = Math.pow(10, n);
return Math.round(d * p) / p;
} public static void main(String[] args) {
MinHeapPriorityQueue<Double> queue = new MinHeapPriorityQueue<>(3);
Random r = new Random();
StringBuffer buf = new StringBuffer();
for (int i = 0; i < 20; i++) {
double rd = format(r.nextDouble(), 3);
queue.insert(rd);
buf.append(rd);
if (i != 19)
buf.append(", ");
}
System.out.println("buff: " + buf.toString());
System.out.println("list: " + queue.sortList());
}
}
knn算法实现:
public class KNN {
public String knn(List<List<Double>> datas, List<Double> testData, int k) {
MinHeapPriorityQueue queue = new MinHeapPriorityQueue(k);
for (int i = 0; i < datas.size(); i++) {
List<Double> t = datas.get(i);
double distance = calDistance(t, testData);
queue.insert(new TrainTuple(i, distance, t.get(t.size() - 1).toString()));
}
return getMostClass(queue);
}
/**
* 计算测试数据和训练数据元组的距离
*
* @param trainData
* @param testData
* @return
*/
private double calDistance(List<Double> trainData, List<Double> testData) {
double sum = 0d;
double distance = 0d;
for (int i = 0; i < trainData.size() - 1 ; i++) {
sum += (trainData.get(i) - testData.get(i)) * (trainData.get(i) - testData.get(i));
}
distance = Math.sqrt(sum);
return distance;
}
/**
* 获取所得到的k个最近邻元组的多数类别
*
* @param queue
* @return 多数类别名称
*/
private String getMostClass(MinHeapPriorityQueue queue) {
Map<String, Integer> classCountMap = new HashMap<>();
List<TrainTuple> arrayList = queue.getList();
for (int i = 0; i < arrayList.size(); i++) {
TrainTuple tuple = arrayList.get(i);
String classify = tuple.getClassify();
if(classCountMap.containsKey(classify)){
classCountMap.put(tuple.getClassify(),classCountMap.get(classify) + 1);
}else{
classCountMap.put(classify,1);
}
}
int maxIndex = -1;
int maxCount = 0;
Object[] classes = classCountMap.keySet().toArray();
for (int i = 0; i < classes.length; i++) {
if (classCountMap.get(classes[i]) > maxCount) {
maxIndex = i;
maxCount = classCountMap.get(classes[i]);
}
}
return classes[maxIndex].toString();
}
}
具体的代码实现可以参考:https://github.com/yl897958450/knn
转载请注明出处。
knn分类算法学习的更多相关文章
- 机器学习---K最近邻(k-Nearest Neighbour,KNN)分类算法
K最近邻(k-Nearest Neighbour,KNN)分类算法 1.K最近邻(k-Nearest Neighbour,KNN) K最近邻(k-Nearest Neighbour,KNN)分类算法, ...
- KNN分类算法实现手写数字识别
需求: 利用一个手写数字“先验数据”集,使用knn算法来实现对手写数字的自动识别: 先验数据(训练数据)集: ♦数据维度比较大,样本数比较多. ♦ 数据集包括数字0-9的手写体. ♦每个数字大约有20 ...
- KNN分类算法及python代码实现
KNN分类算法(先验数据中就有类别之分,未知的数据会被归类为之前类别中的某一类!) 1.KNN介绍 K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法. 机器学习, ...
- 后端程序员之路 12、K最近邻(k-Nearest Neighbour,KNN)分类算法
K最近邻(k-Nearest Neighbour,KNN)分类算法,是最简单的机器学习算法之一.由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重 ...
- KNN分类算法
K邻近算法.K最近邻算法.KNN算法(k-Nearest Neighbour algorithm):是数据挖掘分类技术中最简单的方法之一 KNN的工作原理 所谓K最近邻,就是k个最近的邻居的意思,说的 ...
- 在Ignite中使用k-最近邻(k-NN)分类算法
在本系列前面的文章中,简单介绍了一下Ignite的线性回归算法,下面会尝试另一个机器学习算法,即k-最近邻(k-NN)分类.该算法基于对象k个最近邻中最常见的类来对对象进行分类,可用于确定类成员的关系 ...
- KNN分类算法--python实现
一.kNN算法分析 K最近邻(k-Nearest Neighbor,KNN)分类算法可以说是最简单的机器学习算法了.它采用测量不同特征值之间的距离方法进行分类.它的思想很简单:如果一个样本在特征空间中 ...
- OpenCV——KNN分类算法 <摘>
KNN近邻分类法(k-Nearest Neighbor)是一个理论上比较成熟的方法,也是最简单的机器学习算法之一. 这个算法首先贮藏所有的训练样本,然后通过分析(包括选举,计算加权和等方式)一个新样本 ...
- KNN分类算法补充
KNN补充: 1.K值设定为多大? k太小,分类结果易受噪声点影响:k太大,近邻中又可能包含太多的其它类别的点. (对距离加权,可以降低k值设定的影响) k值通常是采用交叉检验来确定(以k=1为基准) ...
随机推荐
- CodeIgniter框架文件结构
转自网络:http://my.oschina.net/scholer/blog/99226 这个本来是很基础的东西,基本上用过CI的人都知道这些,原本是不消说的~但是因为毕业论文是关于CodeIgni ...
- Java Persistence with MyBatis 3(中国版)
译者的话 前段时间因为工作和学习的须要,我打算深入研究MyBatis框架.于是在网上查找关于MyBatis的教程,发现国内网上关于MyBatis的教程资料少得可怜:除了MyBatis官网上的用户使用手 ...
- Image 对象
<html> <body> <img id="compman" src="0387.jpg" alt="Computer ...
- SpringMVC全注解
SpringMVC全注解不是你们那么玩的 前言:忙了段时间,忙得要死要活,累了一段时间,累得死去活来. 偶尔看到很多零注解配置SpringMVC,其实没有根本的零注解. 1)工程图一张: web.xm ...
- Javascript多线程引擎(九)
Javascript多线程引擎(九)--垃圾回收 垃圾回收这个话题对Programer来说是非常老旧的话题, 从手动的malloc/free 到半自动的 引用计数 再到全自动的 mark-sweep ...
- linux $ 类型变量 及Makefile 中 $ 类型变量的含义
Shell 命令中: $$: shell pid $!: pid of the last process running in shell $?: shell command return code ...
- iOS基础 - CALayer
一.CALayer简介 Core Animation是跨平台的,支持iOS环境和Mac OS X环境 凡是支持跨平台的框架,都不能直接使用UIKit框架,因为UIKit框架只能应用在iOS而不能用于M ...
- Indenting source code
Artistic Style 1.15.3 A Free , Fast and Small Automatic Formatterfor C , C++ , C# , Java Source Code ...
- MVC与EasyUI结合增删改查
构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(9)-MVC与EasyUI结合增删改查 在第八讲中,我们已经做到了怎么样分页.这一讲主要讲增删改查.第六讲的 ...
- Effective C++ 读书总结
(中文第三版 侯捷 译) 这本书在C++领域也是大名鼎鼎,在微博看到有人说,如果以前学过C语言,那只需花一天时间把 Effective C++ 看一遍,然后再看 leveldb代码(http://t. ...