package com.pku.yangliu;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
/**KNN算法的实现类,本程序用向量夹角余弦计算相似度
*
*/
public class KNNClassifier {
/**用KNN算法对测试文档集分类,读取测试样例和训练样例集
* @param trainFiles 训练样例的所有向量构成的文件
* @param testFiles 测试样例的所有向量构成的文件
* @param kNNResultFile KNN分类结果文件路径
* @return double 分类准确率
* @throws IOException
*/
private double doProcess(String trainFiles, String testFiles,
String kNNResultFile) throws IOException {
// TODO Auto-generated method stub
//首先读取训练样本和测试样本,用map>保存测试集和训练集,注意训练样本的类目信息也得保存,
//然后遍历测试样本,对于每一个测试样本去计算它与所有训练样本的相似度,相似度保存入map有
//序map中去,然后取前K个样本,针对这k个样本来给它们所属的类目计算权重得分,对属于同一个类目的权重求和进而得到
//最大得分的类目,就可以判断测试样例属于该类目下,K值可以反复测试,找到分类准确率最高的那个值
//!注意要以"类目_文件名"作为每个文件的key,才能避免同名不同内容的文件出现
//!注意设置JM参数,否则会出现JAVA heap溢出错误
//!本程序用向量夹角余弦计算相似度
File trainSamples = new File(trainFiles);
BufferedReader trainSamplesBR = new BufferedReader(new FileReader(trainSamples));
String line;
String [] lineSplitBlock;
Map> trainFileNameWordTFMap = new TreeMap> ();
TreeMap trainWordTFMap = new TreeMap();
while((line = trainSamplesBR.readLine()) != null){
lineSplitBlock = line.split(" ");
trainWordTFMap.clear();
for(int i = 2; i
trainWordTFMap.put(lineSplitBlock[i], Double.valueOf(lineSplitBlock[i+1]));
}
TreeMap tempMap = new TreeMap();
tempMap.putAll(trainWordTFMap);
trainFileNameWordTFMap.put(lineSplitBlock[0]+"_"+lineSplitBlock[1], tempMap);
}
trainSamplesBR.close();
File testSamples = new File(testFiles);
BufferedReader testSamplesBR = new BufferedReader(new FileReader(testSamples));
Map> tes