简单的贝叶斯分类器的python实现

  1 # -*- coding: utf-8 -*-
  2 ‘‘‘
  3 >>> c = Classy()
  4 >>> c.train([‘cpu‘, ‘RAM‘, ‘ALU‘, ‘io‘, ‘bridge‘, ‘disk‘], ‘architecture‘)
  5 True
  6 >>> c.train([‘monitor‘, ‘mouse‘, ‘keyboard‘, ‘microphone‘, ‘headphones‘], ‘input_devices‘)
  7 True
  8 >>> c.train([‘desk‘, ‘chair‘, ‘cabinet‘, ‘lamp‘], ‘office furniture‘)
  9 True
 10 >>> my_office = [‘cpu‘, ‘monitor‘, ‘mouse‘, ‘chair‘]
 11 >>> c.classify(my_office)
 12 (‘input_devices‘, -1.0986122886681098)
 13 ...
 14 >>> c = Classy()
 15 >>> c.train([‘cpu‘, ‘RAM‘, ‘ALU‘, ‘io‘, ‘bridge‘, ‘disk‘], ‘architecture‘)
 16 True
 17 >>> c.train([‘monitor‘, ‘mouse‘, ‘keyboard‘, ‘microphone‘, ‘headphones‘], ‘input_devices‘)
 18 True
 19 >>> c.train([‘desk‘, ‘chair‘, ‘cabinet‘, ‘lamp‘], ‘office furniture‘)
 20 True
 21 >>> my_office = [‘cpu‘, ‘monitor‘, ‘mouse‘, ‘chair‘]
 22 >>> c.classify(my_office)
 23 (‘input_devices‘, -1.0986122886681098)
 24 ...
 25 ‘‘‘
 26
 27 from collections import Counter
 28 import math
 29
 30 class ClassifierNotTrainedException(Exception):
 31
 32     def __str__(self):
 33         return "Classifier is not trained."
 34
 35 class Classy(object):
 36
 37     def __init__(self):
 38         self.term_count_store = {}
 39         self.data = {
 40             ‘class_term_count‘: {},
 41             ‘beta_priors‘: {},
 42             ‘class_doc_count‘: {},
 43         }
 44         self.total_term_count = 0
 45         self.total_doc_count = 0
 46
 47     def train(self, document_source, class_id):
 48
 49         ‘‘‘
 50         Trains the classifier.
 51
 52         ‘‘‘
 53         count = Counter(document_source)
 54         try:
 55             self.term_count_store[class_id]
 56         except KeyError:
 57             self.term_count_store[class_id] = {}
 58         for term in count:
 59             try:
 60                 self.term_count_store[class_id][term] += count[term]
 61             except KeyError:
 62                 self.term_count_store[class_id][term] = count[term]
 63         try:
 64             self.data[‘class_term_count‘][class_id] += document_source.__len__()
 65         except KeyError:
 66             self.data[‘class_term_count‘][class_id] = document_source.__len__()
 67         try:
 68             self.data[‘class_doc_count‘][class_id] += 1
 69         except KeyError:
 70             self.data[‘class_doc_count‘][class_id] = 1
 71         self.total_term_count += document_source.__len__()
 72         self.total_doc_count += 1
 73         self.compute_beta_priors()
 74         return True
 75
 76     def classify(self, document_input):
 77         if not self.total_doc_count: raise ClassifierNotTrainedException()
 78
 79         term_freq_matrix = Counter(document_input)
 80         arg_max_matrix = []
 81         for class_id in self.data[‘class_doc_count‘]:
 82             summation = 0
 83             for term in document_input:
 84                 try:
 85                     conditional_probability = (self.term_count_store[class_id][term] + 1)
 86                     conditional_probability = conditional_probability / (self.data[‘class_term_count‘][class_id] + self.total_doc_count)
 87                     summation += term_freq_matrix[term] * math.log(conditional_probability)
 88                 except KeyError:
 89                     break
 90             arg_max = summation + self.data[‘beta_priors‘][class_id]
 91             arg_max_matrix.insert(0, (class_id, arg_max))
 92         arg_max_matrix.sort(key=lambda x:x[1])
 93         return (arg_max_matrix[-1][0], arg_max_matrix[-1][1])
 94
 95     def compute_beta_priors(self):
 96         if not self.total_doc_count: raise ClassifierNotTrainedException()
 97
 98         for class_id in self.data[‘class_doc_count‘]:
 99             tmp = self.data[‘class_doc_count‘][class_id] / self.total_doc_count
100             self.data[‘beta_priors‘][class_id] = math.log(tmp)
时间: 2024-10-05 06:12:08

简单的贝叶斯分类器的python实现的相关文章

朴素贝叶斯分类器及Python实现

贝叶斯定理 贝叶斯定理是通过对观测值概率分布的主观判断(即先验概率)进行修正的定理,在概率论中具有重要地位. 先验概率分布(边缘概率)是指基于主观判断而非样本分布的概率分布,后验概率(条件概率)是根据样本分布和未知参数的先验概率分布求得的条件概率分布. 贝叶斯公式: P(A∩B) = P(A)*P(B|A) = P(B)*P(A|B) 变形得: P(A|B)=P(B|A)*P(A)/P(B) 其中 P(A)是A的先验概率或边缘概率,称作"先验"是因为它不考虑B因素. P(A|B)是已知

