#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 樸素貝葉斯的思想基礎是這樣的 對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。通俗來說,就好比這麼個道理,你在街上看到乙個黑人,我問你你猜這哥們 來的,...