简单的贝叶斯分类器的python实现
# -*- coding: utf-8 -*-
'''
>>> c = Classy()
>>> c.train(['cpu', 'RAM', 'ALU', 'io', 'bridge', 'disk'], 'architecture')
True
>>> c.train(['monitor', 'mouse', 'keyboard', 'microphone', 'headphones'], 'input_devices')
True
>>> c.train(['desk', 'chair', 'cabinet', 'lamp'], 'office furniture')
True
>>> my_office = ['cpu', 'monitor', 'mouse', 'chair']
>>> c.classify(my_office)
('input_devices', -1.0986122886681098)
...
>>> c = Classy()
>>> c.train(['cpu', 'RAM', 'ALU', 'io', 'bridge', 'disk'], 'architecture')
True
>>> c.train(['monitor', 'mouse', 'keyboard', 'microphone', 'headphones'], 'input_devices')
True
>>> c.train(['desk', 'chair', 'cabinet', 'lamp'], 'office furniture')
True
>>> my_office = ['cpu', 'monitor', 'mouse', 'chair']
>>> c.classify(my_office)
('input_devices', -1.0986122886681098)
...
''' from collections import Counter
import math class ClassifierNotTrainedException(Exception): def __str__(self):
return "Classifier is not trained." class Classy(object): def __init__(self):
self.term_count_store = {}
self.data = {
'class_term_count': {},
'beta_priors': {},
'class_doc_count': {},
}
self.total_term_count = 0
self.total_doc_count = 0 def train(self, document_source, class_id): '''
Trains the classifier. '''
count = Counter(document_source)
try:
self.term_count_store[class_id]
except KeyError:
self.term_count_store[class_id] = {}
for term in count:
try:
self.term_count_store[class_id][term] += count[term]
except KeyError:
self.term_count_store[class_id][term] = count[term]
try:
self.data['class_term_count'][class_id] += document_source.__len__()
except KeyError:
self.data['class_term_count'][class_id] = document_source.__len__()
try:
self.data['class_doc_count'][class_id] += 1
except KeyError:
self.data['class_doc_count'][class_id] = 1
self.total_term_count += document_source.__len__()
self.total_doc_count += 1
self.compute_beta_priors()
return True def classify(self, document_input):
if not self.total_doc_count: raise ClassifierNotTrainedException() term_freq_matrix = Counter(document_input)
arg_max_matrix = []
for class_id in self.data['class_doc_count']:
summation = 0
for term in document_input:
try:
conditional_probability = (self.term_count_store[class_id][term] + 1)
conditional_probability = conditional_probability / (self.data['class_term_count'][class_id] + self.total_doc_count)
summation += term_freq_matrix[term] * math.log(conditional_probability)
except KeyError:
break
arg_max = summation + self.data['beta_priors'][class_id]
arg_max_matrix.insert(0, (class_id, arg_max))
arg_max_matrix.sort(key=lambda x:x[1])
return (arg_max_matrix[-1][0], arg_max_matrix[-1][1]) def compute_beta_priors(self):
if not self.total_doc_count: raise ClassifierNotTrainedException() for class_id in self.data['class_doc_count']:
tmp = self.data['class_doc_count'][class_id] / self.total_doc_count
self.data['beta_priors'][class_id] = math.log(tmp)
简单的贝叶斯分类器的python实现的更多相关文章
- 朴素贝叶斯分类器及Python实现
贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布,后验概率(条件概率)是根据 ...
- (数据科学学习手札30)朴素贝叶斯分类器的原理详解&Python与R实现
一.简介 要介绍朴素贝叶斯(naive bayes)分类器,就不得不先介绍贝叶斯决策论的相关理论: 贝叶斯决策论(bayesian decision theory)是概率框架下实施决策的基本方法.对分 ...
- python使用tcp实现一个简单的下载器
上一篇中介绍了tcp的流程,本篇通过写一个简单的文件下载器程序来巩固之前学的知识. 文件下载器的流程如下: 客户端: 输入目标服务器的ip和port 输入要下载文件的名称 从服务器下载文件保存到本地 ...
- 机器学习之路: python 朴素贝叶斯分类器 MultinomialNB 预测新闻类别
使用python3 学习朴素贝叶斯分类api 设计到字符串提取特征向量 欢迎来到我的git下载源代码: https://github.com/linyi0604/MachineLearning fro ...
- 用scikit-learn实现朴素贝叶斯分类器 转
原文:http://segmentfault.com/a/1190000002472791 朴素贝叶斯(Naive Bayes Classifier)是一种「天真」的算法(假定所有特征发生概率是独立的 ...
- 数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes
贝叶斯分类器 贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类.眼下研究较多的贝叶斯分类器主要有四种, ...
- 十大经典数据挖掘算法(9) 朴素贝叶斯分类器 Naive Bayes
贝叶斯分类器 贝叶斯分类分类原则是一个对象的通过先验概率.贝叶斯后验概率公式后计算,也就是说,该对象属于一类的概率.选择具有最大后验概率的类作为对象的类属.现在更多的研究贝叶斯分类器,有四个,每间:N ...
- 机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)
朴素贝叶斯分类器是一组简单快速的分类算法.网上已经有很多文章介绍,比如这篇写得比较好:https://blog.csdn.net/sinat_36246371/article/details/6014 ...
- 朴素贝叶斯分类器(Naive Bayes)
1. 贝叶斯定理 如果有两个事件,事件A和事件B.已知事件A发生的概率为p(A),事件B发生的概率为P(B),事件A发生的前提下.事件B发生的概率为p(B|A),事件B发生的前提下.事件A发生的概率为 ...
随机推荐
- hdfs操作手册
hdfscli 命令行 # hdfscli --help HdfsCLI: a command line interface for HDFS. Usage: hdfscli [interactive ...
- php数据结构之二叉树
树是一种比较重要的数据结构, 尤其是二叉树.二叉树是一种特殊的树,在二叉树中每个节点最多有两个子节点,一般称为左子节点和右子节点(或左孩子和右孩子),并且二叉树的子树有左右之 分,其次序不能任意颠倒. ...
- APUE 12.7 取消选项
- GNSS基础(持续更新)
1.整周模糊度成功率 可参考文献:GNSS整周模糊度概率特性 2.正太分布 见百度百科 https://baike.baidu.com/item/%E6%AD%A3%E6%80%81%E5%88%86 ...
- windows下python 正确安装词云包wordcloud的方法
安装wordcloud的时候果然还是出现了问题,试了网上说的好多办法,最后找到了一种成功率高的,可以优先尝试一下 下载.whl文件http://www.lfd.uci.edu/~gohlke/pyth ...
- Spring 源代码阅读之声明式事务
事务控制流程 例如对如下代码进行事务控制 class service1{ method1(){ method2(); } } class service2{ method2(); } 原理:建立一个m ...
- 关于Oracle11g R2的学习笔记
进来由于工作需要开始有SQLServer向Oracle转型学习,想把学习写到这里作为记录和备忘. Oracle 11g R2下面都简称:Oracle 第一:Oracle的安装 在安装过程没有 ...
- postGresql关键字字段重名
在postGresql中如果关键字和自定义的字段重名 即使使用[ ](中括号)或者 ' '(单引号)都没有用,经本人实验. 如果使用" "(双引号),则可以.
- 洛谷 P1251 餐巾计划问题(线性规划网络优化)【费用流】
(题外话:心塞...大部分时间都在debug,拆点忘记加N,总边数算错,数据类型标错,字母写错......) 题目链接:https://www.luogu.org/problemnew/show/P1 ...
- cocos2d-x发生undefined reference to `XX'异常 一劳永逸解决的方法
转自:http://www.myexception.cn/operating-system/1620542.html cocos2d-x发生undefined reference to `XX'错误 ...