java knn储存模型_KNN算法及java实现

importjava.util.ArrayList;importjava.util.Comparator;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.PriorityQueue;//KNN算法主体

public classKNN {//设置优先级队列的函数,距离越大,优先级越高

private Comparator comparator =new Comparator(){public intcompare(KNNNode o1,KNNNode o2){if(o1.getDistance()>=o2.getDistance()){return -1;

}else{return 1;

}

}

};/*** 获取K个不同的随机数

*@paramk随机数的个数

*@parammax随机数最大的范围

*@return生成随机数数组*/

public List getRandKNum(int k,intmax){

List rand=new ArrayList(k);for(int i=0;i

rand.add(temp);

}else{

i--;

}

}returnrand;

}/*** 计算测试元祖和训练元组之间的距离

*@paramd1测试元祖

*@paramd2训练元祖

*@return距离值*/

public double calDistance(List d1,Listd2){double distance=0.0;for(int i=0;i

distance+=(d1.get(i)-d2.get(i))*(d1.get(i)-d2.get(i));

}returndistance;

}/*** 执行Knn算法,获取测试元组的类别

*@paramdatas 训练数据集

*@param测试元组

*@paramk 设定的k值

*@return测试元组的类别*/

public String knn(List> datas,List testData,intk){

PriorityQueue pq=new PriorityQueue(k,comparator);

List randNum=getRandKNum(k,datas.size());for(int i=0;i

List currData=datas.get(index);

String c=currData.get(currData.size()-1).toString();

KNNNode node=newKNNNode(index, calDistance(testData,currData),c);

pq.add(node);

}for (int i = 0; i < datas.size(); i++) {

List t=datas.get(i);double distance=calDistance(testData, t);

KNNNode top=pq.peek();if(top.getDistance()>distance){

pq.remove();

pq.add(new KNNNode(i, distance,t.get(t.size()-1).toString()));

}

}returngetMostClass(pq);

}/*** 获得所得到的k个最近邻元组的多数类

*@parampq存储k个最近邻元组的优先级队列

*@return多数类的名称*/

private String getMostClass(PriorityQueuepq){

Map classCount=new HashMap();int pqsize=pq.size();for(int i=0;i

KNNNode node=pq.remove();

String c=node.getC();if(classCount.containsKey(c)){

classCount.put(c,classCount.get(c)+1);

}else{

classCount.put(c,1);

}

}int maxIndex=-1;int maxCount=0;

Object[] classes=classCount.keySet().toArray();for(int i=0;imaxCount){

maxIndex=i;

maxCount=classCount.get(classes[i]);

}

}returnclasses[maxIndex].toString();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值