1. 程式人生 > >[學習筆記]機器學習——演算法及模型(五):貝葉斯演算法

[學習筆記]機器學習——演算法及模型(五):貝葉斯演算法

傳統演算法(五)

貝葉斯演算法

一、貝葉斯定理

簡介

貝葉斯定理是18世紀英國數學家托馬斯·貝葉斯(Thomas Bayes)提出得重要概率論理論;貝葉斯方法源於他生前為解決一個“逆概”問題寫的一篇文章;

  • 正向概率:假設袋子裡面有N個白球,M個黑球,你伸手進去摸一把,摸出黑球的概率是多大?
  • 逆向概率:如果我們事先並不知道袋子裡面黑白球的比例,而是閉著眼睛摸出一個(或好幾個)球,觀察這些取出來的球的顏色之後,那麼我們可以就此對袋子裡面的黑白球的比例作出什麼樣的推測;

這問題便是貝葉斯提出的“逆概”的問題。

公式推導

舉個例子 男生總是穿長褲,女生則一半穿長褲一半穿裙子 正向概率:隨機選取一個學生,他(她)穿長褲的概率和穿裙子的概率是多大? 逆向概率:迎面走來一個穿長褲的學生,你只看得見他(她)穿的是否長褲,而無法確定他(她)的性別,你能夠推斷出他(她)是女生的概率是多大嗎?

假設學校裡面人的總數是U 人;

  • 穿長褲的(男生)則為:UP(Boy)P(PantsBoy)U * P(Boy) * P(Pants|Boy) P(Boy) 是男生的概率= 60% P(Pants|Boy) 是條件概率,即在Boy 這個條件下穿長褲的概率是多大,這裡是100% ,因為所有男生都穿長褲;
  • 穿長褲的(女生)同理為:UP(Girl)P(PantsGirl)U * P(Girl) * P(Pants|Girl)

這裡要求的是:穿長褲裡面有多少個女生 首先,可以算出穿長褲的總人數: UP

(Boy)P(PantsBoy)+UP(Girl)P(PantsGirl)U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl) 那麼我們要求的為: P(GirlPants)=UP(Girl)P(PantsGirl)/穿P(Girl|Pants) = U * P(Girl) * P(Pants|Girl)/穿長褲總數

UP(Girl)P(P

antsGirl)UP(Boy)P(PantsBoy)+UP(Girl)P(PantsGirl)\Longrightarrow \dfrac{U * P(Girl) * P(Pants|Girl) }{U * P(Boy) * P(Pants|Boy) + U * P(Girl) * P(Pants|Girl)}

可以看出結果與學校的總人數U並沒有關係。繼續對上式進行化簡:

P(GirlPants)=P(Girl)P(PantsGirl)P(Boy)P(PantsBoy)+P(Girl)P(PantsGirl)\Longrightarrow P(Girl|Pants) = \dfrac{P(Girl) * P(Pants|Girl)}{ P(Boy) * P(Pants|Boy) + P(Girl) * P(Pants|Girl)}

分母就是穿長褲的概率:P(Pants)

P(GirlPants)=P(Girl)P(PantsGirl)P(Pants)\Longrightarrow P(Girl|Pants) = \dfrac{P(Girl) * P(Pants|Girl)}{ P(Pants)}

這個就是貝葉斯定理P(AB)=P(A)P(BA)P(B)P(A|B)=\dfrac{P(A)P(B|A)}{P(B)}

二、例項介紹

2.1.1拼寫糾錯例項

問題是我們看到使用者輸入了一個不在字典中的單詞,我們需要去猜測:“這個傢伙到底真正想輸入的單詞是什麼呢?

我們假設使用者實際想輸入的詞為D,則D為觀測值; 猜測1:P(h1 | D),猜測2:P(h2 | D),猜測3:P(h1 | D) 。。。 統一猜想為:P(h | D)P(h | D) = P(h) * P(D | h) /P(D) 貝葉斯方法計算:P(h) * P(D | h),P(h) 是特定猜測的先驗概率

而對於到底是哪個詞優先猜想呢,這個時候呢,便會有“模型比較理論”:

  • 最大似然:最符合觀測資料的最有有事,即P(D | h) 最大的,最有優勢。
  • 奧卡姆剃刀:P(h) 較大的模型有較大的優勢。

