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为基准) ...
 
随机推荐
- WebStorm荣获InfoWorld2014年度科技奖
			
InfoWorld年度科技奖是每年一月由InfoWorld评论家对过去一年的表现最好的信息产品的褒奖.产品包括硬件.软件.开发工具和云服务等. InfoWorld2014年度科技奖,包括35个获奖产品 ...
 - leetcode [64] merge tow sorted lists
			
之前忘记记录这题了,现在补上. 合并两个有序的list,要求是: Merge two sorted linked lists and return it as a new list. The new ...
 - hibernate在持久对象的生命周期(三州:自由状态,持久状态,自由状态 之间的转换)
			
三种状态的基本概念: 1. 临时身份(Transient):也被称为自由状态,它只存在于内存中,并且在数据库中没有相应的数据. 使用new创建的对象,久化,没有处于Session中,处于此状态的对象 ...
 - Oracle索引——位图索引
			
1.语法create bitmap index index_name on 表名(字段);2.举个例子你就能明白了:如有表 test(id,name,address)数据(1,张三,大连)(2,李四, ...
 - 应用CSS的page-break-after属性 实现WEB页面强制分页打印
			
虽然dedecms.com向大家介绍了很多CSS属性的相关知识,但有些非常冷门的属性还是有所欠缺.在B/S程序中,对打印页面的控制,CSS相对比较弱,例如: 自动分页, 就基本没啥实际用途.我们通常需 ...
 - Knockout 是什么?
			
翻译:Knockout 轻松上手 - 1 Knockout 是什么? 原文名称:KnockoutJS Starter Knockout 是一个非常棒的脚本库,可是我发现许多人并不了解它,所以,思胜翻译 ...
 - c#计算2个字符串的相似度
			
直接来代码 public static float levenshtein(string str1, string str2) { //计算两个字符串的长度. int len1 = str1.Leng ...
 - 自然语言处理(NLP)常用开源工具总结(转)
			
..................................内容纯转发+收藏................................... 学习自然语言这一段时间以来接触和听说了好多开 ...
 - Jquery EasyUI中treegrid
			
Jquery EasyUI中treegrid的中右键菜单和一般按钮同时绑定事件时的怪异事件 InChatter系统开源聊天模块前奏曲 最近在研究WCF,又因为工作中的项目需要,要为现有的系统增加一 ...
 - dyld binding test
			
========================================================================= a.c ---------------------- ...