本篇文章是我在讀了李航的《統計學習方法》後手寫的演算法實現之一
原理請參考統計學習方法第四章樸素貝葉斯法-李航
**如下:
# - * - coding: utf - 8 -*-
## python版本:3.6.1
# csdn:
## 下一行為符號計算所匯入的包
# from fractions import fraction
class
*****bayesmethod:
''' *****bayesmethod 的內部計算方式現在為數值計算,
符號計算的**已經注釋,如果需要請手動修改
樸素貝葉斯法分類器 當lam=1 時,類分類方式為為貝葉斯估計
實現了拉普拉斯平滑,以此避免出現要計算的概率為0的情況,以免計算錯誤的累積
具體原理請參考李航的《統計學習方法》第四章
lam = 0 時 類分類方式為為極大似然值估計
'''def__init__
(self, inputarray, lam):
self.input = inputarray
self.lam = lam
self.__leninput = len(self.input)
self.__y = self.input[self.__leninput - 1]
self.__onlyy = self.__only(self.__y)
self.__county = self.__countlist(self.__onlyy)
# 計算列表總樣本數 return int
def__countlist
(self, list):
count = {}
for item in list:
count[item] = count.get(item, 0) + 1
return len(count)
# 檢查某列表中時候含有某個元素
def__findy
(self, list, y):
result = true
for i in range(0, len(list)):
if list[i] == y:
result = false
return result
# 返回列表種類
def__only
(self, list):
onlyy =
for i in range(0, len(list)):
if self.__findy(onlyy, list[i]):
return onlyy
# 統計列表中某元素的個數
def__countkind
(self, list, element):
return list.count(element)
# 通過元素值返回位置索引
def__findonlyelement
(self, list, x):
return self.__only(list).index(x)
# 先驗概率
def__py
(self, x):
# return fraction(self.__countkind(self.__y, x) + self.lam, len(self.__y) + self.__county * self.lam)
return (self.__countkind(self.__y, x) + self.lam) / (len(self.__y) + self.__county * self.lam)
# 返回p(x=?)
def__probabilityx
(self, list, x):
# return fraction(self.__countkind(list, x) + self.lam, len(list) + self.__countlist(list) * self.lam)
return (self.__countkind(list, x) + self.lam) / (len(list) + self.__countlist(list) * self.lam)
def__probabilityyx
(self, list, x, yy):
xx = self.__findonlyelement(list, x)
yindex = self.__findonlyelement(self.__y, yy)
fz = 0
onlyx = self.__only(list)
onlyy = self.__only(self.__y)
# 獲取 p(y=?|x1=?) 的分子
for i in range(0, len(list)):
if list[i] == onlyx[xx] and self.__y[i] == onlyy[yindex]:
fz += 1
# return fraction(fz + self.lam, self.__countkind(list, onlyx[xx]) + self.__countlist(list) * self.lam)
return (fz + self.lam) / (self.__countkind(list, onlyx[xx]) + self.__countlist(list) * self.lam)
deffl(self, x, y):
ps =
for i in range(0, len(self.__onlyy)):
p1 = self.__probabilityx(self.input[0], x) * self.__probabilityyx(self.input[0], x,
1) * self.__probabilityx(
self.input[1], y) * self.__probabilityyx(self.input[1], y, self.__onlyy[i]) / self.__py(1)
return self.__onlyy[ps.index(max(ps))]
# 測試*****bayesmethod
input = [[1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3],
[1, 2, 2, 1, 1, 1, 2, 2, 3, 3, 3, 2, 2, 3, 3],
[-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]]
test = *****bayesmethod(input, 1)
print(test.fl(2, 1))
test.lam = 0
print(test.fl(2, 1))
輸出結果如下:
-1-1
樸素貝葉斯分類
1 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。2 樸素貝葉斯的思想基礎是這樣的 對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。通俗來說,就好比這麼個道理,你在街上看到乙個黑人,我問你你猜這哥們 來的,...
樸素貝葉斯分類
摘自寫在公司內部的wiki 要解決的問題 表中增加欄位classification,有四個取值 0 初始值,未分類 1 positive 2 normal 99 negative review submit前,由樸素貝葉斯分類器決定該條review的flag屬於negative還是positive ...
分類 樸素貝葉斯
原始的貝葉斯公式為 p b a p a b p a p a b p b p a 1 在分類問題中,y為類別,x為樣本特徵,則已知待 的樣本特徵 x 它為類別yi 的概率為 p yi x p x yi p y i p x p yi jp xj y i p x 2 p yi 類別為y i的樣本 數總樣本...