咱这个项目最主要的就是这个了

贝叶斯分类器用于做可以统计概率的二元分类

典型的例子就是垃圾邮件过滤

理论基础

对于贝叶斯算法,这里附上两个链接,便于理解:

朴素贝叶斯分类器的应用-阮一峰的网络日志

基于朴素贝叶斯到中文垃圾邮件分类器

朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别?-知乎

这里我们用朴素贝叶斯分类,假设所有特征都彼此独立,贝叶斯公式是这样

\[P(A|B)=\frac{P(B|A)P(A)}{P(B)}=\frac{P(B|A)P(A)}{P(B|A)+P(B|\bar{A})}
\]

现在我们收到一封邮件,假设T为此邮件为垃圾邮件,Wn为第N个词的存在

$ P(T|W_{n}) $的意思是在第n个词的存在下,这封邮件为垃圾邮件的概率

那么垃圾邮件和正常邮件的概率比就是这样的

\[\frac{P(T)}{P(\bar{T})}=\frac{P_{prior}(T)}{P_{prior}(\bar{T})} \prod{\frac{P(W_{n}|T)}{P(W_{n}|\bar{T})}}
\]

代码实现

class BeyasFilter:
# 0-ham 1-spam
def __init__(self):
self.count=[0, 0]
self.prior=1
self.freq={} def train(self, words, label):
# label: 0-ham 1-spam
for word in words:
self.count[label]+=1
if word not in self.freq:
self.freq[word]=[0, 0]
self.freq[word][label]+=1 def isspam(self, content):
pred=self.prior
words=self.segment(content)
for word in words:
if self.freq.get(word) and self.freq[word][1]!=0 and self.freq[word][0]!=0:
pred*=(self.freq[word][1]*self.count[0])/(self.freq[word][0]*self.count[1])
return True if pred>1 else False

做一个小小的优化

  • 在贝叶斯决策时,若发现某一个词汇并没有在训练字典中出现,我们使用拉普拉斯平滑(Laplace Smoothing)对其进行处理。

    原理即是设定一个很小的值作为其后验概率。这样做保证在处理新词时,不会让后验概率乘零,也不会让后验概率乘壹而放过这个信息。及决策变为:

  • 在处理较短的句子时,贝叶斯分类器很可能造成误判,比如消息“欢迎”。“欢迎”经常出现在重要消息中。但是这样一个短句独立的出现时,我们一般认为其是垃圾信息(因为不是重要信息)。通过贝叶斯决策理论发现我们难以处理这样的情况,所以我们对此作出优化。我们认为先验概率应包含句子长度的概率密度,最终优化效果令人满意。通过核概率密度估计,对句子长度做出统计,并在计算后验概率之后乘以这个调节函数,即可对短句作出优化。

    具体的先验概率函数设计是这样的:

    a. 首先对句子长度做出统计、平滑,得到下表。其中橙线为垃圾信息句子长度的概率密度,蓝线为重要信息句子长度的概率密度:



    b. 结合图表,我们发现句子长度在垃圾信息和重要信息下的有较大分布差异

    c. 设计一个函数,这个函数返回当前句子长度在垃圾信息和在重要信息中的概率比

    d. 最终设计出函数:

2018-02-28 Update: 修改一个关于先验概率的默认取值的错误

2018-08-02 Update: 写的什么垃圾,发现忘了更新这篇。优化部分用文档重写了