所以一般的步驟是:

  1. 計算觀測資料中的詞頻;
  2. 計算編輯距離:即兩個詞之間經過多少次增刪改換,變成另一個詞;
  3. 按照編輯距離為0,1,2的頻率最大值返回;

2.1.2拼寫檢查實現程式碼

#coding=utf-8
#write by sz

import pandas as pd
import re
import numpy as np


'''拼寫檢查器'''

data = open('./data/big.txt','r')

word_list = []
for line in  data.readlines():
   word_data = re.findall('[A-Za-z]+',line.lower())
   if len(word_data)>1:
       word_list.append(word_data)

data.close()

'''計算語庫中的詞頻'''
word_data = pd.DataFrame(columns=['word','count'])
word_dic ={}

#print(word_data.head())

for line in word_list:
   for word in line:
       if word in word_dic.keys():
           word_dic[word] +=1

       else:
           word_dic[word]=1

word_data['word'] = word_dic.keys()
word_data['count'] = word_dic.values()
#print(word_data)

'''計算編輯距離'''
'''這裡只寫了2個距離的方法'''

def distinct(list):
   new_list=[]
   for i in list:
       if i not in new_list:
           new_list.append(i)
   return new_list

zimubiao='abcdefghijklmnopqretuvwxyz'

def ins1(word):
   tmp = []
   for i in range(len(word)):
       delete_1 = word[:i]+word[i+1:]
       tmp.append(delete_1)
   for i in range(1,len(word)):
       new=word[0:i-1]+word[i]+word[i-1]+word[i+1:]
       tmp.append(new)
   for i in range(len(word)+1):
       for c in zimubiao:
           new = word[:i]+ c +word[i:]
           tmp.append(new)
   for i in range(len(word)+1):
       for c in zimubiao:
           new = word[:i] + c +word[i+1:]
           tmp.append(new)
   new_word = distinct(tmp)

   return new_word

def ins2(word):
   tmp = []
   for i in ins1(word):
       new = ins1(i)
       tmp.extend(new)
   new_word = distinct(tmp)

   return new_word

#print(ins1('apple'))

def Exist(list):
   new_list = []
   for i in list :
       for j in word_dic.keys():
           if i == j:
               new_list.append(i)
   return new_list

def p_find(list):
   p=pd.DataFrame()
   for i in list :
       a =word_data.loc[word_data['word'] == i]
       p=p.append(a,ignore_index=True).sort_values(by='count',ascending=False)

   return p.iloc[0,0]


def correct(word):

   word = word.lower()

   L = Exist([word]) or Exist(ins1(word)) or Exist(ins2(word)) or [word]

   return p_find(L)


if __name__ == '__main__':


   print(correct('tlp'))

#print(p_find(Exist(ins1('win'))))

這裡用’tlp‘作為實驗;最後返回的結果是’top‘這個詞,如下: 在這裡插入圖片描述

2.2 文字分析

文字分析主要是對一段文字(新聞),進行分析:包括概括關鍵詞、對新聞分類等等分析;主要通過以下步驟:

  1. 停用表 每段文字中,肯定有一些語料是大量存在(頻率很高),但對我們分析文字過程中起不到任何作用,但有可能會影響最後的分析結果的,如下: 在這裡插入圖片描述 所以我們需要將這些詞從分析的文字中刪除,而這些詞就放在’停用表‘中;
  2. Tf-idf:關鍵詞提取 TF全稱為:Term Frequency,即詞出現的頻率,計算公式如下: TF=TF=\dfrac{某詞在文中出現的次數}{該文出現最多的詞在文中出現的次數} IDF全稱為:Inverse Document Frequency,即逆文件頻率,解釋為:如果某個詞比較少見,但是它在這篇文章中多次出現,那麼它很可能就反映了這篇文章的特性,正是我們所需要的關鍵詞。計算公式如下: IDF=log+1IDF=log(\dfrac{語料庫文件總數}{包含該詞的文件+1}) 而我們要求的是Tf-idf,則將TF於IDF相乘: TFIDF=TFIDFTF-IDF=TF*IDF
  3. 相似度分類 兩句話怎麼去判斷為同類的,這裡需要通過: 語句\Longrightarrow分詞\Longrightarrow詞頻\Longrightarrow詞頻向量 通過計算兩個詞頻向量的夾角的cos值: cosθ=i=1n(AiBi)i=1n(Ai)2i=1n(Bi)2cos\theta=\dfrac{\sum_{i=1}^n(A_i*B_i)}{\sqrt{\sum_{i=1}^n(A_i)^2}*\sqrt{\sum_{i=1}^n(B_i)^2}} 在這裡插入圖片描述

