貝葉斯分類示例

2021-08-17 12:29:32 字數 3715 閱讀 9510

#coding=utf-8

'''貝葉斯決策理論

核心思想:選擇高概率對應的類別

引入先驗概率和邏輯推理來處理不確定的命題

使用條件概率來進行分類

示例使用貝葉斯分類來遮蔽侮辱性言論

構建分類:0:非侮辱性 1:侮辱性

從文字構建詞向量

1.將文字分解成token向量

2.計算所有文件中出現的詞的集合,這個集合包含了所有的詞彙

3.構建乙個長度為詞彙集合大小的全0向量,如果token出現過,為在相應位置標記為1

舉個例子

兩個文件分別是:

doc1: ['dog','cat','horse']

doc2: ['pig','fox','bird']

則構建詞向量的過程:

doc1,doc2構成資訊集合: voc = ['dog','cat','horse','pig','fox','bird']

doc1和doc2的詞向量長度都為 len(voc),把相應元素用voc的下標替換

dog:0 cat:1 horse:2 所以doc1,0,1,2下標的元素為1,其他位置的元素之都為0,doc2同理

得到:doc1: [1,1,1,0,0,0]

doc2: [0,0,0,1,1,1]

順便說一下這種詞向量的表示方式丟失了語義資訊

本文需要技術

1.條件概率公式

2.計算每個類別概率

3.計算每個單詞的概率

4.計算每個文件概率對數

5.比較大小

'''import numpy as np

a=np.mat([

['me','today','nice','enen','nice','go','school','learning'],

['today','weather','is','bad','cao','cao','cao','hehe'],

['i','want','to','see','***','girl','cao','***'],

['today', 'is', 'very', 'good', 'to', 'study', 'python', 'good'],

['tommorrow','i','will','go','to','dance','after','stduy'],

['i','want','to','see','***','girl','cao','cao']

])#類別向量

classvec=[0,1,1,0,0,1]

#構建詞彙集合

defcreaevoclist

(dataset):

dataset = dataset.geta()

vocablist=set()

for doucment in dataset:

vocablist = vocablist | set(doucment)

return list(vocablist)

#構建詞向量

defword2vec

(dataset):

voclist = creaevoclist(dataset)

dataset = dataset.geta()

result = ;

for i in range(dataset.shape[0]):

vec = [0]*len(voclist)

for word in dataset[i,:]:

if word in voclist:

vec[voclist.index(word)]+=1

return np.mat(result)

defword2vec2

(input,dataset):

voclist = creaevoclist(dataset)

vec = [0] * len(voclist)

for word in input:

if word in voclist:

vec[voclist.index(word)] += 1

return vec

'''#列印詞彙表和詞向量

print creaevoclist(a)

print word2vec(a)

'''#計算每個類別的條件概率 p(ci) 以及在該類別下每個詞的概率p(wi|ci)

'''每個類別的概率:該類別數/總類別數

p(wi|ci): 該分類下某個單詞出現的個數/該分類下總詞語數

'''def

train

(dataset,category):

#總類別

numcategorys = len(category)

#侮辱性文件的先驗概率

p = sum(category)/float(numcategorys)

pa = np.log(p)

pb = np.log(1-p)

#計算詞的概率

vec_len = len(np.array(dataset[0,:])[0,:])

p1 = np.ones(vec_len)

p0=np.ones(vec_len)

p1numwords = 2;

p0numwords = 2;

for i in range(dataset.shape[0]):

tmp = np.array(dataset[i,:])[0,:]

if category[i]==1:

p1 += tmp

p1numwords += sum(tmp)

else:

p0 += tmp

p0numwords +=sum(tmp)

#侮辱性文件中每個單詞的概率

p1_vec = np.log(p1/p1numwords)

p0_vec = np.log(p0/p0numwords)

return p1_vec,p0_vec,pa,pb

wordvec=word2vec(a)

p1_vec,p0_vec,pa,pb= train(wordvec,classvec)

#結合現實需要優化的點

'''優化背景:

1.計算某個文件為侮辱性類別的概率

p(w1|1)*p(w2|1)*...p(wn|1) 因為每個概率都都是0-1範圍的,所以最終文件的概率可能都是為0

1.對乘積取對數

2.某些沒有出現的詞的概率為0,導致結果為0

1.開始設定預設每個詞出現的次數為1

'''#給定一段文字判斷分類

''' b=['cao','good']

word->vec b=[1,1,0,0,0...]

p=(0.181)*(0.181)*(0.045)*(0.045)..

'''t1=['cao','***','hehe','nice','go']

t2=['wo','me','today','school','nice']

p_class_1 = sum(word2vec2(t2,a)*p1_vec)+pa

p_class_2 = sum(word2vec2(t2,a)*p0_vec)+pb

if p_class_1 > p_class_2:

print

'class1'

else:

print

'class2'

#文件詞袋模型 乙個單詞可以在文件中出現多次,更能表達某種資訊

貝葉斯分類

貝葉斯分類 有意義區分和無意義區分 既然要區分兩種點那麼兩種點必然有區別,當區分有區別的點時說是有意義區分。而完全區分那種一模一樣的點則是無意義區分。所以我們所討論的都是有意義的區分。完全區分和不完全區分 貝葉斯分類器是一種概率上的區分,而假如兩種點一種是黑的一種是白的那不需要用貝葉斯分類器區分,因...

貝葉斯分類

樸素貝葉斯模型是一組非常簡單快速的分類演算法,通常適用於維度非常高的資料集,因為執行速度快,而且可調引數少,因此非常適合為分類問題提供快速粗糙的基本方案。貝葉斯分類 樸素貝葉斯分類器建立在貝葉斯分類方法上,其數學基礎是貝葉斯定理,乙個描述統計計量條件概率關係的公式。在貝葉斯分類中,我們希望確定乙個具...

樸素貝葉斯分類

1 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。2 樸素貝葉斯的思想基礎是這樣的 對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。通俗來說,就好比這麼個道理,你在街上看到乙個黑人,我問你你猜這哥們 來的,...