【原创】.NET平台机器学习组件-Infer.NET连载(二)简单贝叶斯分类器的例子—【附源码和自制帮助文档】

Infer.NET机器学习翻译系列文章将进行连载,感兴趣的朋友请收藏或关注 你还可以参考本博客其他.NET开源项目的相关文章: [原创]彩票预测算法:离散型马尔可夫链模型          Newlife XCode组件资源目录汇总[2013年版] [原创]开源.NET下的XML数据库介绍及入门          [原创].NET开源压缩组件介绍与入门 [开源].NET开源表达式计算组件介绍与使用          [原创]开源Word读写组件DocX介绍与入门 [原创]Matlab.NET混编

Python之简单理解装饰器(1)

装饰器是Python高级应用的一部分,其应用也很广泛.网上对其介绍和讲解也是五花八门,我在这里就对其进行简单介绍,并对如何渐进理解使用装饰器进行说明,以便和大家共同学习.如有更高见解,也请大家留言指正. 装饰器概念简单理解 循序渐进装饰器 装饰器概念简单理解 装饰器按照我的理解,就是在不改变原有函数代码的情况下,对原有函数进行功能的扩展. 这里先写个简单的装饰器,给大家有个概念性的认识. def anotherone(func):  #定义装饰器     def inner():        

【机器学习算法-python实现】扫黄神器-朴素贝叶斯分类器的实现

(转载请注明出处:http://blog.csdn.net/buptgshengod) 1.背景 以前我在外面公司实习的时候,一个大神跟我说过,学计算机就是要一个一个贝叶斯公式的套用来套用去.嗯,现在终于用到了.朴素贝叶斯分类器据说是好多扫黄软件使用的算法,贝叶斯公式也比较简单,大学做概率题经常会用到.核心思想就是找出特征值对结果影响概率最大的项.公式如下: 什么是朴素贝叶斯,就是特征值相互独立互不影响的情况.贝叶斯可以有很多变形,这里先搞一个简单的,以后遇到复杂的再写. 2.数据集 摘自机器学

机器学习之路: python 朴素贝叶斯分类器 预测新闻类别

使用python3 学习朴素贝叶斯分类api 设计到字符串提取特征向量 欢迎来到我的git下载源代码: https://github.com/linyi0604/kaggle 1 from sklearn.datasets import fetch_20newsgroups 2 from sklearn.cross_validation import train_test_split 3 # 导入文本特征向量转化模块 4 from sklearn.feature_extraction.text

PGM学习之三 朴素贝叶斯分类器(Naive Bayes Classifier)

介绍朴素贝叶斯分类器的文章已经很多了.本文的目的是通过基本概念和微小实例的复述,巩固对于朴素贝叶斯分类器的理解. 一 朴素贝叶斯分类器基础回顾 朴素贝叶斯分类器基于贝叶斯定义,特别适用于输入数据维数较高的情况.虽然朴素贝叶斯分类器很简单,但是它确经常比一些复杂的方法表现还好. 为了简单阐述贝叶斯分类的基本原理,我们使用上图所示的例子来说明.作为先验,我们知道一个球要么是红球要么是绿球.我们的任务是当有新的输入(New Cases)时,我们给出新输入的物体的类别(红或者绿).这是贝叶斯分类器的典型

使用NLTK的朴素贝叶斯分类器来训练并完成分类工作

NLTK是Python的一个自然语言处理的模块,其中实现了朴素贝叶斯分类算法.以下,就使用上一篇文中提到的数据,来应用这个模块实现朴素贝叶斯分类.NLTK的实现更加泛化,所以在应用到我们的数据上时需要做一点的转化. 首先来看一下NLTK官方文档中给出的一个简单明了的例子,在了解这个例子之后,再设法将同样的模型应用到自己的数据集上.官方给出的例子是英文名中,在知道名字中最后一个字母后,判断这个名字对应的人是男是女. #coding=utf-8 import random, nltk from nl

从朴素贝叶斯分类器到贝叶斯网络(下)

书接上文 :从朴素贝叶斯分类器到贝叶斯网络(上) 三.贝叶斯网络 贝叶斯网络(Bayesian Network)是一种用于表示变量间依赖关系的数据结构.有时它又被称为信念网络(Belief Network)或概率网络(Probability Network).在统计学习领域.概率图模型(PGM,Probabilistic Graphical Models)经常使用来指代包括贝叶斯网络在内的更加宽泛的一类机器学习模型.比如隐马尔可夫模型(HMM,Hidden Markov Model)也是一种PG

数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes

贝叶斯分类器 贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类.眼下研究较多的贝叶斯分类器主要有四种,各自是:Naive Bayes.TAN.BAN和GBN. 贝叶斯网络是一个带有概率凝视的有向无环图,图中的每个结点均表示一个随机变量,图中两结点 间若存在着一条弧,则表示这两结点相相应的随机变量是概率相依的,反之则说明这两个随机变量是条件独立的.网络中随意一个结点X 均有一个对应的条件概率表(Con