2.2.2拼寫檢查實現程式碼

#coding=utf-8
#write by sz

import pandas as pd
from wordcloud import WordCloud
import jieba.analyse

import matplotlib.pyplot as plt
import math
from collections import defaultdict
import numpy as np


data = pd.read_table('./data/val.txt',names=['type','title','url','content'],sep='\t')
stopword = pd.read_csv('./data/stopwords.txt',names=['stopword'],index_col=False,sep='\t',quoting=3)

words = []
ttt= []
for i in  range(data.shape[0]):
   text = jieba.lcut(data.loc[i,'content'])
   word = []
   for j in range(len(text)):
       if text[j] not in stopword['stopword'].values.tolist() and len(text[j])
            
           

相關推薦

[學習筆記]機器學習——演算法模型演算法

傳統演算法(五) 貝葉斯演算法 一、貝葉斯定理 簡介 貝葉斯定理是18世紀英國數學家托馬斯·貝葉斯(Thomas Bayes)提出得重要概率論理論;貝葉斯方法源於他生前為解決一個“逆概”問題寫的一篇文章

概率圖模型PGMBayesian network初探

1. 從貝葉斯方法(思想)說起 - 我對世界的看法隨世界變化而隨時變化 用一句話概括貝葉斯方法創始人Thomas Bayes的觀點就是:任何時候,我對世界總有一個主觀的先驗判斷,但是這個判斷會隨著世界的真實變化而隨機修正,我對世界永遠保持開放的態度。 1763年,民間科學家Thomas Bayes發表

機器學習演算法——樸素演算法R語言實現方法

