樸素貝葉斯演算法Python實現

2021-07-11 09:13:18 字數 3044 閱讀 6916

# -*- coding: cp936 -*-

#樸素貝葉斯分類器的實現

#執行#reload(docclass)

#c1=docclass.*****bayes(docclass.getwords)

#docclass.sampletrain(c1)

#c1.classify('quick rabbit',default='unknown')

#構建訓練樣本

def sampletrain(c1):

c1.train('nobody owns the water.','good')

c1.train('the quick rabbit jumps fences','good')

c1.train('buy pharmaceuticals now','bad')

c1.train('make quick money at the online casino','bad')

c1.train('the quick brown fox jumps','good')

import re

import math

#從文字中提取特徵

def getwords(doc):

splitter=re.compile('\\w*')

#根據非字母字典進行單詞拆分

words=[s.lower() for s in splitter.split(doc) if len(s)>2 and len(s)<20]

#只返回一組不重複的單詞

return dict([(w,1) for w in words])

#分類器

class classifier:

def __init__(self,getfeatures):

self.fc={}

self.cc={}

self.getfeatures=getfeatures

#classifier.__init__(self,getfeatures)

self.thresholds={}

def setthreshold(self,cat,t):

self.thresholds[cat]=t

def getthreshold(self,cat):

if cat not in self.thresholds:

return 1.0

return self.thresholds[cat]

def incf(self,f,cat):

self.fc.setdefault(f,{})

self.fc[f].setdefault(cat,0)

self.fc[f][cat]+=1

def incc(self,cat):

self.cc.setdefault(cat,0)

self.cc[cat]+=1

def fcount(self,f,cat):

if f in self.fc and cat in self.fc[f]:

return float(self.fc[f][cat])

return 0.0

def catcount(self,cat):

if cat in self.cc:

return float(self.cc[cat])

return 0

def totalcount(self):

return sum(self.cc.values())

def categories(self):

return self.cc.keys()

def train(self,item,cat):

features=self.getfeatures(item)

for f in features:

self.incf(f,cat)

self.incc(cat)

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()])

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

for cat in probs:

if cat==best:

continue

if probs[cat]*self.getthreshold(best)>probs[best]:

return default

return best

class *****bayes(classifier):

def docprob(self,item,cat):

features=self.getfeatures(item)

p=1for f in features:

p*=self.weightedprob(f,cat,self.fprob)

return p

def prob(self,item,cat):

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

docprob=self.docprob(item,cat)

return docprob*catprob

python實現樸素貝葉斯演算法

貝葉斯公式 換種說法 詳細參考文章樸素貝葉斯例題分析 也就是引數為1時的貝葉斯估計,當某個分量在總樣本某個分類中 觀察樣本庫 訓練集 從沒出現過,會導致整個例項的計算結果為0。為了解決這個問題,使用拉普拉斯平滑 加1平滑進行處理。它的思想非常簡單,就是對先驗概率的分子 劃分的計數 加1,分母加上類別...

樸素貝葉斯演算法python

樸素貝葉斯演算法的工作原理主要是概率論和數理統計 通過屬性對分類的影響程度,所展現不同的結果 import numpy as np x np.array 0,1,0,1 1,1,1,0 0,1,1,0 0,0,0,1 0,1,1,0 0,1,0,1 1,0,0,1 y np.array 0,1,1,...

樸素貝葉斯演算法的python實現

樸素貝葉斯 比如我們想判斷乙個郵件是不是垃圾郵件,那麼我們知道的是這個郵件中的詞的分布,那麼我們還要知道 垃圾郵件中某些詞的出現是多少,就可以利用貝葉斯定理得到。樸素貝葉斯分類器中的乙個假設是 每個特徵同等重要 loaddataset createvocablist dataset setofwor...