python 實現樸素貝葉斯分類器(離散資料)

2021-09-19 04:44:38 字數 2911 閱讀 5177

有用請點贊,沒用請差評。

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