樸素貝葉斯演算法也是一種常用的分類演算法,尤其在對文字文件分類的學習任務中,樸素貝葉斯分類是最有效的演算法之一。所謂的樸素,即假設在給定目標值時屬性值之間相互條件獨立,雖然這一假設看似不合理,但其最終的分類效果卻普遍較好。 一、概述 1、貝葉斯公式 2、最大後驗假設(MA

機器學習筆記分類器

機器學習所研究的主要內容,是關於在計算機上從資料中產生“模型”的演算法,這個產生的模型大體上可以分為“判別式模型”和“生成式模型”兩大類。 其中判別式模型是給定x,通過直接對條件概率分佈P(y|x)進行建模來預測y。這種方法尋找不同類別的最優分類面,反映的是異類資料之間的差異。之前幾篇文章中介紹

機器學習數學原理4——樸素演算法

機器學習數學原理(4)——樸素貝葉斯模型 樸素貝葉斯模型(Naive Bayes Model),是一種基於貝葉斯定理與特徵條件獨立假設的分類方法,與決策樹模型(Decision Tree Model)同為目前使用最廣泛的分類模型之一,在各個領域都有廣泛的應用,例如我們經常會用到的垃圾

機器學習5決策定理

      其中,P(C|x)表示觀測到資料x時事件C發生的條件概率,我們稱為後驗概率(posterior probability);P(C)=P(C=1)是事件C=1發生時的概率,稱為先驗概率(prior probabilty),因為這是在觀察到資料x之前就已經得到的關於C的知識;P(x|C)稱為類似然,與

OpenCV機器學習1分類器實現程式碼分析

OpenCV的機器學習類定義在ml.hpp檔案中,基礎類是CvStatModel,其他各種分類器從這裡繼承而來。 今天研究CvNormalBayesClassifier分類器。 1.類定義 在ml.hpp中有以下類定義: class CV_EXPORTS_W CvNorm

Python與機器學習樸素分類

1.安裝中文分詞器 由於本文是對中文文字進行分類,故需要用到中文分詞器,而結巴分詞則是Python支援較好的一款分詞器。 使用命令安裝: pip3 install jieba3k 或者下載結巴分詞檔案【下載】 結巴分詞測試: 結巴分詞支援三種分詞模式: 精確模式,也是結巴

大資料背後的神祕公式公式

大資料、人工智慧、海難搜救、生物醫學、郵件過濾,這些看起來彼此不相關的領域之間有什麼聯絡?答案是,它們都會用到同一個數學公式——貝葉斯公式。它雖然看起來很簡單、很不起眼,但卻有著深刻的內涵。那麼貝葉斯公式是如何從默默無聞到現在廣泛應用、無所不能的呢? ◆ ◆ ◆ 什麼是貝

R語言與機器學習學習筆記分類演算法3樸素

演算法三:樸素貝葉斯演算法 在貝葉斯決策中,對於先驗概率p(y),分為已知和未知兩種情況。 1. p(y)已知,直接使用貝葉斯公式求後驗概率即可; 2. p(y)未知,可以使用聶曼-皮爾遜決策(N-P決策)來計算決策面。 而最大最小損失規則主要就是使用解決最小損失規則時先驗概率未知或難以計算的問題的

機器學習讀書筆記樸素基礎篇之網站賬號分類

pan 技巧 nbsp 增強 就是 使用 分類問題 預測 結果 一、條件概率 在學習計算p1和p2概率之前,我們需要了解什麽是條件概率,就是指在事件B發生的情況下,事件A發生的概率,用P(A|B)來表示。 根據文氏圖,可以很清楚地看到在事件B發生的情況下,事件A發

學習筆記使用決策樹演算法檢測POP3暴力破解

1.資料蒐集     載入KDD 99中的資料: def load_kdd99(filename): x=[] with open(filename) asf: for line in f: line=line.st

機器學習筆記樸素的Python程式碼實現

上研究生的時候,一心想讀生物資訊學的方向,由此也選修了生物數學,計算生物學等相關課程。給我印象最深的是給我們計算生物學的主講老師,他北大數學系畢業,後來做起了生物和數學的交叉學科研究。課上講的一些演算法比如貝葉斯,馬爾科夫,EM等把我給深深折磨了一遍。由於那時候

數字語音訊號處理學習筆記——語音訊號的數字模型3

版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/u013538664/article/details/25219503 2.4 語音的感知       

數字語音訊號處理學習筆記——語音訊號的數字模型2

版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/u013538664/article/details/25126095 2.3 語音的聽覺機理      &nb

數字語音訊號處理學習筆記——語音訊號的數字模型1

版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/u013538664/article/details/25110285 2.1 概述       &n

Python《機器學習實戰》讀書筆記——樸素

第四章 基於概率論的分類方法:樸素貝葉斯 4-1 基於貝葉斯決策理論的分類方法 優點:在資料較小的情況下仍然有效,可以處理多類別問題 缺點:對於輸入資料的準備方式較為敏感。 適用資料型別:標稱型資料。 假設現在我們有一個數據集,它由兩類資

機器學習筆記——樸素法的引數估計

一、極大似然估計 在上一筆記中,經過推導,得到了樸素貝葉斯分類器的表示形式: y=argmaxckP(Y=ck)∏jP(X(j)=x(j)|Y=ck)(1) 也就是說,樸素貝葉斯方法的學習是對概率P(Y=ck)和P(X(j)=x(j)|Y=ck)的

白話機器學習演算法樸素

樸素貝葉斯,確實很樸素,原理也很簡單,但是用途很厲害;很多涉及概率的機器學習演算法都要用到這些東西:最大似然估計(MLE),貝葉斯估計(最大後驗MAP),EM(也是最大似然估計,只是方法不同),最大熵; 先說點廢話,再寫點公式吧: 最大似然估計:我取什麼樣的引數,使得當前資

機器學習實戰樸素NBNaive Bayes

目錄 0. 前言 1. 條件概率 2. 樸素貝葉斯(Naive Bayes) 3. 樸素貝葉斯應用於文字分類 4. 實戰案例 4.1. 垃圾郵件分類案例 學習完機器學習實戰的樸素貝葉斯,簡單的做個筆記。文中