wknn java实现_【十大算法实现之KNN】KNN算法实例(含测试数据和源码)

packageXBWKNN;importjava.io.IOException;importjava.util.ArrayList;importjava.util.Collections;importjava.util.Comparator;importjava.util.List;/*** KNN算法

*@authorXBW

* @date 2014年8月16日*/

public classXBWKNN{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

*@paramdata

*@paramds

*@returnans*/

public static intknn(Data data,DataSet ds){int ans = 0;

List dis=calcDis(data,ds);

ans=calcKDis(data,dis);returnans;

}/*** 计算训练集中所有向量的距离,排序之后取前K个

*@paramdata

*@paramds

*@return

*/@SuppressWarnings("null")public static ListcalcDis(Data data,DataSet ds){

List anslist =new ArrayList();double dx1=data.x1;double dx2=data.x2;double dx3=data.x3;for(int i=0;i

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(){public intcompare(Data o1, Data o2) {

Double s=o1.costfun-o2.costfun;if(s<0)return -1;else

return 1;

}

});returnanslist;

}/*** 按一定的权重计算出前K个

*@paramdata

*@paramds

*@return

*/

public static int calcKDis(Data data,Listanslist){

Double[] anstype={0.0,0.0,0.0,0.0};for(int i=0;i

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

tag=i;

maxt=anstype[i];

}

}returntag;

}public static void main(String[] args) throwsIOException{

DataSet ds=newDataSet();

DataTest dt=newDataTest();int correct=0;for(int i=0;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());

}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值