KNN算法基本的思路是比较好理解的,今天根据它的特点写了一个实例,我会把所有的数据和代码都写在下面供大家参考,不足之处,请指正。谢谢!

update:工程代码全部在本页面中,测试数据已丢失,建议去UCI Dataset中找一个自行测试一下。

几点说明:

1.KNN中的K=5;

2.在计算权重时,采用的是减去函数{1,0.8,0.6,0.4,0.2},当然你也可以采用反函数或高斯函数;

3.5%作为测试集(decision.txt),95%作为训练集(training.txt);

4.在计算costfun之前,对所有的属性进行了归一化,由于这里不知道数据集每个属性代表的含义,所以就一视同仁,实际情况下,应该具体问题具体分析;

XBWKNN.java

package XBWKNN;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List; /**
* KNN算法
* @author XBW
* @date 2014年8月16日
*/ public class XBWKNN{
public final static int KofKNN=5;
public final static double weight[]={1,0.9,0.7,0.4,0.1}; //减法函数y=1-0.2*x /**
* knn
* @param data
* @param ds
* @return ans
*/
public static int knn(Data data,DataSet ds){
int ans = 0;
List<Data> dis=calcDis(data,ds);
ans=calcKDis(data,dis);
return ans;
} /**
* 计算训练集中所有向量的距离,排序之后取前K个
* @param data
* @param ds
* @return
*/
@SuppressWarnings("null")
public static List<Data>calcDis(Data data,DataSet ds){
List<Data> anslist =new ArrayList<Data>();
double dx1=data.x1;
double dx2=data.x2;
double dx3=data.x3;
for(int i=0;i<ds.ds.size();i++){
double x1=ds.ds.get(i).x1;
double x2=ds.ds.get(i).x2;
double x3=ds.ds.get(i).x3;
ds.ds.get(i).costfun=Math.sqrt((dx1-x1)*(dx1-x1)+(dx2-x2)*(dx2-x2)+(dx3-x3)*(dx3-x3));
anslist.add(ds.ds.get(i));
}
Collections.sort(anslist,new Comparator<Data>(){
public int compare(Data o1, Data o2) {
Double s=o1.costfun-o2.costfun;
if(s<0)
return -1;
else
return 1;
}
});
return anslist;
} /**
* 按一定的权重计算出前K个
* @param data
* @param ds
* @return
*/
public static int calcKDis(Data data,List<Data> anslist){
Double[] anstype={0.0,0.0,0.0,0.0};
for(int i=0;i<KofKNN;i++){
if(anslist.get(i).type==1){
anstype[1]+=weight[i];
}
else if(anslist.get(i).type==2){
anstype[2]+=weight[i];
}
if(anslist.get(i).type==3){
anstype[3]+=weight[i];
}
}
Double maxt=-1.0;
int tag=1;
for(int i=1;i<=3;i++){
if(maxt<anstype[i]){
tag=i;
maxt=anstype[i];
}
}
return tag;
} public static void main(String[] args) throws IOException{
DataSet ds=new DataSet();
DataTest dt=new DataTest(); int correct=0;
for(int i=0;i<dt.dt.size();i++){
Data data=dt.dt.get(i);
int result=knn(data,ds);
if(result==data.type){
correct++;
}
}
System.out.println("total test num :"+dt.dt.size());
System.out.println("correct test num :"+correct);
System.out.println("ratio :"+correct/(double)dt.dt.size());
}
}

Datatest.java

