机器学习--贝叶斯算法实现

小编 2026-06-04 阅读:1258 评论:0
# -*- coding: UTF-8 -*-import reimport mathfrom...
# -*- coding: UTF-8 -*-

import re
import math
from bokeh.charts.attributes import cat
from nltk.corpus.reader.reviews import FEATURES


def getwords(doc):
    splitter=re.compile('\W*') 
    #将句子分成单词,然后生成一个列表、
    words = [s.lower() for s in splitter.split(doc) if len(s)>2 and len(s)<20]
    
    #只返回一组不重复的单词,该字典以w为key,以1为value,此时,就算重复的单词,也不会多保留,因为key只有一个  
    return dict([(w,1) for w in words])

    

class classfilter:
    def __init__(self,getfeatures,filename=None):
        #统计特征(例子中的单词)和分类(是否是垃圾邮件)的组合数量
        self.fc={}
         #一个纪录各分类被使用次数的字典,也这个分类中有多少多少文档 
        self.cc={}
        #从内容出提取特征,在例子中就是getwords函数  
        self.getfeatures = getfeatures
        
    #对特征和分类变量(self.fc)的改变  
    #f代表feature,本例中的单词,cat是类型  good 还是bad  
    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
    
    #属于某一个分类的内容项的数量 
    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)
#         print features
         #我们就把每一个特征(单词)在响应的特征里面增加一次
        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 wightedprob(self,f,cat,prf,weight=1.0,ap=0.5):
        #计算当前的概率值,就是计算没有初始假设概率的影响下,只有训练文档的数据产生出来的概率
        basicprob = prf(f,cat)
#         print(basicprob)
        totals = sum([self.fcount(f,c) for c in self.categories()])
#         print(totals)
        bp = ((weight*ap)+(totals*basicprob))/(weight+totals)
        return bp

            
#写一个训练的代码,训练一些样本数据  
def sampletrain(cl):  
    cl.train('Nobody owns the water.','good')  
    cl.train('the quick rabbit jumps fences','good')  
    cl.train('buy pharmaceuticals now','bad')  
    cl.train('make quick money at the online casino','bad')  
    cl.train('the quick brown fox junmps','good')

cl = classfilter(getwords)  
sampletrain(cl)
print cl.fc
print cl.cc
print cl.fcount('quick','good'),cl.fcount('the','bad')   

# quick  在good 分类语句中 出现了2次,good 分类语句一共有3句, 故概率是 fcount/catcount
print cl.fprob('quick', 'good') 

print cl.fprob('money', 'good')  # money 没有出现在good分类中,结果是0 太过于偏激

# print '训练样本执行一次的Pr(money|good):%f'%(cl.wightedprob('money','good',cl.fprob))
# sampletrain(cl)  
# print '训练样本执行二次的Pr(money|good):%f'%(cl.wightedprob('money','good',cl.fprob))        

#朴素贝叶斯分类器,之所以称为其为朴素,是因为:它假设将要被组合的各个单词的概率是彼此独立的
#为了学好朴素贝叶斯分类器,我们首先要计算一个概率:新文档属于给定分类的概率。就是说,来了个新文档,我想知道其属于bad的概率
#简单理解朴素贝叶斯原理  P(AB) = P(B)*P(A|B) >= P(A|B) = P(AB)/P(B)
# 又 P(B|A) = P(AB)/P(A) >= P(A|B) = (P(B|A)*P(A))/P(B)
# 即  P(good|money) = (P(money|good)*P(good))/P(money)
# 求出现money 这一词的邮件是正常邮件的概率, 可以分为两个事件,1,选择出现money这一词的邮件。 2 选择正常邮件‘good’这一分类

class naivebayes(classfilter):
    # P(B|A)
    def docprob(self,item,cat):
        features = self.getfeatures(item)
        
        p=1
        for f in features:
            p*=self.wightedprob(f, cat, self.fprob)
        return p
    
    def prob(self,item,cat):
        #p(good)
        catprob = self.catcount(cat)/self.totalcount()
        #p(money|good)
        docprob = self.docprob(item, cat)
        #p(money|good)*P(good)/P(money)
        return docprob*catprob
        
        
        
版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表