資源簡介
knn(java實現)http://blog.csdn.net/u011067360/article/details/45937327

代碼片段和文件信息
package?Marchinglearning.knn2;
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?comparator?=?new?Comparator()?{
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?getRandKNum(int?k?int?max)?{
List?rand?=?new?ArrayList(k);
for?(int?i?=?0;?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?d1?List?d2)?{
double?distance?=?0.00;
for?(int?i?=?0;?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>?datas?List?testData?int?k)?{
PriorityQueue?pq?=?new?PriorityQueue(k?comparator);
List?randNum?=?getRandKNum(k?datas.size());
System.out.println(“randNum:“+randNum.toString());
for?(int?i?=?0;?i? int?index?=?randNum.get(i);
List?currData?=?datas.get(index);
String?c?=?currData.get(currData.size()?-?1).toString();
//System.out.println(“currData:“+currData+“c:“+c+“testData“+testData);
//計算測試元組與訓練元組之前的距離
KNNNode?node?=?new?KNNNode(index?calDistance(testData?currData)?c);
pq.add(node);
}
for?(int?i?=?0;?i? List?t?=?datas.get(i);
//System.out.println(“testData:“+testData);
//System.out.println(“t:“+t);
double?distance?=?calDistance(testData?t);
//System.out.println(“distance:“+distance);
KNNNode?top?=?pq.peek();
if?(top.getDistance()?>?distance)?{
pq.remove();
pq.add(new?KNNNode(i?distance?t.get(t.size()?-?1).toString()));
}
}
return?getMostClass(pq);
}
/**
?*?獲取所得到的k個最近鄰元組的多數類
?*?@param?pq?存儲k個最近近鄰元組的優先級隊列
?*?@return?多數類的名稱
?*/
private?String?getMostClass(PriorityQueue?pq)?{
Map?classCount?=?new?HashMap();
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;
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????3372??2015-05-23?21:39??knn2\KNN.java
?????文件?????????712??2015-05-23?21:30??knn2\KNNNode.java
?????文件????????1907??2015-05-23?21:31??knn2\TestKNN.java
?????文件?????????203??2015-05-23?20:24??knndata2\datafile.data
?????文件?????????191??2015-05-23?20:24??knndata2\testfile.data
- 上一篇:Android簡單鬧鐘程序
- 下一篇:簡易圖像相似度計算器 jdk1.5版
評論
共有 條評論