樸素貝葉斯算法
輸入:
樣本數據T,包含m個n維特徵的樣本。
aij爲每個樣本特徵的第i個特徵可取到的第j個值。
測試樣本x
輸出:
對x的預測分類。
計算先驗概率
計算每個特徵每個取值的條件概率
的條件概率
計算假如時出現X=x的條件概率
對所有
時,x的每一個特徵的條件概率的乘積。
計算當X=x時所有的後驗概率的分子
以上公式中分子所有需要的內容都在以前已經計算出,代入公式即可
不需要計算分母。因爲最終要用到的不是後驗概率的具體數值,只是要比較大小。中所有C_k的後驗概率公式,分母都是相同的,不影響大小的比較,所以不用計算出來。
確定x的分類
當X=x時所有即x的分類
代碼
def NaiveteBayes(T, y, a, Y, x):
# 計算先驗概率
prepro = {}
for yRange in Y:
#print (yRange, Y[Y==yRange].shape[0], )
prepro[yRange] = y[y==yRange].shape[0]/y.shape[0]
print('先驗概率:',prepro)
# 計算條件概率
conpro = {}
for i in range(len(a)): # 遍歷每個特徵
for j in a[i]: # 遍歷特徵的每個取值
for k in Y:
conpro[(i,j, k)] = X[(y==k)&(X[:,i]==j),:].shape[0]/X[y==k,:].shape[0]
print('條件概率:',conpro)
# 計算後驗概率的分子
postpro = {}
for yRange in Y:
pro = 1
for i in range(x.shape[0]):
pro = pro * conpro[(i, x[i], yRange)]
postpro[yRange] = pro * prepro[yRange]
print ('後驗概率', postpro)
# 確定X的分類
import operator
return sorted(postpro.items(), # iterable -- 可迭代對象,在python2中使用A.iteritems(),在python3中使用A.items()
key=operator.itemgetter(1), # key -- 主要是用來進行比較的元素,指定可迭代對象中的一個元素來進行排序,這裏指基於item的value進行排序
reverse=True)[0][0] # reverse -- 排序規則,reverse = True 降序 , reverse = False 升序(默認)。
# 排序結果是一個list