栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

日撸java 三百行 趁热打铁(01)KNN分类器

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

日撸java 三百行 趁热打铁(01)KNN分类器

前两天刚听完闵帆老师的讲座,赶紧趁着热乎开撸。

KNN是机器学习里面的入门基础算法之一,但是它的普适性很强,对于新的问题,把KNN拿出来缝缝补补改改它又能战斗了,所以可以把它当做算法检测标杆

KNN思想(人类的比较思维):要判断一个未知的事物,可以找一个我们知道并且与之最相似的事物,我们就认为它俩是同一种事物。那么具体落到计算机上要怎么实现呢?

其最主要的就是要模拟找相似的过程,对于输入的一个向量,可以考虑衡量它与已知数据的距离,如果距离值越小,就认为两组数组很接近。

距离的计算方式常用有两种,曼哈顿距离与欧几里得距离(这两名字听起来特别离谱,实际上就是初中学的),接着我们找到与之距离最近的K个邻居,K个邻居投票决定待测样本的类别。K的取值对结果的影响还是比较大的,取小了过拟合,取大了欠拟合(这个地方有点迷糊),K尽量取奇数可以避免投票出现平票的尴尬情况。

package com.trian;
import java.io.FileReader;
import java.util.Arrays;
import java.util.Random;

import myself.test;
import weka.core.*;


public class KnnClassification {
    
    public static final int  MANHATTAN = 0;

    
    public static final int EUCLIDEAN = 1;


    
    public int distanceMeasure = EUCLIDEAN;

    
    public static final Random random = new Random();

    
    int numNeighbors=7;

    
    Instances dataset;

    
    int []trainingSet;
    int []testingSet;
    int []predictions;

    
    public KnnClassification(String paraFilename){
        try{
            FileReader fileReader = new FileReader(paraFilename);
            dataset=new Instances(fileReader);
            dataset.setClassIndex(dataset.numAttributes()-1);
            fileReader.close();
        }catch(Exception ee){
            System.out.println("404 NOT Found");
            System.exit(0);
        }//of try
    }//of KnnClassification

    
    public static int[] getRandomIndices(int paraLength){
        int[] resultIndices = new int[paraLength];
        for(int i=0;i tempMaximalVoting) {
                tempMaximalVoting = tempVotes[i];
                tempMaximalVotingIndex = i;
            } // Of if
        } // Of for i

        return tempMaximalVotingIndex;
    }//of simpleVoting


    public  double getAccuracy() {
        double tempCorrect = 0;
        for(int i=0;i 

运行结果:

 代码分析:

dataset用于管理arff数据集,数据预处理首先随机打乱数据,然后根据自己的喜好分配训练集与测试集,computeNearests(paraIndex)方法会选出与当前参数最近的k个邻居

simpleVoting(tempNeighbors)方法会依次遍历K个邻居并记录他们的类别数量,最后返回数量最多的那个类别。

distance(int para1,int para2)计算两组数据间的距离。

总结:knn算法很容易理解,感觉也比较暴力。理清这个dataset助手后代码读写也会更容易,instance表示行,也就是一行数据,一个数据对象,Attributes表示列,也就是属性。虽然knn是入门的第一个算法,但是也不能小看它,由于它的思想过于简单没有那么多弯弯绕绕,刚接触的时候难免让人觉得离谱,但是仔细一想,我们人类认识新事物好像绝大部分时候也是这么简单。knn没有学习过程,直接在训练集里找“答案”。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850479.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号