package algrithm.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 {
/**
* 设置优先级队列的比较函数,距离越大,优先级越高
*/
private Comparator<KNNNode> comparator = new Comparator<KNNNode>() {
public int compare(KNNNode o1, KNNNode o2) {
if (o1.getDistance() >= o2.getDistance()) {
return 1;
} else {
return 0;
}
}
};
/**
* 获取K个不同的随机数
* @param k 随机数的个数
* @param max 随机数最大的范围
* @return 生成的随机数数组
*/
public List<Integer> getRandKNum(int k, int max) {
List<Integer> rand = new ArrayList<Integer>(k);
for (int i = 0; i < k; i++) {
int temp = (int) (Math.random() * max);
if (!rand.contains(temp)) {
rand.add(temp);
} else {
i--;
}
}
return rand;
}
/**
* 计算测试元组与训练元组之前的距离
* @param d1 测试元组
* @param d2 训练元组
* @return 距离值
*/
public double calDistance(List<Double> d1, List<Double> d2) {
double distance = 0.00;
for (int i = 1; i < d1.size(); i++) {
distance += (d1.get(i) - d2.get(i)) * (d1.get(i) - d2.get(i));
}
return distance;
}
/**
* 执行KNN算法,获取测试元组的类别
* @param datas 训练数据集
* @param testData 测试元组
* @param k 设定的K值
* @return 测试元组的类别
*/
public String knn(List<List<Double>> datas, List<Double> testData, int k) {
PriorityQueue<KNNNode> pq = new PriorityQueue<KNNNode>(k, comparator);
List<Integer> randNum = getRandKNum(k, datas.size());
for (int i = 0; i < k; i++) {
int index = randNum.get(i);
List<Double> currData = datas.get(index);
String c = currData.get(0).toString();
KNNNode node = new KNNNode(index, calDistance(testData, currData), c);
pq.add(node);
}
for (int i = 0; i < datas.size(); i++) {
List<Double> 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(0).toString()));
}
}
return getMostClass(pq);
}
/**
* 获取所得到的k个最近邻元组的多数类
* @param pq 存储k个最近近邻元组的优先级队列
* @return 多数类的名称
*/
private String getMostClass(PriorityQueue<KNNNode> pq) {
Map<String, Integer> classCount = new HashMap<String, Integer>();
for (int i = 0; i < pq.size(); 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; i < classes.length; i++) {
if (classCount.get(classes[i]) > maxCount) {
maxIndex = i;
maxCount = classCount.get(classes[i]);
}
}
return classes[maxIndex].toString();
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
DataStructTest.rar (62个子文件)
DataStructTest
bin
list
linkedlist
UnorderedLinkedList.class 2KB
OrderedLinkedList.class 2KB
LinkedListClass$LinkedListNode.class 586B
DataElement.class 503B
vedioshop
VedioList.class 2KB
CustomerList.class 2KB
test.class 5KB
Vedio.class 4KB
Customer.class 3KB
LinkedListClass.class 3KB
arraylist
polynomial
Polynomial.class 2KB
test.class 2KB
Calculate.class 3KB
ArrayTest.class 569B
DataElement.class 497B
UnorderedArrayList.class 2KB
ArrayListClass.class 4KB
search
Search.class 964B
test.class 2KB
moneyGame
test.class 1KB
Player.class 1023B
CoinStrip.class 1KB
test
testY.class 909B
testX.class 535B
test.class 524B
recursion
test.class 750B
Change.class 1KB
nQueenPuzzle
NQueensPuzzle.class 2KB
test.class 577B
algrithm
bayes
auxiliary
NaiveBayes$CountProbility.class 4KB
Evaluation.class 5KB
NaiveBayes.class 3KB
DataSet.class 3KB
Classifier.class 415B
dm13
TestAss3.class 1KB
knn
KNN$1.class 928B
KNNNode.class 1014B
TestKNN.class 3KB
KNN.class 4KB
stack
test.class 2KB
Student.class 2KB
calculation
Express.class 2KB
test.class 1KB
Calculator.class 2KB
sort
test.class 2KB
vote_system
People.class 1KB
CandidateList.class 3KB
test.class 809B
Candidate.class 2KB
Sort.class 4KB
file
ReadFile.class 2KB
train.data 8KB
.settings
org.eclipse.ltk.core.refactoring.prefs 106B
org.eclipse.core.resources.prefs 57B
org.eclipse.core.runtime.prefs 52B
org.eclipse.jdt.core.prefs 598B
src
algrithm
knn
KNN.java 4KB
TestKNN.java 2KB
KNNNode.java 920B
.project 390B
.classpath 994B
test.data 3KB
共 62 条
- 1
资源评论
- DFSBFSPPP2015-07-17这个和聚类分析有什么关系啊,曾经用matlab做过一次Emmitte2015-07-18这不是聚类是分类
Emmitte
- 粉丝: 122
- 资源: 70
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功