简单的贝叶斯分类器的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-08-01 13:18:20

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

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

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

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

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

朴素贝叶斯分类器的应用

生活中很多场合需要用到分类,比如新闻分类.病人分类等等. 本文介绍朴素贝叶斯分类器(Naive Bayes classifier),它是一种简单有效的常用分类算法. 一.病人分类的例子 让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难. 某个医院早上收了六个门诊病人,如下表. 症状 职业 疾病 打喷嚏 护士 感冒 打喷嚏 农夫 过敏 头痛 建筑工人 脑震荡 头痛 建筑工人 感冒 打喷嚏 教师 感冒 头痛 教师 脑震荡 现在又来了第七个病人,是一个打喷嚏的建筑工人.请问他患上感冒的概

Photoshop制作简单音乐播放器

教程的效果图制作的非常小巧,很适合用到一些可以播放音乐的网页中.制作方法也比较简单,播放器的每一个部件基本上都是用图层样式来表现立体及浮雕效果,只要注意好图形的层次关系,我们就可以分层来完成效果图. 最终效果 1.第一步是我们创建一个黑色径向渐变的背景.在任何颜色的油漆层,添加一个如下所示的渐变图层样式. 2.用圆角矩形工具(设置一个半径为20像素)创建一个该设备的主要元素,表现设备的形状图层(点击菜单上的第一选择).分类: PS图片处理

快速构建Windows 8风格应用21-构建简单媒体播放器

原文:快速构建Windows 8风格应用21-构建简单媒体播放器 本篇博文主要介绍如何构建一个简单的媒体播放器. <快速构建Windows 8风格应用20-MediaElement>博文中提到了如何使用MediaElement对象进行播放视频的简单功能,但是在实际应用中需要更复杂的功能,例如:控制视频播放的控件.全屏模式.进度条等等其他功能. 本篇博文中示例使用应用程序中包含的媒体文件,当然我们也可以通过网络或者本地[使用FileOpenPicker]进行加载某一媒体文件. MSDN中关于媒体

opencv贝叶斯分类器问题~~~~~~~~

问题描述 opencv贝叶斯分类器问题~~~~~~~~ 想用opencv写贝叶斯分类器,但是却出现cv::NormalBayesClassifier' is an abstract class 语句 cv::ml::NormalBayesClassifier nbc; 不知道有没有人知道 解决方案 http://blog.sina.com.cn/s/blog_77ed43e30101adkk.html 解决方案二: 这应该是你构造类的方式不对,不能这样初始化

protracer 2.0发布 简单的光线跟踪器

Protracer是一个简单的光线跟踪器,最初编写于1999年作为大学课程项目.Protracer该名称是一个音乐跟踪应用程序的双关语.当前版本支持POV-Ray文件格式的有限子集. protracer 2.0该版本采用C++++重编. 下载地址:http://cloud.github.com/downloads/mlundblad/protracer/protracer-2.0.tar.bz2

protracer 2.2发布 简单的光线跟踪器

Protracer 是一款简单的光线跟踪器,最初编写于1999年作为大学课程项目.Protracer该名称是一个音乐跟踪应用程序的双关语.当前版本支持POV-Ray文件格式的有限子集. protracer 2.2该版本支持一些使用POV-Ray的语法声明变量. 软件信息:https://github.com/mlundblad/protracer/ 下载地址:https://github.com/downloads/mlundblad/protracer/protracer-2.2.tar.bz

关于朴素贝叶斯分类器的问题

问题描述 关于朴素贝叶斯分类器的问题 朴素贝叶斯假设了各属性间的相互独立,如果对训练集中的每条记录,出现如: (年,月,日)->星期几 的这种不相互独立的情况,有没有什么解决方案可以配合朴素贝叶斯进行分类?