有用請點贊,沒用請差評。
# ***** bayes 樸素貝葉斯法
#author:tomator
"""演算法參考與李航博士《統計學習方法》
採用貝葉斯估計(拉普拉斯平滑)計算先驗概率和條件概率
"""from collections import counter, defaultdict
import numpy as np
import operator
class nbayes(object):
def __init__(self,smooth=1):
self.smooth = smooth # 貝葉斯估計方法的平滑引數smooth=1,當smooth=0時即為最大似然估計
self.p_prior = {} # 先驗概率
self.p_condition = {} # 條件概率
def train(self, vector_data , label_data):
n_samples = label_data.shape[0] #計算樣本數
# 統計不同類別的樣本數,並存入字典,key為類別,value為樣本數
# counter類的目的是用來跟蹤值出現的次數。以字典的鍵值對形式儲存,其中元素作為key,其計數作為value。
dict_label = counter(label_data)
k = len(dict_label)
for key, val in dict_label.items():
# 計算先驗概率
self.p_prior[key] = (val + self.smooth) / (n_samples + k * self.smooth)
# 計算後驗概率
# 分別對每個特徵維度進行計算,vector_data.shape[1]為特徵向量的維度
for d in range(vector_data.shape[1]):
# defaultdict的作用是在於,當字典裡的key不存在但被查詢時,返回的不是keyerror而是乙個預設值
nums_vd = defaultdict(int)
# 抽取特定維度
vector_d = vector_data[:, d]
# unique函式去除其中重複的元素,並按元素由大到小返回乙個新的無元素重複的元組或者列表
nums_s = len(np.unique(vector_d)) #每個特徵向量的可能取值個數
for xd, y in zip(vector_d, label_data):
nums_vd[(xd, y)] += 1
for key, val in nums_vd.items():
# d為維度,key[0]為每個特徵向量每個維度的的值, key[1]為類別
self.p_condition[(d, key[0], key[1])] = (val + self.smooth) / (dict_label[key[1]] + nums_s * self.smooth)
# **未知特徵向量的類別
def predict(self, input_v):
p_predict = {}
# y為類別,p_y為每個類別的先驗概率
for y, p_y in self.p_prior.items():
p=p_y #計算每種後驗概率
for d, v in enumerate(input_v):
p *= self.p_condition[(d, v, y)]
p_predict[y] = p
# 對字典按value進行排序
p_predict_sorted=sorted(p_predict.items(),key=operator.itemgetter(1),reverse=true)
# 獲取字典中value最大值所對應鍵的大小
# return max(p_predict, key=p_predict.get)
return p_predict_sorted[0]
if __name__ == "__main__":
# 以《統計學習方法》中的例4.1計算,為方便計算,將例子中"s"設為0,「m"設為1。
data = np.array([[1, 0, -1], [1, 1, -1], [1, 1, 1], [1, 0, 1],
[1, 0, -1], [2, 0, -1], [2, 1, -1], [2, 1, 1],
[2, 2, 1], [2, 2, 1], [3, 2, 1], [3, 1, 1],
[3, 1, 1], [3, 2, 1], [3, 2, -1]])
# 提取特徵向量
vector_data = data[:, :-1]
# 提取label類別
label_data = data[:, -1]
# 採用貝葉斯估計計算條件概率和先驗概率,此時拉普拉斯平滑引數為1,為0時即為最大似然估計
bayes = nbayes(smooth=1)
# 例項化
bayes.train(vector_data, label_data)
# 樸素貝葉斯分類
參考李航《統計學習方法》
樸素貝葉斯分類
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的樣本 數總樣本...