西瓜書上樸素貝葉斯的實現,完全按照書上的步驟

2021-08-19 14:28:25 字數 3331 閱讀 5670

import numpy as np

def load_data(filepath):

''':arg filepath filepath是資料的路徑

:fun 載入資料:1,青綠,蜷縮,濁響,清晰,凹陷,硬滑,0.697,0.46,是

:return 載入後的資料

'''file_object = open(filepath, encoding='utf-8')

train_data =

file_object.readline()

while 1:

data = file_object.readline()

if not data:

break

else:

file_object.close()

test =

for s in train_data:

return test

def count_labels(data):

''':param data:資料集

:return: 返回好瓜和壞瓜的數目

'''yes = 0

no = 0

for s in range(data.__len__()):

if data[s][-1] == '是':

yes += 1

else:

no += 1

return yes, no

def handle_one_data(data, attr, location, yes, no):

''':param data: 資料集

:param attr: 要傳入的屬性

:param location: 傳入屬性的位置

:param yes: 好瓜數量

:param no: 壞瓜數量

:return: 返回該屬性在好瓜或者是壞瓜的前提下的概率

'''attr_y, attr_n = 0, 0

for s in range(data.__len__()):

if data[s][-1] == '是':

if data[s][location] == attr:

attr_y += 1

else:

if data[s][location] == attr:

attr_n += 1

return attr_y / yes, attr_n / no

def handle_data(data):

''':param data: 資料集

:return: 對密度和含糖率的均值和標準差

'''midu_y =

tiandu_y =

midu_n =

tiandu_n =

for s in range(data.__len__()):

if data[s][-1] == '是':

else:

m_midu_y = np.mean(midu_y)

m_midu_n = np.mean(midu_n)

t_tiandu_y = np.mean(tiandu_y)

t_tiandu_n = np.mean(tiandu_n)

std_midu_y = np.std(midu_y)

std_midu_n = np.std(midu_n)

std_tiandu_y = np.std(tiandu_y)

std_tiandu_n = np.std(tiandu_n)

return m_midu_y, m_midu_n, t_tiandu_y, t_tiandu_n, std_midu_y, std_midu_n, std_tiandu_y, std_tiandu_n

def show_result(p_yes, p_no):

''':param p_yes: 在好瓜的前提下,測試資料各個屬性的概率

:param p_no: 在是壞瓜的前提下,測試資料的各個屬性的概率

:return: 是好瓜或者是壞瓜

'''p1 = 1.0

p2 = 1.0

for s in range(p_yes.__len__()):

p1 *= np.float(p_yes[s])

p2 *= np.float(p_no[s])

if p1 > p2:

print("好瓜", p1, p2)

else:

print("壞瓜", p1, p2)

def count_attr_dis(data):

''':param data: 資料集

:return: 各個屬性取值的個數

'''count = # 記錄各個屬性的取值有多少個不同

for i in range(data[0].__len__()):

if i == 0 or i == 7 or i == 8: # 去掉編號,密度,甜度這個屬性

continue

d =

for s in range(data.__len__()):

if not d.__contains__(data[s][i]): # 如果讀到的屬性不包含在d裡就加入到d中

return count

if __name__ == '__main__':

filepath = 'd:\\pycharm\\bayes.txt'

data = load_data(filepath)

m_midu_y, m_midu_n, t_tiandu_y, t_tiandu_n, std_midu_y, std_midu_n, std_tiandu_y, std_tiandu_n = handle_data(data)

yes, no = count_labels(data)

p_yes = [yes / (yes + no)]

p_no = [no / (yes + no)]

test_data = ['青綠', '蜷縮', '濁響', '清晰', '凹陷', '硬滑', 0.697, 0.460]

for s in range(6):

s_yes, s_no = handle_one_data(data, test_data[s], s+1, yes, no)

#求西瓜書公式(7.18)

print(p_yes)

print(p_no)

show_result(p_yes, p_no)

# 防止某個屬性的取值個數為0的概率出現,採用拉皮拉斯修正(各個屬性不同取值已經完成如函式count_attr_dis)

print(count_attr_dis(data), '不同屬性取值')

Sklearn實現樸素貝葉斯

sklearn 實現樸素貝葉斯 在scikit learn中,一共有3個樸素貝葉斯的分類演算法類。分別是gaussiannb,multinomialnb和bernoullinb。其中gaussiannb就是先驗為高斯分布的樸素貝葉斯,multinomialnb就是先驗為多項式分布的樸素貝葉斯,而be...

Sklearn實現樸素貝葉斯

sklearn 實現樸素貝葉斯 在scikit learn中,一共有3個樸素貝葉斯的分類演算法類。分別是gaussiannb,multinomialnb和bernoullinb。其中gaussiannb就是先驗為高斯分布的樸素貝葉斯,multinomialnb就是先驗為多項式分布的樸素貝葉斯,而be...

樸素貝葉斯演算法Python實現

coding cp936 樸素貝葉斯分類器的實現 執行 reload docclass c1 docclass.bayes docclass.getwords docclass.sampletrain c1 c1.classify quick rabbit default unknown 構建訓練樣...