統計學習方法第四章:樸素貝葉斯法(naive Bayes),貝葉斯估計及python實現
標簽: 統計學習方法
統計學習方法第二章:感知機(perceptron)算法及python實現
統計學習方法第三章:k近鄰法(k-NN),kd樹及python實現
統計學習方法第四章:樸素貝葉斯法(naive Bayes),貝葉斯估計及python實現
統計學習方法第五章:決策樹(decision tree),CART算法,剪枝及python實現
統計學習方法第五章:決策樹(decision tree),ID3算法,C4.5算法及python實現
完整代碼:
https://github.com/xjwhhh/LearningML/tree/master/StatisticalLearningMethod
歡迎follow和star
樸素貝葉斯(naive Bayes)法是基于貝葉斯定理與特征條件獨立假設的分類方法。
對于給定的訓練數據集,首先基于特征條件獨立假設學習輸入/輸出的聯合概率分布;然后基于此模型,對給定的輸入x,利用貝葉斯定理求出后驗概率最大的輸出y。
樸素貝葉斯法實現簡單,學習與預測的效率都很高,是一種常用的方法
下圖是樸素貝葉斯算法:
具體的解釋和證明可以看《統計學習方法》或其他博文,這里不再贅述
python代碼實現,使用MINST數據集,為了避免概率值為0的情況,使用貝葉斯估計:
import cv2
import time
import logging
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
def log(func):
def wrapper(*args, **kwargs):
start_time = time.time()
logging.debug('start %s()' % func.__name__)
ret = func(*args, **kwargs)
end_time = time.time()
logging.debug('end %s(), cost %s seconds' % (func.__name__, end_time - start_time))
return ret
return wrapper
# 二值化,將圖片進行二值化的目的是確定每個特征可選的值只有兩種,對應于train方法里conditional_probability最后一個維度的長度2
def binaryzation(img):
cv_img = img.astype(np.uint8)
cv2.threshold(cv_img, 50, 1, cv2.THRESH_BINARY_INV, cv_img)
return cv_img
@log
def train(train_set, train_labels):
class_num = len(set(train_labels))
feature_num = len(train_set[0])
prior_probability = np.zeros(class_num) # 先驗概率
conditional_probability = np.zeros((class_num, feature_num, 2)) # 條件概率
print(conditional_probability.shape)
for i in range(len(train_labels)):
img = binaryzation(train_set[i]) # 圖片二值化
label = train_labels[i]
prior_probability[label] += 1
for j in range(feature_num):
conditional_probability[label][j][img[j]] += 1
# 貝葉斯估計,因為分母都相同,所以先驗概率和條件概率都不用除以分母
prior_probability += 1
for label in set(train_labels):
for j in range(feature_num):
conditional_probability[label][j][0] += 1
conditional_probability[label][j][0] /= (len(train_labels[train_labels == label]) + 2 * 1)
conditional_probability[label][j][1] += 1
conditional_probability[label][j][1] /= (len(train_labels[train_labels == label]) + 2 * 1)
# print(prior_probability)
# print(conditional_probability)
return prior_probability, conditional_probability
@log
def predict(test_features, prior_probability, conditional_probability):
result = []
for test in test_features:
img = binaryzation(test)
max_label = 0
max_probability = 0
for i in range(len(prior_probability)):
# print("label",i)
probability = prior_probability[i]
for j in range(len(img)): # 特征長度
# print("j",j)
probability *= int(conditional_probability[i][j][img[j]])
if max_probability < probability:
max_probability = probability
max_label = i
result.append(max_label)
return np.array(result)
if __name__ == '__main__':
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
raw_data = pd.read_csv('../data/train.csv', header=0)
data = raw_data.values
imgs = data[0:2000, 1:]
labels = data[0:2000, 0]
# print(imgs.shape)
# 選取 2/3 數據作為訓練集, 1/3 數據作為測試集
train_features, test_features, train_labels, test_labels = train_test_split(imgs, labels, test_size=0.33,random_state=1)
prior_probability, conditional_probability = train(train_features, train_labels)
test_predict = predict(test_features, prior_probability, conditional_probability)
score = accuracy_score(test_labels, test_predict)
print("The accuracy score is ", score)
智能推薦
樸素貝葉斯 (Naive Bayes)
樸素貝葉斯 (Naive Bayes) 前言 貝葉斯定理概率論中必學的一個定理,而樸素貝葉斯就是基于此的一種簡單分類方法。 樸素貝葉斯(naive Bayes)法是是基于 貝葉斯定理 和 特征條件獨立假設 的分類方法 數學解釋 條件獨立公式,如果X和Y相互獨立,則有: P(X,Y)=P(X)P(Y)P(X,Y)=P(X)P(Y)P(X,Y)=P(X)P(Y) 條件概率公式: P(Y∣X)=P(X,...
樸素貝葉斯(Naive Bayes)
學習目標: 掌握貝葉斯公式 結合兩個實例了解貝樸素葉斯的參數估計 掌握貝葉斯估計 學習內容: 1.2 樸素貝葉斯的介紹 樸素貝葉斯算法(Naive Bayes, NB) 是應用最為廣泛的分類算法之一。它是基于貝葉斯定義和特征條件獨立假設的分類器方法。由于樸素貝葉斯法基于貝葉斯公式計算得到,有著堅實的數學基礎,以及穩定的分類效率。NB模型所需估計的參數很少,對缺失數據不太敏感,算法也比較簡單。當年的...
《機器學習實戰》第四章學習筆記(樸素貝葉斯)
樸素貝葉斯法是基于貝葉斯定理與特征條件獨立假設的分類方法。對于給定的訓練數據集,首先基于特征條件獨立假設學習輸入/輸出的聯合概率密度分布;然后基于此模型,對于給定的輸入x,利用貝葉斯定理求出后驗概率最大的輸出y。樸素貝葉斯法實現簡單,學習與預測的效率都很高,是一種常用的方法。 一、樸素貝葉斯 1.1 基本方法 樸素貝葉斯法對條件概率分布作了條件獨立性的假設。由于這是一個較強的假設,樸素貝葉斯由此得...
高斯樸素貝葉斯(Gaission Naive Bayes) 之 Python
這里寫自定義目錄標題 前言 樸素貝葉斯(naive bayes ) 貝葉斯公式及原理 條件獨立假設 高斯樸素貝葉斯分類器 知識補充 全概率公式以及貝葉斯公式 總體方差和樣本方差 自己的見解 合理的創建標題,有助于目錄的生成 如何改變文本的樣式 插入鏈接與圖片 如何插入一段漂亮的代碼片 生成一個適合你的列表 創建一個表格 設定內容居中、居左、居右 SmartyPants 創建一個自定義列表 如何創建...
猜你喜歡
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...