package XBWKNN;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
* 测试数据
* @author XBW
* @date 2014年8月16日
*/ public class DataTest{
String defaultpath="D:\\MachineLearning\\十大算法\\KNN\\knncode\\decision.txt";
List<Data> dt; @SuppressWarnings("null")
public DataTest() throws IOException{
List<Data> dset = new ArrayList<Data>();
File ds=new File(defaultpath);
@SuppressWarnings("resource")
BufferedReader br = new BufferedReader(new FileReader(ds));
String tsing;
double max1=-1;
double max2=-1;
double max3=-1;
while((tsing=br.readLine())!=null){
String[] dlist=tsing.split(" ");
Data data=new Data();
data.x1=Double.parseDouble(dlist[0]);
data.x2=Double.parseDouble(dlist[1]);
data.x3=Double.parseDouble(dlist[2]);
data.type=Integer.parseInt(dlist[3]);
dset.add(data); if(data.x1>max1){
max1=data.x1;
}
if(data.x2>max2){
max2=data.x2;
}
if(data.x3>max3){
max3=data.x3;
}
}
dset=normalization(dset,max1,max2,max3);
this.dt=dset;
} public List<Data> normalization(List<Data> dset,double m1,double m2,double m3){
for(int i=0;i<dset.size();i++){
dset.get(i).x1/=m1;
dset.get(i).x2/=m2;
dset.get(i).x3/=m3;
}
return dset;
}
}

DataSet.java

package XBWKNN;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List; /**
* 训练数据
* @author XBW
* @date 2014年8月16日
*/ public class DataSet{
String defaultpath="D:\\MachineLearning\\十大算法\\KNN\\knncode\\training.txt";
List<Data> ds; @SuppressWarnings("null")
public DataSet() throws IOException{
List<Data> dset =new ArrayList<Data>();
File ds=new File(defaultpath);
@SuppressWarnings("resource")
BufferedReader br = new BufferedReader(new FileReader(ds));
String tsing;
double max1=-1;
double max2=-1;
double max3=-1;
while((tsing=br.readLine())!=null){
String[] dlist=tsing.split(" ");
Data data=new Data();
data.x1=Double.parseDouble(dlist[0]);
data.x2=Double.parseDouble(dlist[1]);
data.x3=Double.parseDouble(dlist[2]);
data.type=Integer.parseInt(dlist[3]);
dset.add(data); if(data.x1>max1){
max1=data.x1;
}
if(data.x2>max2){
max2=data.x2;
}
if(data.x3>max3){
max3=data.x3;
}
}
dset=normalization(dset,max1,max2,max3);
this.ds=dset;
} public List<Data> normalization(List<Data> dset,double m1,double m2,double m3){
for(int i=0;i<dset.size();i++){
dset.get(i).x1/=m1;
dset.get(i).x2/=m2;
dset.get(i).x3/=m3;
}
return dset;
}
}

Data.java

package XBWKNN;

/**
* 一条数据
* @author XBW
* @date 2014年8月16日
*/ public class Data{
Double x1;
Double x2;
Double x3;
Double costfun;
int type;
}

output:

