算法和实现

朴素贝叶斯算法

给定数据集T={(x(1),y(1)),(x(2),y(2)),...,(x(m),y(m))}T=\{(x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\},其中xXRnx\in \mathcal{X}\subseteq R^nyY={c1,c2,...,cK}y\in \mathcal{Y}=\{c_1, c_2,...,c_K\}XX是定义在输入空间X\mathcal{X}上的随机向量,YY是定义在输出空间Y\mathcal{Y}上的随机变量,则对于输入xx,计算如下的到输出yy

y=f(x)=argmaxckj=1nP(Xj=xjY=ck)P(Y=ck)y=f(x)=\arg \max_{c_k}\prod_{j=1}^n P(X_j=x_j|Y=c_k)P(Y=c_k)

式中的P()P(\cdot)值小于1,多个小于1的值连乘在python中执行会导致下溢,因此可以取对数,可以将乘法改为加法。而且对数函数是递增函数并不影响结果。则:

y=f(x)=argmaxckln(j=1nP(Xj=xjY=ck)P(Y=ck))y=f(x)=\arg \max_{c_k}ln\big(\prod_{j=1}^n P(X_j=x_j|Y=c_k)P(Y=c_k)\big)
=argmaxck(lnP(Y=ck)+i=1nln(P(Xj=xjY=ck))=\arg \max_{c_k}\big(lnP(Y=c_k)+\displaystyle\sum_{i=1}^nln(P(X_j=x_j|Y=c_k)\big)

算法实现

数据源:https://github.com/apachecn/MachineLearning/tree/python-2.7/input/4.NaiveBayes/email

例子里面中的基本步骤如下:

  1. 将数据集切分称训练数据集和测试数据集。

  2. 预先提取出所有的数据里面单词构成单词向量。

  3. 然后分别将训练数据集和测试数据集的输入,分词,并转换称单词向量。

  4. 然后进行训练,训练时计算各个单词的数量,然后除以总单词树,并使用lamda=1。

  5. 然后进行测试,采样log的加和来使得避免连乘溢出。

测试结果:

Last updated