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();
}
}