您的位置:首页 > 其它

朴素贝叶斯分类: 使用案例

2018-10-24 17:07 162 查看

1, 全概率公式:


2, 贝叶斯公式:

3,朴素贝叶斯分类器:

定义:

  • 1,设 x= {a1, a2, a3…, am } 为一个待分类项,而每个a为x的一个特征属性。
  • 2,有类别集合:C ={ y1, y2, y3 …, yn }
  • 3,计算一个概率集合U : P(y1|x), P(y2|x), P(y3|x)…P(yn|x)
  • 4,x最可能的类别 <==> 集合U中,概率的取最大值时,是类别集合C中的哪个?

朴素贝叶斯分类器是一个概率分类器。假设现有的类别C={c1,c2,……cm}。给定一篇文档d,文档d最有可能属于哪个类呢?这个问题用数学公式表示如下:


由于每个概率值很小(比如0.0001)若干个很小的概率值直接相乘,
得到的结果会越来越小。为了避免计算过程出现下溢(underflower),
引入对数函数Log, 最终得到:

4,实现代码如下:

List<String> reallist=new ArrayList<String>();//真实分类:  体育,娱乐,财经....
List<String> pridlist=new ArrayList<String>();//预测的结果: 体育,财经,娱乐....

for (Entry<String, List<String>> entry : nativeBayes.getFiles_test().entrySet()) {//取出: 待测数据
String realclassname = entry.getKey();
List<String> files = entry.getValue();

for (String file : files) {//取出文件遍历: 一一计算它在各模型的分值(最大者最似然)
reallist.add(realclassname);
List<String> classnamelist=new ArrayList<String>();//实际的分类:体育,财经,娱乐....
List<Double> scorelist=new ArrayList<Double>();	   //测后的分值:-208, -691,-703

for (Entry<String, Double> entry_1 : nativeBayes.getClassProb().entrySet()) {
String classname = entry_1.getKey();
Double score = Math.log(entry_1.getValue());//先验概率:根据公式,计算分值权重
String[] words = file.split(" ");

for (String word : words) {
if(nativeBayes.getClassFeaProb().get(classname).containsKey(word)){
score += Math.log(nativeBayes.getClassFeaProb().get(classname).get(word));
}else{
score += Math.log(nativeBayes.getClassDefaultProb().get(classname));
}
}

classnamelist.add(classname);
scorelist.add(score);

}//分类模型: 遍历end
Double maxProb = Collections.max(scorelist);
int idx = scorelist.indexOf(maxProb);
pridlist.add(classnamelist.get(idx));
}
}

5,模型的测评

精确率,准确率,召回率

for (String classname : nativeBayes.getFiles_test().keySet()) {
double correctNum = 0.0;
double allNum = 0.0;//测试数据中,某个分类的文章总数
double preNum = 0.0;//测试数据中,预测为该分类的文章总数

for (int i = 0; i < reallist.size(); i++) {
if(reallist.get(i) == classname){
allNum += 1;
if(reallist.get(i) == pridlist.get(i)){
correctNum += 1;
}
}
if(pridlist.get(i) == classname){
preNum += 1;
}
}

System.out.println(classname + " 精确率(跟预测分类比较):" + correctNum / preNum + " 召回率(跟真实分类比较):" + correctNum / allNum);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: