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为基准) ...
随机推荐
- JS中childNodes深入学习
原文:JS中childNodes深入学习 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <ti ...
- 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)
原文:基于Asterisk的VoIP开发指南--Asterisk 模块编写指南(1) 1 开源项目概述 Asterisk是一个开源的软件包,通常运行在Linux操作系统平台上.Asterisk可以用三 ...
- 在OpenWrt上编写自己的硬件操作程序
上一篇文章中有写到如何使用OPENWRT的SDK,这里继续,写怎么在上面开发自己的应用程序. 我欲在OpenWrt上编写一个软件,它能够去读取某个AD芯片的多通道采样值. 在看这篇文章之前请看这官方的 ...
- HTTP 报文中的 Header 字段进行身份验证
[小技巧][ASP.Net MVC Hack] 使用 HTTP 报文中的 Header 字段进行身份验证 在一些 Web 系统中,身份验证是依靠硬件证书进行的:在电脑上插入 USB 证书,浏览器插件读 ...
- OWIN产生的背景以及简单介绍
OWIN产生的背景以及简单介绍 随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity, 使用Async来提高Web服务器的吞吐量和效率等.其中一个 ...
- Newtonsoft.Json 将C#对象转化为json格式
object To json public static string ObjectToJson(object obj) { JsonSerializerSettings jss = new Json ...
- zepto.js的基本介绍与使用
最近看到了一篇文章,是介绍一种新的js框架,名为zepto.js,他适用于移动设备已经桌面浏览器除了ie系列的.. 他兼容jquery的API,所以学起来或用起来并不吃力.他比jquery的优势在于1 ...
- sql内置函数pivot强大的行转列功能
原文:sql内置函数pivot强大的行转列功能 语法: PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...
- Centos中如何配置Texlive2013中文字体的问题
Centos中如何配置Texlive2013中文字体的问题: 第一步是下载你需要的字体,我从windows/fonts中拷贝的比较多,你只要复制你需要的字体即可. 注意只要文件扩展名为ttf的文件,t ...
- 查看mysql状态常用命令
最近服务器上mysql有些奇奇怪怪的问题,可惜我不是专业的dba,为了加深自己对mysql的了解,先从基础的查看mysql状态命令看起吧. 命令: show status; 命令: show stat ...