【十大算法实现之KNN】KNN算法实例(含测试数据和源码)的更多相关文章

  1. 机器学习——十大数据挖掘之一的决策树CART算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第23篇文章,我们今天分享的内容是十大数据挖掘算法之一的CART算法. CART算法全称是Classification ...

  2. 备战秋招之十大排序——O(nlogn)级排序算法

    时间复杂度O(nlogn)级排序算法 五.希尔排序 首批将时间复杂度降到 O(n^2) 以下的算法之一.虽然原始的希尔排序最坏时间复杂度仍然是O(n^2),但经过优化的希尔排序可以达到 O(n^{1. ...

  3. 备战秋招之十大排序——O(n)级排序算法

    时间复杂度O(n)级排序算法 九.计数排序 前文说到,19591959 年 77 月,希尔排序通过交换非相邻元素,打破了 O(n^2)的魔咒,使得排序算法的时间复杂度降到了 O(nlog n) 级,此 ...

  4. Redis系列(十二):数据结构SortedSet跳跃表中基本操作命令和源码解析

    1.SkipList Redis的sortedSet数据结构是有序不重复的(索引为唯一的,数据(score)却可以重复), 跳表是redis的一个核心组件,也同时被广泛地运用到了各种缓存地实现当中,它 ...

  5. 视觉SLAM十四讲:从理论到实践 两版 PDF和源码

    视觉SLAM十四讲:从理论到实践 第一版电子版PDF 链接:https://pan.baidu.com/s/1SuuSpavo_fj7xqTYtgHBfw提取码:lr4t 源码github链接:htt ...

  6. 十大经典排序算法(java实现、配图解,附源码)

    前言: 本文章主要是讲解我个人在学习Java开发环境的排序算法时做的一些准备,以及个人的心得体会,汇集成本篇文章,作为自己对排序算法理解的总结与笔记. 内容主要是关于十大经典排序算法的简介.原理.动静 ...

  7. 【十大经典数据挖掘算法】kNN

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 引言 顶级数据挖掘会议ICDM ...

  8. 机器学习十大算法之KNN(K最近邻,k-NearestNeighbor)算法

    机器学习十大算法之KNN算法 前段时间一直在搞tkinter,机器学习荒废了一阵子.如今想重新写一个,发现遇到不少问题,不过最终还是解决了.希望与大家共同进步. 闲话少说,进入正题. KNN算法也称最 ...

  9. 机器学习十大算法 之 kNN(一)

    机器学习十大算法 之 kNN(一) 最近在学习机器学习领域的十大经典算法,先从kNN开始吧. 简介 kNN是一种有监督学习方法,它的思想很简单,对于一个未分类的样本来说,通过距离它最近的k个" ...

随机推荐

  1. Android开源库项目集锦

    一.兼容类库 ActionBarSherlock : Action Bar是Android 3.0后才開始支持的,ActionBarSherlock是让Action Bar功能支持2.X后的全部平台. ...

  2. 某软件大赛C#版考题整理——【编程题】

    三.编程题(4小题共40.0分)程序及结果写入对应文框内 1. 孪生素数查找程序. 所谓孪生素数指的是间隔为2 的相邻素数,就像孪生兄弟.最小的孪生素数是(3, 5),在100 以内的孪生素数还有 ( ...

  3. Oracle触发器给表自身的字段重新赋值出现ORA-04091异常

    业务描述如下: 在插入一个表的时候,需要根据一个字段的值更新另一个字段的值.当然也可以通过程序就能很简单得实现,只是这个字段只是数据交换用,和系统主业务没关系,不想修改程序,所以才用触发器的方式实现. ...

  4. 配置Server.xml

    Service下面的Connector, Engine, Executor. 组件的目录结构,配置文件,配置节点.

  5. [AngularJS] tips技巧收集

     单个参数调用angular.module(),用来取得该模块而不是定义新的 这样就可以在不同的地方定义app的controller而不用通过全局变量 angular.module('myapp') ...

  6. Thinkphp5笔记六:公共模块common的使用

    common模块属于公共模块,Thinkphp框架,默认就能调用. 实际用处:任何模块都可能用到的模型.控制.事件提取出来放到公共模块下. 一.公共事件  apps\common\common.php ...

  7. maven添加本地jar到本地库中

    maven添加本地jar到本地库中(用于远端地址下载不了的情况) 在dos命令行执行以下命令将会吧ojdbc14-10.2.0.4.0.jar添加到本地库中(ps:必须已经安装了,maven,并配置了 ...

  8. VSCode升级后启动不了~

    之前安装了VSCode,一直用的好好的,每次启动后后下角总会提示自己有新版本可以更新,然后就手贱点击了更新,然后就出问题了,更新后VSCode无法启动,打不开了,哭死! 于是,我尝试了以下方法,均无济 ...

  9. A标签添加JS事件,不跳转不刷新办法

    <a href="javascript:;" id="submit-btn" class="submit-btn" title=&qu ...

  10. PHP框架 Yii framework 用yiic命令时提示“php.exe”不是内部或外部命令

    解决方案 yii/framework/yiic.bat,修改 if "%PHP_COMMAND%" == "" set PHP_COMMAND=php.exei ...