樸素貝葉斯法分類器的Python3 實現

2021-07-31 06:02:34 字數 3422 閱讀 7596

本篇文章是我在讀了李航的《統計學習方法》後手寫的演算法實現之一

原理請參考統計學習方法第四章樸素貝葉斯法-李航

**如下:

# - * - 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的樣本 數總樣本...