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为基准) ...
随机推荐
- Swift初探一
今天安装了一下Xcode6-Beta版,想来体验一下Swift的魅力:安装Swift系统最低版本号为:10.9.3 仅仅看看一点The Swift Programming Language,以下给大家 ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- JS判断鼠标向上滚动还是向下滚动
js如何判断滚轮的上下滚动,我们应该都见到过这种效果,用鼠标滚轮实现某个表单内的数字向上滚动就增加,向下滚动就减少的操作,这种效果是通过js对鼠标滚轮的事件监听来实现的.今天简单的研究了一下如何使用j ...
- QualityCenter的备份
1.停止QC Server:2.备份Domain repository,它囊括每个项目的大量数据(包括自动化测试数据.附件.设置和格式表单等).要想知道某个项目所使用的数据库的名字,可以在Site A ...
- 一般处理程序装配数据到html页的原理
相应html页面并保存状态输出原理:(有状态请求)请求页面提交给后台,获取值进行处理之后再根据name标记读取原html文件文字将值替换再一并返回给页面:(在response时替换)比如原模板< ...
- 大规模web服务开发技术
大规模web服务开发技术 总评 这本书是日本一个叫hatena的大型网站的CTO写的,通过hatena网站从小到大的演进来反应一个web系统从小到大过程中的各种系统和技术架构变迁,比较接 ...
- linux中的"32位"与"64位"
linux内核学习之三:linux中的"32位"与"64位" 在通用PC领域,不论是windows还是linux界,我们都会经常听到"32位" ...
- django下载文件
赶快记录一下写的一个django下载文件的例子,以便以后复习: 在views.py中设置 from django.core.servers.basehttp import FileWrapper im ...
- IceMx.Mvc 我的js MVC 框架 开篇
开篇 这篇文章是后补的,前端时间想写一些对于js开发的一些理解,就直接写了,后来发现很唐突,所以今天在这里补一个开篇. 我的js Mvc 框架 基于实用设计,过分设计等于没设计.本着简单的原则,它只实 ...
- java用正则表达式获取domain
在工作中经常用到获取url的来源和域名的黑白名单功能.前段时间写了一个获取url中域名的方法.但是在测试过程中发现有些小问题. /** * 根据URL获取domain * @param url * @ ...