基於樸素貝葉斯識別簡單驗證碼
樸素貝葉斯定理
原理請參考:
http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.html
https://www.cnblogs.com/TimVerion/p/11197043.html
即 後驗概率 = 先驗概率 * 調整因子
在分類中,先驗概率指樣本中該類別佔所有類別的概率,調整因子則是每個樣本特徵的概率乘積,舉個例子。
帥不帥 | 性格 | 上進不 | 值不值得交朋友 | |
---|---|---|---|---|
帥 | 好 | 不上進 | 不值得 | |
不帥 | 不好 | 不上進 | 不值得 | |
帥 | 好 | 上進 | 值得 | |
不帥 | 好 | 上進 | 值得 |
這裡的先驗概率就是指:值得交朋友(1/2) , 不值得交朋友(1/2)
調整因子是指你要預測的樣本的特徵概率,如果有一個樣本是不帥|好|不上進(例子特徵不分散,因為只有兩個值,我們先不管這個)
那麼值得交的後驗概率= 1/2 * 調整因子 = 0, 調整因子 = 不帥在值得交的資料中佔(1/2) * 好在值得佔(1) * 不上進在值得佔(0)
不值得交的後驗概率 = 1/2* 1/2 * 1/2 * 1 = 1/8
所以這個人值不值得交呢,根據資料是1/8>0,那就是不值得交了。不過因為樣本資料較少,出現某個為0的概率,這就有點問題了,因為實際不可能概率為0的。
平滑引數
所以我們需要引入一個平滑引數,來使這個值不為0
那麼我們計算概率時不是直接使用:符合要求的樣本/總樣本,而是 符合要求的樣本 + alpha/(總樣本+標籤類別數或特徵類別數 * alpha),alpha一般取1.0
即先驗概率:值得交朋友(2 + 1/(4+2 * 1))=1/3 , 不值得交朋友(2 + 1/(4+2 * 1)) = 1/3
而特徵概率的計算需要這樣計算:其他先不看,我們直接看值得交中不上進的概率(也就是先前為0的概率)= 0+1/(2 + 21) = 1/4, 注意這裡的類別數是指len(上進,不上進)
值得交的後驗概率:1/3 1/2 * 3/4 * 1/4 = 1/32
不值得交的後驗概率: 1/3 * 1/2 * 1/2 * 3/4 = 1/16
雖然還是不值得交,但至少值得交的概率不為0了。如果你還不懂的話,直接看驗證碼的識別,然後在回來看這個。
sklearn中的api
sklearn.naive_bayes.MultinomialNB(alpha=1.0, fit_prior=True, class_prior=None)
引數
- alpha:上面說的平滑引數
- fit_prior: 是否考慮先驗概率,也就是每個類別所佔的比例
- class_prior: 給定的先驗概率陣列
屬性 - class_log_prior_ : 陣列, 維度(n_classes, ),每個類別的對數概率。n_classes為類別數量,比如有10個類別,每個類別樣本都是100個,則陣列為(In 1/10, In 1/10,...)
- intercept_ : 同class_log_prior_
- feature_log_prob_ : 陣列,維度(n_classes,n_features)給定一類特徵的經驗對數概率P(x_i|y)。沒看懂
- coef_ : 同feature_log_prob_
- class_count_ : 陣列,維度(n_classes, )每個類別的樣本個數
- classes_ : 陣列,維度(n_classes,)每個類別的標籤
- feature_count_ : 陣列,形狀(n_classes,n_features)擬合期間每個(類,特徵)遇到的樣本數。沒看懂
方法 - fit(x, y[, sample_weight]): 使用樣本x和標籤y作訓練
- get_params(deep=True): 獲取模型的所有引數,deep不知道有什麼用
- partial_fit(x, y[, classes, sample_weight]): 一批一批的訓練樣本(當樣本足夠大時)
- predict(test_x): 根據樣本test_x,返回預測y
- predict_proba(test_x): 返回樣本test_x屬於每個類別的概率,也就是說返回的是維度為(樣本數, k)的二維陣列,每行一維陣列的所有元素和為1,陣列長度為k。
- score(test_x, y, sample_weight =None): 根據樣本test_x預測test_y, 然後對比實際的y返回的正確分數,sample_weight為權重
- set_params(**args): 重新設定模型引數
當然還有其他樸素貝葉斯分類或迴歸器,區別如下:
特徵是離散變數時,使用多項式模型(MultinomialNB)
當特徵是連續變數時,使用高斯模型(GaussianNB)
伯努利模型(BernoulliNB)和多項式模型是一致的,但要求特徵是二值化的(1,0)
生成模型
根據上面的描述可知,像這種簡單驗證碼,可以使用多項式模型,也可以使用伯努利模型,因為圖片已經被二值化。
已知圖片是18x10的二維陣列,陣列的每個元素都是0,1之間的數。我們可以組成180個特徵,而驗證碼都是0-9的數字,所以分類是這樣來計算的
假設180個特徵分別為x1, x2,...,x180,標籤為0-9,每個標籤的樣本個數都是120個
某個樣本屬於0的概率:P(0) = P0(x1)P0(x2)....P0(x180)P總(0), P0(x1)表示x1在0類別樣本中所佔的比例(概率),P總(0)表示0佔總樣本的比例(概率)即1/10, 這些值都是可以從訓練樣本求得。
程式碼和KNN的基本一樣,如下:
from sklearn import naive_bayes
import os
from PIL import Image
import numpy as np
def func():
x = []
y = []
for label in os.listdir('train'):
for file in os.listdir(f'train/{label}'):
im = Image.open(f'train/{label}/{file}')
pix = np.array(im)
pix = (pix > 180) * 1
pix = pix.ravel()
x.append(list(pix))
y.append(int(label))
train_x = np.array(x)
train_y = np.array(y)
model = naive_bayes.MultinomialNB(alpha=1)
model.fit(train_x, train_y)
x = []
y = []
for label in os.listdir('test'):
for file in os.listdir(f'test/{label}'):
im = Image.open(f'test/{label}/{file}')
pix = np.array(im)
pix = (pix > 180) * 1
pix = pix.ravel()
x.append(list(pix))
y.append(int(label))
test_x = np.array(x)
test_y = np.array(y)
score = model.score(test_x, test_y)
return score
if __name__ == "__main__":
score = func()
print(score)
在這種簡單驗證碼識別上,樸素貝葉斯也可以達到100%的正確率。如果將樣本特徵改成16個的話,你會發現樸素貝葉斯和KNN錯誤的地方都是一樣的,都是同一個驗證碼識別成了同一個錯誤。
最後,我正在學習一些機器學習的演算法,對於一些我需要記錄的內容我都會分享到部落格和微信公眾號,歡迎關注。平時的話一般分享一些爬蟲或者Python的內容。另外,如果部落格有錯誤的話,還請指出。
這是已標註的資料:https://www.lanzous.com/i8epywd
最後,我正在學習一些機器學習的演算法,對於一些我需要記錄的內容我都會分享到部落格和微信公眾號(python成長路),歡迎關注。平時的話一般分享一些爬蟲或者Python的內容。
相關推薦
基於樸素貝葉斯識別簡單驗證碼
樸素貝葉斯定理 原理請參考: http://www.ruanyifeng.com/blog/2011/08/bayesian_inference_part_one.html https://www.cnblogs.com/TimVerion/p/11197043.html 即 後驗概率 = 先驗概率 * 調整
kaggle | 基於樸素貝葉斯分類器的語音性別識別
概要: 本實驗基於kaggle上的一個資料集,採用樸素貝葉斯分類器,實現了通過語音識別說話人性別的功能。本文將簡要介紹這一方法的原理、程式碼實現以及在程式設計過程中需要注意的若干問題,程式碼仍然是用MATLAB寫成的。 關鍵字: MATLAB; 語音性別識別
MINIST | 基於樸素貝葉斯分類器的0-9數字手寫體識別
概要: 本實驗基於MINIST資料集,採用樸素貝葉斯分類器,實現了0-9數字手寫體的識別。本文將簡要介紹這一方法的原理、程式碼實現以及在程式設計過程中需要注意的若干問題,程式碼仍然是用MATLAB寫成的。 關鍵字: MATLAB; 影象處理; 數字手寫體識別
基於樸素貝葉斯分類器的 20-news-group分類及結果對比(Python3)
之前看了很多CSDN文章,很多都是根據stack overflow 或者一些英文網站的照搬。導致我看了一整天最後一點收穫都沒有。 這個作業也借鑑了很多外文網站的幫助 但是是基於自己理解寫的,算是一個學習筆記吧。環境是python3(海外留學原因作業是英文的,渣英語見諒吧)程式碼最後附上。 M
基於樸素貝葉斯算法的情感分類
set 求最大值 記錄 變焦 def ... rop ros 結果 環境 win8, python3.7, jupyter notebook 正文 什麽是情感分析?(以下引用百度百科定義) 情感分析(Sentiment analysis),又稱傾向性分析,意見抽取(Opi
Python--基於樸素貝葉斯演算法的情感分類
環境 win8, python3.7, jupyter notebook 正文 什麼是情感分析?(以下引用百度百科定義) 情感分析(Sentiment analysis),又稱傾向性分析,意見抽取(Opinion extraction),意見挖掘(Opinion mining),情感挖掘(Sentiment
基於樸素貝葉斯的垃圾郵件過濾
1.文字切分 #對於一個文字字串,可以使用Python的string.split()方法將其切分 mySent = 'This book is the best book on python or M.L. I have ever laid eyes upon' word
基於樸素貝葉斯分類演算法實現垃圾郵箱分類
貝葉斯決策理論 在機器學習中,樸素貝葉斯是基於貝葉斯決策 的一種簡單形式,下面給出貝葉斯的基本公式,也是最重要的公式: 其中X是一個m*n的矩陣,m為他的樣本數,n為特徵的個數,即我們要求的是:在已知的樣本情況下的條件概率。 )表示
《機器學習實戰》基於樸素貝葉斯分類演算法構建文字分類器的Python實現
Python程式碼實現:#encoding:utf-8 from numpy import * #詞表到向量的轉換函式 def loadDataSet(): postingList = [['my','dog','has','flea','problems','help','please'],
基於樸素貝葉斯的關於網際網路金融新聞分類(python實現)
中國網際網路金融發展迅速,2014年是中國網際網路金融起步的一年,但在短短的一年時間內,網際網路金融創業者們融資額度一再創高,雨後春筍般湧現出各類網際網路金融產品讓使用者眼花繚亂,隨著創業門檻的降低,在即將到來的2015年,網際網路金融必將在中國掀起熱潮。
基於樸素貝葉斯分類器的文字分類
實驗要求題目要求 1、用MapReduce演算法實現貝葉斯分類器的訓練過程,並輸出訓練模型; 2、用輸出的模型對測試集文件進行分類測試。測試過程可基於單機Java程式,也可以是MapRe
自然語言處理一:基於樸素貝葉斯的語種檢測
本文來自是對七月線上寒小陽自然語言處理課程的總結。 本文使用樸素貝葉斯完成一個語種檢測的分類器,準確度經過簡單的引數調優可以達到99.1%。 機器學習的演算法要取得好效果,離不開資料,咱們先拉點資料(twitter資料,包含English, French, Germa
基於樸素貝葉斯的新聞分類
貝葉斯理論 在我們有一大堆樣本(包含特徵和類別)的時候,我們非常容易通過統計得到 p(特徵|類別) . 大家又都很熟悉下述公式: #coding: utf-8 import os import time import random import
基於樸素貝葉斯的中文文字分類器(python實現,非呼叫)
本文將用樸素貝葉斯原理做一箇中文文字分類器。樸素貝葉斯完全可以勝任多分類任務。為了方便,這裡就先做個2分類的。理論部分:https://blog.csdn.net/montecarlostyle/article/details/79870860 我們事先準備兩
基於樸素貝葉斯的定位演算法
1 定位背景介紹 一說到定位大家都會想到gps,然而gps定位有首次定位緩慢(具體可以參考之前的博文《LBS定位技術》)、室內不能使用、耗電等缺陷,這些缺陷大大限制了gps的使用。在大多數移動網際網路應用例如google地圖、百度地圖等,往往基於wifi、基站來進行定位。 一般
從爬取豆瓣影評到基於樸素貝葉斯的電影評論情感分析(上)
一、爬取豆瓣影評 基本思路:先獲取每個電影的評論區連結,然後依次進入其評論區爬取評論。選取10部電影,每部200條評論。 用到的包為:BeautifulSoup,urllib 這裡選取的連結為:豆瓣電影,開啟後內容如下:
資料探勘:基於樸素貝葉斯分類演算法的文字分類實踐
前言: 如果你想對一個陌生的文字進行分類處理,例如新聞、遊戲或是程式設計相關類別。那麼貝葉斯分類演算法應該正是你所要找的了。貝葉斯分類演算法是統計學中的一種分類方法,它利用概率論中的貝葉斯公式進行擴充套件。所以,這裡建議那些沒有概率功底或是對概率論已經忘記差不多的讀者可
基於樸素貝葉斯分類器的文字分類演算法(上)
轉載請保留作者資訊: 作者:phinecos(洞庭散人) Preface 本文緣起於最近在讀的一本書-- Tom M.Mitchell的書中第6章詳細講解了貝葉斯學習的理論知識,為了將其應用到實際中來,參考了網上許多資料,從而得此文。文章將分為兩個部分,第一部分將介紹貝葉斯學習的相關理論()。第二部
(資料探勘-入門-8)基於樸素貝葉斯的文字分類器
主要內容: 1、動機 2、基於樸素貝葉斯的文字分類器 3、python實現 一、動機 之前介紹的樸素貝葉斯分類器所使用的都是結構化的資料集,即每行代表一個樣本,每列代表一個特徵屬性。 但在實際中,尤其是網頁中,爬蟲所採集到的資料都是非結構化的,如新聞、微博、帖子等,如果要對對這一類資料進行分類,應該怎麼辦
Python實現基於樸素貝葉斯的垃圾郵件分類
聽說樸素貝葉斯在垃圾郵件分類的應用中效果很好,尋思樸素貝葉斯容易實現,就用python寫了一個樸素貝葉斯模型下的垃圾郵件分類。在400封郵件(正常郵件與垃圾郵件各一半)的測試集中測試結果為分類準確率95.15%,在僅僅統計詞頻計算概率的情況下,分類結果還是相當不