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为基准) ...
随机推荐
- leetcode第五题--Longest Palindromic Substring
Problem:Given a string S, find the longest palindromic substring in S. You may assume that the maxim ...
- Python开发环境Wing IDE使用教程:部分调试功能介绍
下面是用户应该了解的Wing IDE的其它一些调试功能: Main Debug File—用户可以指定项目中的一个文件作为调试的主入口点.当完成这个设置之后,调试总是从这个文件开始,除非用户使用Deb ...
- javaproject积累——java 反射 invoke
铅: 在java工程,我们已经听到很多ORM的概念,我一直耿耿于怀,如何从上rs转换成了对象呢?难道要写非常多的推断吗?答案肯定是否定.我们就要探索怎么解决问题,刚好在研究我们系统底层架构的时候,挖掘 ...
- 前端JS开发框架
前端JS开发框架-DHTMLX 发框架-DHTMLX 一:介绍 dhtmlxSuite是一个JavaScript库,提供了一套完整的Ajax -驱动UI组件.我们能够使用dhtmlxSuite构建 ...
- WITH (NOLOCK)浅析
SQL Server 中WITH (NOLOCK)浅析 2014-08-30 11:58 by 潇湘隐者, 503 阅读, 2 评论, 收藏, 编辑 概念介绍 开发人员喜欢在SQL脚本中使用WITH( ...
- NServiceBus 概况
NServiceBus 概况 NServiceBus 概况 NServiceBus 被设计用来组合面向业务的服务,它并不是用来替代诸如 WCF 一类的RPC技术. NServiceBus 不只包含通信 ...
- WXPP QuickFramework V2.0
微信快速开发框架(WXPP QuickFramework)V2.0版本上线--源码已更新至github 用了一个多星期的时间,把微信快速开发框架进行了改进,之前1.0版本针对的是普通订阅号,V2. ...
- Jenkins中关于一些插件的使用方法
最近在为公司搭建CI平台过程中,以及在具体项目实施过程中使用过的一些插件的具体用法: 1. ant插件 这个插件可能是我们最为经常使用的,若构建脚本是使用build.xml的,那构建引擎肯定会选择an ...
- Sqoop自定义多字节列分隔符
Sqoop提供的--fields-terminated-by选项可以支持指定自定义的分隔符,但是它只支持单字节的分隔符,对于我们特殊的需求:希望使用双字节的“|!”,默认的是不支持的. Sqoop在进 ...
- C#方法同步 [MethodImpl(MethodImplOptions.Synchronized)]
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...