手寫樸素貝葉斯演算法實現

2021-08-24 17:58:15 字數 1447 閱讀 7732

#根據給定的訓練資料x,y,**x所屬分類

def predict(x,y,x):    

#將陣列y的元素(類別值)嫁接到陣列x每行的末尾

newx=x

for i in range(0,len(x)):

#第一步:去重,提取y的類別值,組成集合purey

purey=list(set(y))

#第二步:計算所有類別結果值在y中的出現次數,放到集合t中。

t=[0]*len(purey)  

for j in range(0,len(purey)):

t[j]=y.count(purey[j])

#陣列x與陣列purey每條對映關係的概率,放到集合p中。 

p=[0]* len(purey)          

#定義乙個二維陣列d,統計每列不同的特徵值與該特徵值出現的的次數 ,以字典的形式作為元素儲存在d

#定義乙個陣列div,用來承裝每列不同的特徵值出現的次數與t[j]的比值,如果分子為0,則

#分子與分母同時加0 

d=[ for j in range(len(purey))]

div =[0]*len(x) 

for j in range(0,len(purey)):

#遍歷陣列purey的元素,在陣列x最後一列提取該元素所在的所有行,將這些行組成陣列a

a=[x for x in newx if x[len(newx[0])-1]== purey[j]]

for i in range(0,len(x)):

#取出陣列a中的第i列,放到陣列b中

b=[x[i] for x in a]

#遍歷陣列b,按照不同的元素和其對應的出現次數儲存在字典c

c= #將字典c新增到陣列d

for j in range(0,len(purey)):

w=1for i in range(0,len(x)):

if x[i] in d[j][i]:

for k in d[j][i]:

if k==x[i]:

div[i]=d[j][i].get(k)/t[j]

else:

div[i]=1/(t[j]+1)

w= w* div[i]         

p[j]=w*(t[j]/len(newx))

#將所有的類別值與其對應的概率存放到字典中,遍歷得到最大的概率所對應的類別,並返回

for k,v in dict(zip(purey,p)).items():

if v==max(p):

return k  

#測試x = [[0, 0, 1],

[0, 1, 0],

[1, 0, 0]]

y = [1, 2, 3]

x=[0,1,0]

print(predict(x,y,x))

樸素貝葉斯演算法

首先樸素貝葉斯分類演算法利用貝葉斯定理來 乙個未知類別的樣本屬於各個類別的可能性,選擇可能性最大的乙個類別作為該樣本的最終類別。對於計算而言,需要記住乙個公式。p c x p x c p c p x 類似於概率論條件概率公式。其中x代表含義為最終類別,例如 yes?no。c為屬性。使用樸素貝葉斯演算...

樸素貝葉斯演算法

計算貝葉斯定理中每乙個組成部分的概率,我們必須構造乙個頻率表 因此,如果電子郵件含有單詞viagra,那麼該電子郵件是垃圾郵件的概率為80 所以,任何含有單詞viagra的訊息都需要被過濾掉。當有額外更多的特徵時,此概念的使用 利用貝葉斯公式,我們可得到如下概率 分母可以先忽略它,垃圾郵件的總似然為...

樸素貝葉斯演算法

對於樸素貝葉斯演算法,我的理解就是 使用已知的概率和結果,來 事情的條件。舉乙個例子就是,我們通過統計得到了不同年齡段喜歡吃冰激凌的比例,比如各採訪了500個青少年 中年人和老年人,得到有450個青少年 300個中年人和50個老年人喜歡吃冰激凌。我們還通過統計,知道了在社會中假設小孩子佔20 中年人...