资源简介
这个是我实验课的作业,Java实现knn算法,对网上需手动输入数据的算法进行了一些改进,注释详细,数据是文件夹中的txt文件,读者可以自己更换成自己的数据。
代码片段和文件信息
package KNN;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
/**
*..........KNN算法类..........
*/
public class KNN {
/**
*..........计算测试元组与训练元组之前的距离..........
*/
public double distance(List d1 List d2) {//d1:测试元祖;d2:训练元祖
double distance = 0.00;
for (int i = 0; i < d1.size(); i++) {
distance += (d1.get(i) - d2.get(i)) * (d1.get(i) - d2.get(i));//欧几里得距离平方
}
return distance;//返回距离值
}
/**
* ..........设置优先级队列的比较函数..........
*/
private Comparator comparator = new Comparator() {
public int compare(KNNNode k1 KNNNode k2) {
if (k1.getDistance() >= k2.getDistance()) {
return 1;
} else {
return 0;
}
}
};//此处有逗号,没有会出错
/**
*..........获取K个不同的随机数..........
*/
public List getRandKNum(int k int max) {//k:随机数的个数;max:随机数最大的范围;
List randNum = new ArrayList(k);
for (int i = 0; i < k; i++) {
int temp = (int) (Math.random() * max);
if (!randNum.contains(temp)) {
randNum.add(temp);
} else {
i--;
}
}
return randNum;//返回生成的随机数数组
}
/**
*..........获取所得到的k个最近邻元组的多数类..........
*/
private String getMostClass( PriorityQueue pq) {//pq:存储k个最近近邻元组的优先级队列
Map classCount = new HashMap();
for (int i = 0; i < pq.size(); i++) {
KNNNode node = pq.remove();
String c = node.getC();//获取节点类型
if (classCount.containsKey(c)) {//节点类型已存在 ,在之前基础上计数加1
classCount.put(c classCount.get(c) + 1);
} else { //节点类型还未存在 ,计数为1
classCount.put(c 1);
}
}
int maxIndex = -1;//类别出现最多的
int maxCount = 0;
object[] classes = classCount.keySet().toArray();
for (int i = 0; i < classes.length; i++) {
if (classCount.get(classes[i]) > maxCount) {
maxIndex = i;
maxCount = classCount.get(classes[i]);
}
}
return classes[maxIndex].toString();//返回多数类的名称
}
/**
*..........执行KNN算法,获取测试元组的类别..........
*/
public String knn(List> datas List testData int k) {//datas:训练数据集;testData:测试元组;k:设定的K值
PriorityQueue pq = new PriorityQueue(k comparator);
List randNum = getRandKNum(k datas.size());//取k个不同随机数
for (int i = 0; i < k; i++) {
int index = randNum.get(i);//获取随机数组里的数
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2015-12-13 14:28 TestKNN\
文件 301 2015-11-19 17:01 TestKNN\.classpath
文件 383 2015-11-19 17:01 TestKNN\.project
目录 0 2015-12-13 14:28 TestKNN\.settings\
文件 598 2015-11-19 17:01 TestKNN\.settings\org.eclipse.jdt.core.prefs
文件 1388417 2015-11-24 18:48 TestKNN\AfterPreCorrected2.txt
文件 65652559 2015-11-24 15:39 TestKNN\AfterPreData.txt
目录 0 2015-12-13 14:28 TestKNN\bin\
目录 0 2015-12-13 14:28 TestKNN\bin\KNN\
文件 838 2015-11-24 23:50 TestKNN\bin\KNN\KNN$1.class
文件 4097 2015-11-24 23:50 TestKNN\bin\KNN\KNN.class
文件 996 2015-11-24 22:55 TestKNN\bin\KNN\KNNNode.class
文件 4395 2015-11-25 14:50 TestKNN\bin\KNN\TestKNN.class
目录 0 2015-12-13 14:28 TestKNN\bin\util\
文件 2658 2015-11-24 10:19 TestKNN\bin\util\DecimalCalculate.class
目录 0 2015-12-13 14:28 TestKNN\src\
目录 0 2015-12-13 14:28 TestKNN\src\KNN\
文件 4094 2015-11-24 23:50 TestKNN\src\KNN\KNN.java
文件 948 2015-11-24 22:55 TestKNN\src\KNN\KNNNode.java
文件 4870 2015-11-25 14:50 TestKNN\src\KNN\TestKNN.java
目录 0 2015-12-13 14:28 TestKNN\src\util\
文件 4653 2015-11-24 10:19 TestKNN\src\util\DecimalCalculate.java
评论
共有 条评论