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

本文涉及的产品
函数计算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中实现该算法,最后讨论了其优缺点及应用场景。
141 4
|
4天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
45 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
20天前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
42 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
|
13天前
|
机器学习/深度学习 算法
基于改进遗传优化的BP神经网络金融序列预测算法matlab仿真
本项目基于改进遗传优化的BP神经网络进行金融序列预测,使用MATLAB2022A实现。通过对比BP神经网络、遗传优化BP神经网络及改进遗传优化BP神经网络,展示了三者的误差和预测曲线差异。核心程序结合遗传算法(GA)与BP神经网络,利用GA优化BP网络的初始权重和阈值,提高预测精度。GA通过选择、交叉、变异操作迭代优化,防止局部收敛,增强模型对金融市场复杂性和不确定性的适应能力。
146 80
|
1天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真