Python實現貝葉斯分類器

2021-07-06 05:01:11 字數 4344 閱讀 5106

使用樸素貝葉斯分類器,對一片文章進行分類處理

對中文進行分詞處理 —jieba分詞

對分開的詞語進行處理,去除重複詞彙,去除標點和單個虛擬詞彙如:你,我,他。。。

選擇特徵詞,很重要,要總結出符合某一型別的關鍵特徵詞對分類器進行訓練,即傳入一些已經分好類的文章,讓分類器可以知道其中的一些特徵詞。

計算出特徵詞在各個分類中出現的概率。

為每個特徵詞設定權重值

計算整篇文件的概率,將每個特徵值的概率相乘,即求出了在某一分類條件下,這篇文章出現的概率p(document|category)

根據p(document|category)應用貝葉斯定理求出p(category|document)

判定文章所屬的分類

#-*_coding:utf8-*-

import jieba

from sqlite3 import dbapi2 as sqlite

#將傳入文件分詞,並去除重複和不必要的詞彙。

def getwords(doc):

doc1 = list(jieba.cut(doc))

words =

for s in doc1:

if(len("".join(s))>1):

if(s not in words):

return words

class classifier:

def __init__(self, getfeatures, filename='test1.db'):

#記錄位於各分類中不同特徵值的數量

self.fc = {}

#統計每個分類中的文件數量(即各分類被使用的次數)

self.cc = {}

#從即將被歸類的內容項中提取特徵出來

self.getfeatures = getfeatures

#鏈結資料庫

self.con = sqlite.connect(filename)

self.con.execute('create table if not exists fc(feature,category,count)')

self.con.execute('create table if not exists cc(category,count)')

#增加對特徵/分類組合的計數值

def incf(self,f,cat):

count = self.fcount(f,cat)

if(count==0):

self.con.execute("insert into fc values ('%s','%s',1)" % (f,cat))

else:

self.con.execute("update fc set count=%d where feature='%s' and category='%s'" % (count+1,f,cat))

#增加對某一分類的技術值

def incc(self,cat):

count = self.catcount(cat)

if(count==0):

self.con.execute("insert into cc values ('%s',1)" % (cat))

else:

self.con.execute("update cc set count=%d where category='%s'" % (count+1,cat))

#某一特徵出現於某一分類的的次數

def fcount(self,f,cat):

res = self.con.execute("select count from fc where feature='%s' and category='%s'" % (f,cat)).fetchone()

if(res==none):return 0

else: return float(res[0])

#某一種分類的內容項數量

def catcount(self,cat):

res = self.con.execute("select count from cc where category='%s'" % (cat)).fetchone()

if(res==none):return 0

else:return float(res[0])

#所有內容向的數量

def totalcount(self):

res = self.con.execute("select sum(count) from cc").fetchone()

if(res==none):return 0

return res[0]

#所有分類的列表

def categories(self):

cur = self.con.execute("select category from cc")

return [d[0] for d in cur]

#訓練def train(self,item,cat):

features=self.getfeatures(item)

#針對該分類為每乙個特徵增加計數值

for f in features:

self.incf(f,cat)

#增加針對該分類的計數值

self.incc(cat)

#向資料庫提交資料

self.con.commit()

#計算概率

def fprob(self,f,cat):

if self.catcount(cat)==0: return 0

#特徵在分類總出現的總次數,除以分類中包含內容項的總數

return self.fcount(f,cat)/self.catcount(cat)

#加入概率的權重值

def weightedprob(self,f,cat,prf,weight=1.0,ap=0.5):

#計算當前的概率值

basicprob=prf(f,cat)

#統計特徵在所有分類中出現的次數

totals = sum([self.fcount(f,c) for c in self.categories()])

# print("所有次數:")

# print(totals)

#計算加權平均

bp = ((weight*ap)+(totals*basicprob))/(weight+totals)

return bp

#最終的分類方法

def classify(self,item,default=none):

probs={}

#尋找概率最大的分類

max=0.0

for cat in self.categories():

probs[cat] = self.prob(item,cat)

if probs[cat] > max:

max = probs[cat]

best = cat

return best

#新建乙個classifier的子類

class *****bayes(classifier):

#提取特徵詞,並將所有單詞的概率相乘,以求出整體的概率。p(document|category)

def docprob(self,item,cat):

features = self.getfeatures(item)

#將所有的特徵概率相乘

p=1for f in features:p *= self.weightedprob(f,cat,self.fprob)

return p

#已知p(document|category)應用貝葉斯定理求出p(category|document)

def prob(self,item,cat):

catprob=self.catcount(cat)/self.totalcount()

docprob = self.docprob(item,cat)

return docprob * catprob

呼叫方法:

import docclass

cl = docclass.*****bayes(docclass.getwords)

cl.train('訓練的文章1')

cl.train('訓練的文章2')

cl.train('...')

cl.train('訓練的文章n')

print(cl.classify('待分類的文章', default='unknow'))

ok,以上的**就實現了貝葉斯的分類器,**中用到了jieba分詞模組,sqlite嵌入式資料庫。

matlab 實現貝葉斯分類器

網上有很多文章介紹貝葉斯原理,這裡推薦個鏈結。這裡再說貝葉斯分類器的設計步驟 1.對每個簇的資料求均值mu 和協方差矩陣sigma 2.對測試資料,將其對每個簇用均值和協方差矩陣求相關性。3.將資料分類到相關性大的簇中。分類器函式 bayesclassifer.m function labels b...

貝葉斯分類器

程式設計實現貝葉斯分類器。編寫matlab函式,輸入為 a 均值向量 b c類問題的類分布的協方差矩陣 c c類的先驗概率 d 基於上述類的包含列向量的矩陣x。根據貝葉斯規則,輸出為乙個n維向量,它的第i列表示相應輸入向量x的第i列的類別。clear all clc mu 1 1 sigma 9 4...

貝葉斯分類器

首先在貝葉斯分類器之前先說貝葉斯理論 1 貝葉斯分類器 假設有n種可能的分類標記,即為y ij 是將乙個真實的標記cj的樣本誤分類為ci發損失,後驗概率p ci x 可獲得樣本x分類為ci的期望,則在樣本x上的 條件風險 是 我們需要最小化這個風險,也就是在每個樣本上選擇那個能使條件風險r c x ...