JS简单实现邻近算法(KNN)

KNN百度百科

1.实现KNN

简单理解下原理,我们将数据放入数据中进行比较排序截取最接近(也就是距离或差距最小)的N个进行"投票",然后得到投票数最多的。

废话不多说,先放代码(knn.js):

/*
* @desc Knn算法
* @param  {Object} current 
* @param  {Array} points 
* @param  {Number} k 
* @param  {Function} c        
* @return {Array}
*/
function getKnn(current, points, labelX, labelY, k, c) {
    var dists = [];//存放最接近的
    var classify = [];//分类标识
    points.map(function (item) {
        if (classify.indexOf(item[labelY]) < 0) classify.push(item[labelY]);
        var result = {};
        result.p = item; 
        result.d = c(current, item[labelX]) ;
        dists.push(result);
    });
    dists.sort(function (a, b) {//排序
        return a.d - b.d;
    });
    return { dists: dists.slice(0, k), classify: classify };
}

/*
* @desc 决策
* @param  {Object} current 输入值
* @param  {Object} points 训练样本集
* @param  {Object} labelX 用于分类的输入值
* @param  {Object} labelY 用于分类的输出值
* @param  {Number} k 用于选择最近邻的数目
* @param  {Function} c 自定义比较函数
* @return {Object} 
*/
function classify0(current, points, labelX, labelY, k, c) {
    var result = [];
    var knn = getKnn(current, points, labelX, labelY, k, c);
    var dists = knn.dists;
    for (var i of knn.classify) {
        result.push({
            label: i,
            value: 0
        });
    }
    dists.map(function (item) {
        for (var i of result) {
            if (i.label === item.p[labelY]) {
                i.value++;
                break;
            }
        }
    });
    result.sort(function (a, b) {
        return b.value - a.value;
    });
    return { result: result[0].label, dists: dists };
}

2.编写可视化效果

这里我们用Canvas实现简单的可视化效果
在Canvas中点击时,记录下鼠标的相对坐标与设置的颜色信息并在Canvas上显示小点,鼠标位置的小点会根据临近小点进行变色

[点击查看效果]





    
    
    
    



    
    
    
    
    
    



3.实现数字手写识别

手写识别学习数据与测试数据源自:https://github.com/apachecn/MachineLearning/tree/master/input/2.KNN
下面的代码引用的dataSet.js在: https://pan.baidu.com/s/1Ro31hT2Dut7KKEyZxxgBjA 密码: 77nj





    
    
    
    Document
    



    

最后是Canvas手写数字效果

5
2
9

你可能感兴趣的:(JS简单实现邻近算法(KNN))