統計學習方法——樸素貝葉斯法原理
1. 樸素貝葉斯法的極大似然估計
2. 樸素貝葉斯極大似然學習及分類算法
2. Python實現
def
priorProbability
(
labelList
)
:
# 計算先驗概率
labelSet
=
set
(
labelList
)
# 得到類別的值
labelCountDict
=
{
}
# 利用一個字典來存儲訓練集中各個類別的實例數
for
label
in
labelList
:
if
label
not
in
labelCountDict
:
labelCountDict
[
label
]
=
0
labelCountDict
[
label
]
+=
1
priorProbabilityDict
=
{
}
for
label
in
labelSet
:
# 計算不同的類別對應的先驗概率
priorProbabilityDict
[
label
]
=
labelCountDict
[
label
]
/
len
(
labelList
)
return
priorProbabilityDict
def
conditionProbability
(
dataSet
,
labelList
)
:
# 計算條件概率
dimNum
=
len
(
dataSet
[
0
]
)
# 得到特征數
characterVal
=
[
]
# 利用一個數組來存儲訓練數據集中不同特征的不同特征值。
# 每一個不同特征的特征值都要需要另一個數組來存儲,這樣 characterVal實際上是一個二維數組
for
i
in
range
(
dimNum
)
:
temp
=
[
]
for
j
in
range
(
len
(
dataSet
)
)
:
if
dataSet
[
j
]
[
i
]
not
in
temp
:
temp
.
append
(
dataSet
[
j
]
[
i
]
)
characterVal
.
append
(
temp
)
probability
=
[
]
# 數組來存儲最后的所有的條件概率
labelSet
=
list
(
set
(
labelList
)
)
for
dim
in
range
(
dimNum
)
:
# 學習條件概率,需要計算K*S1*...*Sj個概率
tempMemories
=
{
}
# 對于每一個特征,利用一個字點來存儲這個特征所有的取值對應的條件概率
for
val
in
characterVal
[
dim
]
:
for
label
in
labelSet
:
labelCount
=
0
# 記錄每一類的個數
mixCount
=
0
# 記錄當前特征值為這個數,且類別為這個類別的實例個數
for
i
in
range
(
len
(
labelList
)
)
:
if
labelList
[
i
]
==
label
:
labelCount
+=
1
if
dataSet
[
i
]
[
dim
]
==
val
:
mixCount
+=
1
tempMemories
[
str
(
val
)
+
"|"
+
str
(
label
)
]
=
mixCount
/
labelCount
# key表示哪一個特征值和類別,鍵表示對應的條件概率
probability
.
append
(
tempMemories
)
# 計算完一個特征,填充一個
return
probability
# 返回條件概率
def
naiveBayes
(
x
,
dataSet
,
labelList
)
:
# 貝葉斯分類
priorProbabilityDict
=
priorProbability
(
labelList
)
probability
=
conditionProbability
(
dataSet
,
labelList
)
bayesProbability
=
{
}
# 計算所有類所對應的后驗概率
labelSet
=
list
(
set
(
labelList
)
)
for
label
in
labelSet
:
tempProb
=
priorProbabilityDict
[
label
]
for
dim
in
range
(
len
(
x
)
)
:
tempProb
*=
probability
[
dim
]
[
str
(
x
[
dim
]
)
+
"|"
+
str
(
label
)
]
bayesProbability
[
label
]
=
tempProb
result
=
sorted
(
bayesProbability
.
items
(
)
,
key
=
lambda
x
:
x
[
1
]
,
reverse
=
True
)
# 排序
return
result
[
0
]
[
0
]
# 返回后驗概率最大的類
dataSet
=
(
[
[
1
,
"s"
]
,
[
1
,
"m"
]
,
[
1
,
"m"
]
,
[
1
,
"s"
]
,
[
1
,
"s"
]
,
[
2
,
"s"
]
,
[
2
,
"m"
]
,
[
2
,
"m"
]
,
[
2
,
"l"
]
,
[
2
,
"l"
]
,
[
3
,
"l"
]
,
[
3
,
"m"
]
,
[
3
,
"m"
]
,
[
3
,
"l"
]
,
[
3
,
"l"
]
]
)
labelList
=
[
-
1
,
-
1
,
1
,
1
,
-
1
,
-
1
,
-
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
-
1
]
print
(
naiveBayes
(
[
2
,
"s"
]
,
dataSet
,
labelList
)
)
## 返回結果為-1,即歸為-1類。
這個實現過程和書上的不太一樣,這里每一個特征的取值范圍和類的取值范圍是根據數據集中的數來進行確定,即每一個特征的取值范圍不考慮那些沒有出現在訓練數據集中的特征值。而書上的算法,每一個特征的取值范圍是事先給出的,在這個取值范圍中的特征值,可能會出現在訓練數據集中,可能不出現。但在估計先驗概率和條件概率的時候,過程是一樣的。這是這個實現過程的一個不足。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
