/*先把標(biāo)題給寫了、這樣就能經(jīng)常提醒自己*/
題記:今天下午去上廁所的一會(huì)兒時(shí)間,就把第四章給掃完了,說(shuō)是掃完了主要是因?yàn)闆](méi)有深入去看,對(duì)于某些證明都直接跳過(guò)了,看了一下里面的例子,大概懂個(gè)意思就行了
1.? 樸素貝葉斯法
設(shè)輸入空間
為
維向量的集合,輸出空間為類標(biāo)記集合
,輸入特征向量
,輸出類標(biāo)記為
,
是
和
的聯(lián)合概率分布,數(shù)據(jù)集
由
獨(dú)立同分布產(chǎn)生。
樸素貝葉斯法就是通過(guò)訓(xùn)練集來(lái)學(xué)習(xí)聯(lián)合概率分布
.具體怎么學(xué)習(xí)呢? 主要就是從先驗(yàn)概率分布和條件概率分布入手,倆個(gè)概率相乘即可得聯(lián)合概率。
為什么稱之為樸素呢,主要是其將條件概率的估計(jì)簡(jiǎn)化了,對(duì)條件概率分布作了條件獨(dú)立性假設(shè),這也是樸素貝葉斯法的基石,具體的假設(shè)如下
? ? ? ? ? ? ? ? ?
此公式在假設(shè)條件之下可以等價(jià)于
現(xiàn)在, 對(duì)于給定的輸入向量
,通過(guò)學(xué)習(xí)到的模型計(jì)算后驗(yàn)概率分布P(Y=Ck|X=x),后驗(yàn)分布中最大的類作為的輸出結(jié)果,根據(jù)貝葉斯定理可知后驗(yàn)概率為
?
?
上面的公式可能有點(diǎn)歧義,分母的Ck應(yīng)該寫成Cj才對(duì),因?yàn)镻(X=x)=E P(Y=Cj)*P(X=x|Y=Cj)
而
對(duì)于所有
都是相同的,即此可以將輸出結(jié)果簡(jiǎn)化為
至此大概講解了樸素貝葉斯的基本方法步驟了,關(guān)于參數(shù)估計(jì)還有具體實(shí)例下次再寫了。夏天真熱啊!
2.? 參數(shù)估計(jì)
? 2.1 極大似然估計(jì)
上一小節(jié)講了對(duì)于給定的輸入向量
,其輸出結(jié)果可表示為
對(duì)此可應(yīng)用極大似然估計(jì)法來(lái)估計(jì)相應(yīng)的概率,如先驗(yàn)概率
的極大似然估計(jì)是
設(shè)第個(gè)
特征
可能取值的集合為
,條件概率
的極大似然估計(jì)是
公式看起來(lái)可能有點(diǎn)不實(shí)在,還是直接上例子來(lái)說(shuō)明吧!
?
例子:試由下表的訓(xùn)練數(shù)據(jù)學(xué)習(xí)一個(gè)樸素貝葉斯分類器并確定
的類標(biāo)記,表中
為特征,
為類標(biāo)記。
據(jù)此可算出
是
后驗(yàn)分布中值
最大的,也就是最終的類標(biāo)記為-1
? ? 2.2 貝葉斯 估計(jì)
極大似然估計(jì)的一個(gè)可能是會(huì)出現(xiàn)所要估計(jì)的概率值為 0的情況,這時(shí)會(huì)影響到后驗(yàn)概率的計(jì)算結(jié)果,解決這一問(wèn)題的方法是采用貝葉斯估計(jì),具體的只需要在極大似然估計(jì)的基礎(chǔ)上加多一個(gè)參數(shù)即可。懶得繼續(xù)寫公式了,不想寫了,剛剛碼完代碼!!
?
有興趣的可以看一下具體的代碼實(shí)現(xiàn)
package
org.juefan.bayes;
import
java.util.ArrayList;
import
java.util.HashMap;
import
java.util.Map;
import
org.juefan.basic.FileIO;
/**
* 這是一個(gè)簡(jiǎn)易的貝葉斯分類器
* 只適用于離散數(shù)據(jù),連續(xù)型數(shù)據(jù)的暫時(shí)請(qǐng)先繞道了^.^
*
@author
JueFan
*/
public
class
NaiveBayes{
//
平滑指數(shù), 默認(rèn)為拉普拉斯平滑,極大似然估計(jì)則為0
private
static
double
Lambda = 1
;
//
存儲(chǔ)先驗(yàn)概率數(shù)據(jù)
private
Map<Object, Double> PriorProbability =
new
HashMap<>
();
//
存儲(chǔ)條件概率數(shù)據(jù)
private
Map<Object, ArrayList<Map<Object, Double>>> ConditionProbability =
new
HashMap<>
();
/**
* 計(jì)算類別的先驗(yàn)概率
*
@param
datas
*/
public
void
setPriorPro(ArrayList<Data>
datas){
int
counts =
datas.size();
for
(Data data: datas){
if
(PriorProbability.containsKey(data.y)){
PriorProbability.put(data.y, PriorProbability.get(data.y)
+ 1
);
}
else
{
PriorProbability.put(data.y, (
double
) 1
);
}
}
for
(Object o: PriorProbability.keySet())
PriorProbability.put(o, (PriorProbability.get(o)
+ Lambda)/(counts + Lambda *
PriorProbability.size()));
}
/**
* 計(jì)算條件概率
*
@param
datas
*/
public
void
setCondiPro(ArrayList<Data>
datas){
Map
<Object, ArrayList<Data>> tmMap =
new
HashMap<>
();
//
按類別先將數(shù)據(jù)分類存放
for
(Data data: datas){
if
(tmMap.containsKey(data.y)){
tmMap.get(data.y).add(data);
}
else
{
ArrayList
<Data> tmDatas =
new
ArrayList<>
();
tmDatas.add(data);
tmMap.put(data.y, tmDatas);
}
}
//
條件概率主體
for
(Object o: tmMap.keySet()){
ArrayList
<Map<Object, Double>> tmCon =
new
ArrayList<>
();
int
LabelCount =
tmMap.get(o).size();
//
計(jì)算每個(gè)特征的相對(duì)頻數(shù)
for
(Data data: tmMap.get(o)){
for
(
int
i = 0; i < data.x.size(); i++
){
if
(tmCon.size() < i + 1
){
Map
<Object, Double> tmMap2 =
new
HashMap<>
();
tmMap2.put(data.x.get(i), (
double
) 1
);
tmCon.add(tmMap2);
}
else
{
if
(tmCon.get(i).containsKey(data.x.get(i))){
tmCon.get(i).put(data.x.get(i), tmCon.get(i).get(data.x.get(i))
+ 1
);
}
else
{
tmCon.get(i).put(data.x.get(i), (
double
) 1
);
}
}
}
}
//
計(jì)算條件概率
for
(
int
i = 0; i < tmCon.size(); i++
){
for
(Object o1: tmCon.get(i).keySet()){
tmCon.get(i).put(o1, (tmCon.get(i).get(o1)
+ Lambda)/(LabelCount + Lambda *
tmCon.get(i).size()));
}
}
ConditionProbability.put(o, tmCon);
}
}
/**
* 判斷實(shí)例的類別
*
@param
data
*
@return
判斷結(jié)果
*/
public
Object getLabel(Data data){
Object label
=
new
Object();
double
pro =
0D;
for
(Object o: PriorProbability.keySet()){
double
tmPro = 1
;
tmPro
*=
PriorProbability.get(o);
for
(
int
i = 0; i < data.x.size(); i++
){
tmPro
*=
ConditionProbability.get(o).get(i).get(data.x.get(i));
}
if
(tmPro >
pro){
pro
=
tmPro;
label
=
o;
}
System.out.println(o.toString()
+ " :的后驗(yàn)概率為: " +
tmPro);
}
return
label;
}
public
static
void
main(String[] args) {
ArrayList
<Data> datas =
new
ArrayList<>
();
FileIO fileIO
=
new
FileIO();
fileIO.setFileName(
".//file//bayes.txt"
);
fileIO.FileRead();
for
(String data: fileIO.fileList){
datas.add(
new
Data(data));
}
NaiveBayes bayes
=
new
NaiveBayes();
bayes.setPriorPro(datas);
bayes.setCondiPro(datas);
Data data
=
new
Data("1\t2\tS"
);
System.out.println(data.toString()
+ "\t的判斷類別為: " +
bayes.getLabel(data));
}
}
?
?對(duì)代碼有興趣的可以上本人的GitHub查看: https://github.com/JueFan/StatisticsLearningMethod/
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

