贝叶斯分类算法及其实现



《贝叶斯分类算法及其实现》由会员分享,可在线阅读,更多相关《贝叶斯分类算法及其实现(9页珍藏版)》请在装配图网上搜索。
1、贝叶斯算法描述及实现 根据朴素贝叶斯公式,每个测试样例属于某个类别的概率 =所有测试样例包含特征词 类条件概率P(tk|c)之积*先验概率P(c) 在具体计算类条件概率和先验概率时,朴素贝叶斯分类器有两种模型: (1) 多项式模型(multi no mial model) -以单词为粒度 类条件概率P(tk|c)=(类c下单词tk在各个文档中出现过的次数之和 +1)/ (类c下单词总数+ 训练样本中不重复特征词总数) 先验概率P(c)=类c下的单词总数/整个训练样本的单词总数 (2) 伯努利模型(Bernoulli model ) -以文件为粒度 类条件概率P(tk|c)=(
2、类c下包含单词tk的文件数+1) /(类c下文件总数+2)
先验概率P(c)=类c下文件总数/整个训练样本的文件总数
本分类器选用多项式模型计算,根据斯坦福的《 In troduction to In formation Retrieval 》课
件上所说,多项式模型计算准确率更高。
贝叶斯算法的实现有以下注意点:
1. 计算概率用到了 BigDecimal类实现任意精度计算;
2. 用交叉验证法做十次分类实验,对准确率取平均值;
3. 根据正确类目文件和分类结果文计算混淆矩阵并且输出;
4. Map
3、单词”,value为该类目下该单词 的出现次数,避免重复计算。 贝叶斯算法实现类如下 package Bayes; import import import import /** java.util.ArrayList; java.util.HashMap; java.util.Map; util.DecimalCalculate; *贝叶斯算法测试类 * @author chengpeng * @data 2014.11.6 */ public /** class Bayes { * 将原训练元组按类别划分 * @param datas 训练元组 *
4、
@return Map<类别,属于该类别的训练元组 >
*/
MapvString, ArrayList
5、= 0; i < datas.size(); i++) {
t = datas.get(i);
c = t.get(t.size() - 1);
if (map.containsKey(c)) {
map.get(c).add(t);
} else {
ArrayList
6、 testT 测试元组
*/
@retur n 测试元组的类别
public String predictClass(ArrayList
7、nt i = 0; i < doc.size(); i++) {
String c = classes[i].toString();
ArrayList
8、pv):
if (pOfC > maxP){maxP = pOfC;
maxP In dex = i;
}
}
return classes[maxPI ndex].toStri ng();
}
/**
* 计算指定属性列上指定值出现的概率
* @param d属于某一类的训练元组
* @param value 列值
* @param in dex 属性列索引
* @return 概率
d, String value, int index)
*/
private double pOfV(ArrayList
9、le p = 0.00; int cou nt = 0; int total = d.size(); ArrayListvStri ng> t = n ull ; for (int i = 0; i < total; i++) { if (d.get(i).get(index).equals(value)){ cou nt++; } } p = DecimalCalculate.div(count, total, 3); return p; } } package Bayes; import java.io.BufferedReader; import java.
10、io .I OExceptio n; import java.i o.ln putStreamReader; import java.util.ArrayList; import java.util.Stri ngToke ni zer; *贝叶斯算法测试类 * @author chengpeng * @data 2014.11.6 */ public /** class TestBayes { * 读取测试元组 * @return 一条测试元组 @throws lOException */ public ArrayListvStr ing> readT
11、estData() throws lOExceptio n{
ArrayListvStri ng> can dAttr = new ArrayList
12、r);
while (toke nizer.hasMoreToke ns()) {
can dAttr.add(toke nizer. nextToke n());
return can dAttr;
/**
读取训练元组
@return 训练元组集合
*/
@throws lOException
public ArrayList 13、ng>>();
BufferedReader reader = new BufferedReader( new
InputStreamReader(System. in ));
String str = "";
while (!(str = reader.readLine()).equals( "" )) {
Strin gToke ni zer toke ni zer = new Strin gToke ni zer(str);
ArrayListvStri ng> s = new ArrayListvStr in g>();
while (toke nizer.hasMore 14、Toke ns()) {
s.add(toke ni zer. nextToke n());
}
datas.add(s);
}
return datas;
}
public static void main( Stri ng[] args) {
TestBayes tb = new TestBayes();
ArrayList 15、ln( ” 请输入训练数据");
datas = tb.readData();
while ( true ) {
System. out .println( "请输入测试元组");
testT = tb.readTestData();
String c = bayes.predictClass(datas, testT);
System. out .println( "The class is: " + c);
}
} catch (IOExcepti on e) {
e.pri ntStackTrace();
}
}
}
训练数据:
youth high no f 16、air no
youth high no excelle nt no
middle_aged high no fair yes
senior medium no fair yes
senior low yes fair yes
senior low yes excelle nt no
middle_aged low yes excelle nt yes
youth medium no fair no
youth low yes fair yes
senior medium yes fair yes
youth medium yes excelle nt yes
middl 17、e_aged medium no excelle nt yes
middle_aged high yes fair yes
senior medium no excelle nt no
对原训练数据进行测试,测试如果如下:
请输入测试元组
youth high no fair
The class is: no
请输入测试元组
youth high no excelle nt
The class is: no
请输入测试元组
middle_aged high no fair
The class is: yes
请输入测试元组
senior medium no fair 18、
The class is: yes
请输入测试元组
senior low yes fair
The class is: yes
请输入测试元组
senior low yes excelle nt
The class is: yes
请输入测试元组
middle_aged low yes excelle nt
The class is: yes
请输入测试元组
youth medium no fair
The class is: no
请输入测试元组
youth low yes fair
The class is: yes
请输入测试元组
senior me 19、dium yes fair
The class is: yes
请输入测试元组
youth medium yes excelle nt
The class is: yes
请输入测试元组
middle_aged medium no excelle nt
The class is: yes
请输入测试元组
middle_aged high yes fair
The class is: yes
请输入测试元组
senior medium no excelle nt
The class is: no
测试结果显示14个测试实例中有13个分类是正确的,正确率为 93%,说明算法能够给出
一个准确的预测与分类,但是算法还需改进以提高正确率。
改进的可选方法之一:
为避免单个属性值对分类结果的权重过大,例如当某属性值在某一类中出现 0次时,该属
性值就决定了测试实例已经不可能属于该类了, 这就可能会造成误差,因此在计算概率时可
能进行如下改进:
将原先的 P(Xk|Ci)=|Xk| / |Ci| 改为 P(Xk|Ci)=(|Xk|+mp) / (|Ci|+m),其中 m 可设定为训练元 组的个数,p为等可能假设的先验概率
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。