1. 程式人生 > >基於樸素貝葉斯識別簡單驗證碼

基於樸素貝葉斯識別簡單驗證碼

樸素貝葉斯定理

原理請參考:
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%,在僅僅統計詞頻計算概率的情況下,分類結果還是相當不