记intel杯比赛中各种bug与debug【其五】:朴素贝叶斯分类器的实现和针对性的优化的更多相关文章

  1. 记intel杯比赛中各种bug与debug【其一】:安装intel caffe

    因为intel杯创新软件比赛过程中,并没有任何记录.现在用一点时间把全过程重演一次用作记录. 学习 pytorch 一段时间后,intel比赛突然不让用 pytoch 了,于是打算转战intel ca ...

  2. 记intel杯比赛中各种bug与debug【其二】:intel caffe的使用和大坑

    放弃使用pytorch,学习caffe 本文仅记录个人观点,不免存在许多错误 Caffe 学习 caffe模型生成需要如下步骤 编写network.prototxt 编写solver.prototxt ...

  3. 记intel杯比赛中各种bug与debug【其四】:基于长短时记忆神经网络的中文分词的实现

    (标题长一点就能让外行人感觉到高大上) 直接切入主题好了,这个比赛还必须一个神经网络才可以 所以我们结合主题,打算写一个神经网络的中文分词 这里主要写一下数据的收集和处理,网络的设计,代码的编写和模型 ...

  4. 记intel杯比赛中各种bug与debug【其三】:intel chainer的安装与使用

    现在在训练模型,闲着来写一篇 顺着这篇文章,顺利安装上intel chainer 再次感谢 大黄老鼠 intel chainer 使用 头一次使用chainer,本以为又入了一个大坑,实际尝试感觉非常 ...

  5. SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理

    原文:SQL Server 字段类型 decimal(18,6)小数点前是几位?记一次数据库SP的BUG处理 SQL Server 字段类型 decimal(18,6)小数点前是几位? 不可否认,这是 ...

  6. 那些盒模型在IE6中的BUG们,工程狮的你可曾遇到过?

    HTML5学堂 那些盒模型在IE6中的BUG们,工程狮的你可曾遇到过? IE6已经渐渐的开始退出浏览器的历史舞台.虽然当年IE6作为微软的一款利器击败网景,但之后也因为版本的持续不更新而被火狐和谷歌三 ...

  7. 转:移动开发中一些bug及解决方案

    网页开发要面对各种各样的浏览器,让人很头疼,而移动开发中,你不但要面对浏览器,还要面对各种版本的手机,iOS好一点,而安卓就五花八门了,你可能在开发中也被它们折磨过,或者正在被它们折磨,我在这里说几个 ...

  8. 写代码的心得,怎么减少编程中的 bug?

    遭遇 bug 的时候,理性的程序员会说:这个 bug 能复现吗? 自负型:这不可能,在我这是好好的. 经验型:不应该,以前怎么没问题? 幻想型:可能是数据有问题. 无辜型:我好几个星期都没碰这块代码了 ...

  9. 新手数据比赛中数据处理方法小结(python)

    第一次参加,天池大数据竞赛(血糖预测),初赛排名1%.因为自己对python不熟悉,所以记录一下在比赛中用到的一些python方法的使用(比较基础细节,大佬绕道): 1.数据初探 data.info( ...

随机推荐

  1. C++线程传参数

    struct TThreadParam { LPVOID pThis; int visionIndex; }; class CMilTestDlg : public CDialog { // Cons ...

  2. python中使用easygui

    在阅读<跟孩子一起学编程>的同学对easygui应该不会陌生.书中给出的下载链接有时会连不上,可以试一下http://www.ferg.org/easygui/download.html ...

  3. 51nod 1102 面积最大的矩形 && 新疆大学OJ 1387: B.HUAWEI's billboard 【单调栈】+【拼凑段】(o(n) 或 o(nlog(n))

    题面1:  题面2:  两道题除了数据范围不同,没有任何差异,两道题都可以o(n)(单调栈),o(nlog(n))(我自己的做法)解决. 解题思路1:(单调栈) 对于每个点找到右边第一个比它小的位 ...

  4. jQuery学习(五)——使用JQ完成复选框的全选和全不选

    1.在系统后台进行人员管理时,进行批量删除,使用jq完成全选和全不选 步骤分析: 第一步:引入jquery文件 第二步:书写页面加载函数 第三步:为上面的复选框绑定单击事件 第四步:将下面所有的复选框 ...

  5. 《Unix环境高级编程》读书笔记 第10章-信号

    1.引言 信号是软件中断. 信号提供了一种处理异步事件的方法. 2. 信号概念 信号的名字都是以3个字符SIG开头. Linux3.2.0支持31种信号.FreeBSD.Linux和Solaris作为 ...

  6. FCC高级编程篇之Record Collection

    Record Collection You are given a JSON object representing a part of your musical album collection. ...

  7. JavaScript函数练习

    1. 判断一个数是否是素数 function isSushu (n) { n = n || 0; var isSu = true; for (var i = 2; i <= Math.sqrt( ...

  8. 洛谷 P4147 玉蟾宫 (最大子矩形问题)

    这道题用到了悬线法,非常牛逼,可以看这个论文. https://blog.csdn.net/twtsa/article/details/8120269 #include<cstdio> # ...

  9. PKU 2184 Cow Exhibition 01背包

    题意: 有一些牛,每头牛有一个Si值,一个Fi值,选出一些牛,使得max( sum(Si+Fi) ) 并且 sum(Si)>=0, sum(Fi)>=0 思路: 随便选一维做容量(比如Fi ...

  10. 2019年北航OO第二单元(多线程电梯任务)总结

    一.三次作业总结 1. 说在前面 对于这次的这三次电梯作业,我采用了和几乎所有人都不同的架构:将每个人当作一个线程.这样做有一定的好处:它使得整个问题的建模更加自然,并且在后期人员调度变得复杂时,可以 ...