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

本文涉及的产品
函数计算FC,每月15万CU 3个月
简介:
# -*- 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
        
        
        
相关实践学习
【文生图】一键部署Stable Diffusion基于函数计算
本实验教你如何在函数计算FC上从零开始部署Stable Diffusion来进行AI绘画创作,开启AIGC盲盒。函数计算提供一定的免费额度供用户使用。本实验答疑钉钉群:29290019867
建立 Serverless 思维
本课程包括: Serverless 应用引擎的概念, 为开发者带来的实际价值, 以及让您了解常见的 Serverless 架构模式
相关文章
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
137 4
|
2天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
34 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
18天前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
41 2
|
1月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于贝叶斯优化CNN-GRU网络的数据分类识别算法matlab仿真
本项目展示了使用MATLAB2022a实现的贝叶斯优化、CNN和GRU算法优化效果。优化前后对比显著,完整代码附带中文注释及操作视频。贝叶斯优化适用于黑盒函数,CNN用于时间序列特征提取,GRU改进了RNN的长序列处理能力。
|
2月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
52 1
|
2月前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
2月前
|
机器学习/深度学习 算法
深入探索机器学习中的决策树算法
深入探索机器学习中的决策树算法
43 0
|
2月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
41 0
|
2月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
108 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024