朴素贝叶斯分类器
来源:互联网 发布:淘宝冲洗胶卷 编辑:程序博客网 时间:2024/05/17 01:52
#coding=utf-8from numpy import *def load_data(): #创建样本数据 data=[ ['my','dog','has','flea','problems','help','please'], ['maybe','not','take','him','to','dog','park','stupid'], ['my','dalmation','is','so','cute','I','love','him'], ['stop','posting','stupid','worthless','garbage'], ['mr','licks','ate','my','steak','how','to','stop','him'], ['quit','buying','worthless','dog','food','stupid'] ] labels=[0,1,0,1,0,1]#1 Y 0 N return data,labelsdef create_vocabulary(data): #创建词汇表 vocabulary=set([]) #初始化一个空集 for w in data: vocabulary=vocabulary | set(w) #把数据中各列表进行并集操作 # 符号 ‘|’ type‘set’类型才支持,也就是并集中所有元素都是唯一 的 vocabulary=list(vocabulary) return vocabularydef vocabulary_count(vocabulary,exmaple): #对样本中出现在词汇表中的单词进行计数 return_vec=[0]*len(vocabulary) #在保持列表中元素个数不变的情况下将列表中各元素变为0 for w in exmaple: #遍历例子中的单词 if w in vocabulary: return_vec[vocabulary.index(w)]+=1 #如果单词在词汇表里,则使词汇表中这个位置的0变为出现的次数 else: print 'the word: %s is not in my vocabulary'%w #单词不在词汇表的情况 return return_vec#def create_train(): # """创建训练样本""" # data,labels=load_data() # vocabulary=create_vocabulary(data) # train_matrix=[] #创建一个训练矩阵,这个可以单独拿出来创建 #for a in data: # train_matrix.append(vocabulary_count(vocabulary,a)) #每个样本在词汇表中的出现情况 #return train_matrix,labelsdef train_bayes(train_matrix,train_category): """训练贝叶斯分类器 即根据样本计算出一个适当的概率,当实例满足某一类别的概率 则该实例就属于这一类别""" num_train=len(train_matrix) #有几组训练数据 num_words=len(train_matrix[0]) #这些训练数据所组成的词汇表的单词量 p_abusive=sum(train_category)/float(num_train) #3/6 侮辱性种类和/数据总量 p0_num=ones(num_words) #初始化词汇表,使各项计数为1 ones(32) 防止一个为0乘积全为0的情况 p1_num=ones(num_words) #同上 p0_denom=2.0 p1_denom=2.0 #初始化条件概率的分母 for i in range(num_train): if train_category[i]==1: #判断第i个类别下的语句是不是侮辱性 p1_num+=train_matrix[i] #此语句中所出现的各词汇在词汇表中进行计数 p1_denom+=sum(train_matrix[i]) #对此类型句子的总词数进行统计 else: p0_num+=train_matrix[i] p0_denom+=sum(train_matrix[i]) #同上正常词的累计 p1_vect=log(p1_num/p1_denom) #在侮辱性样本中,各词汇出现的频数/出现的总次数。使用log是为了防止下溢 p0_vect=log(p0_num/p0_denom) #同上正常的 return p0_vect,p1_vect,p_abusive #p1_vect即侮辱性语句中各词汇的频率def bayes_split(train_matrix,p0_vect,p1_vect,p_abusive): """贝叶斯分类器""" p1=sum(train_matrix*p1_vect)+log(p_abusive) #各语句乘以侮辱性概率。 p0=sum(train_matrix*p0_vect)+log(1.0-p_abusive) #各语句乘以正常的概率 if p1>p0: return 1 #概率比较,哪个大就是哪类 else: return 0def test_bayes(): """测试贝叶斯分类器""" data,labels=load_data() vocabulary=create_vocabulary(data) train_matrix=[] #创建一个训练矩阵,这个可以单独拿出来创建 for a in data: train_matrix.append(vocabulary_count(vocabulary,a)) #每个样本在词汇表中的出现情况 p0_vect,p1_vect,p_abusive=train_bayes(train_matrix,labels) result=bayes_split(train_matrix[0],p0_vect,p1_vect,p_abusive) #这步train_matrix是所有样本,单判断某一样本可以写成train_matrix[0] 或 [1]... return result
基本思想就是:
给定各类别一个概率,用样本乘以概率哪个大就是哪个类别。
样本 a 下各元素在样本总数下的概率分布为[x,0,y,0],其类别是Y。
样本 b 下各元素在样本总数下的概率分布为[0,0,m,n],其类别是N。
上面就是训练得到的结果。下面判断实例 c 属于哪一类,就是以 c 的分布频数分别乘以两个类别的概率,哪个概率大就是哪个类别。
0 0
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- 朴素贝叶斯分类器
- CocoaPods 基础知识--------安装 及 使用第三方库
- iOS 开发第三方库全集
- 使用原生HTML5上传文件
- 收集各种 iOS App 开发可以用到的代码示例
- 纯原生闭包轮播图
- 朴素贝叶斯分类器
- 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
- 正则表达式算法实现
- 路由器开发(一)—— 路由器硬件结构及软件体系
- js中index()的四种经典用法
- Hive的数据类型解析和表的操作实例
- 路由器开发(二)—— 路由器工作原理
- NFC读取数据
- VRP平台总体介绍及基础配置