1 朴素贝叶斯模型

朴素贝叶斯法是基于贝叶斯定理、特征条件独立假设的分类方法。在预测时,对输入x,找出对应后验概率最大的 y 作为预测。

NB模型:

输入:

先验概率分布:P(Y=ck),k=1,2,⋯,KP\left(Y=c_{k}\right), \quad k=1,2, \cdots, KP(Y=ck​),k=1,2,⋯,K

条件概率分布:P(X=x∣Y=ck)=P(X(1)=x(1),⋯,X(n)=x(n)∣Y=ck),k=1,2,⋯,KP\left(X=x | Y=c_{k}\right)=P\left(X^{(1)}=x^{(1)}, \cdots, X^{(n)}=x^{(n)} | Y=c_{k}\right), \quad k=1,2, \cdots, KP(X=x∣Y=ck​)=P(X(1)=x(1),⋯,X(n)=x(n)∣Y=ck​),k=1,2,⋯,K

其中,输入数据 X 维度为nnn.

输出:测试数据的后验概率

根据 后验=似然∗先验/归一化后验 = 似然*先验/归一化后验=似然∗先验/归一化, 有:

P(Y=ck∣X=x)=P(X=x∣Y=ck)P(Y=ck)∑kP(X=x∣Y=ck)P(Y=ck)P\left(Y=c_{k} | X=x\right)=\frac{P\left(X=x | Y=c_{k}\right) P\left(Y=c_{k}\right)}{\sum_{k} P\left(X=x | Y=c_{k}\right) P\left(Y=c_{k}\right)}P(Y=ck​∣X=x)=∑k​P(X=x∣Y=ck​)P(Y=ck​)P(X=x∣Y=ck​)P(Y=ck​)​

NB分类器即为:

y=f(x)=arg⁡max⁡ckP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)∑kP(Y=ck)∏jP(X(j)=x(j)∣Y=ck)y=f(x)=\arg \max _{c_{k}} \frac{P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}{\sum_{k} P\left(Y=c_{k}\right) \prod_{j} P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)}y=f(x)=argmaxck​​∑k​P(Y=ck​)∏j​P(X(j)=x(j)∣Y=ck​)P(Y=ck​)∏j​P(X(j)=x(j)∣Y=ck​)​

其中,分母是归一化因子,可以忽略。

朴素贝叶斯可以分为高斯朴素贝叶斯、多项式朴素贝叶斯、贝努利朴素贝叶斯等多种。

2 朴素贝叶斯的参数估计

朴素贝叶斯需要估计先验概率P(Y=ck)P\left(Y=c_{k}\right)P(Y=ck​) 和条件概率P(X(j)=x(j)∣Y=ck)P\left(X^{(j)}=x^{(j)} | Y=c_{k}\right)P(X(j)=x(j)∣Y=ck​).以下只考虑离散属性情形。

2.1 极大似然法(MLE)

使用极大似然法估计(Maximum Likehood Estimation)先验概率:

P(Y=ck)=∑i=1NI(yi=ck)N,k=1,2,⋯,KP\left(Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)}{N}, \quad k=1,2, \cdots, KP(Y=ck​)=N∑i=1N​I(yi​=ck​)​,k=1,2,⋯,K

条件概率:

&P\left(X^{(j)}=a_{jl} | Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(x_{i}^{j}=a_{j l}, y_{i}=c_{k}\right)}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)}\\ &j=1,2, \cdots, n ; \quad l=1,2, \cdots, S_{j}; \quad k=1,2, \cdots, K \end{aligned}$$ #### 2.2 贝叶斯估计 极大似然法可能出现概率值为 0 情况,贝叶斯估计使用了拉普拉斯平滑. 先验概率的贝叶斯估计为: $$P_{\lambda}\left(Y=c_{k}\right)=\frac{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)+\lambda}{N+K \lambda}$$ 条件概率的贝叶斯估计为: $$P_{\lambda}\left(X^{(j)}=a_{j l} | Y=c_{k}\right)=\frac{\sum_{l=1}^{N} I\left(x_{i}^{(j)}=a_{j l} ,y_{i}=c_{k}\right)+\lambda}{\sum_{i=1}^{N} I\left(y_{i}=c_{k}\right)+S_{j} \lambda}$$ Q1:这里极大似然估计和贝叶斯估计感觉描述没什么区别? A1:《机器学习》书中,没有提拉普拉斯平滑当作贝叶斯估计,还是有点疑问。 ### 3 朴素贝叶斯实现 #### 3.1 高斯朴素贝叶斯实现 高斯朴素贝叶斯用于连续数据的预测,原理是假设训练集各个特征满足高斯分布,获得不同类别数据集对应不同特征的高斯分布均值和方差,然后计算测试样本各个特征属于相应高斯分布的概率,从而获得其属于某个类别的概率,并把概率最大的标签作为这个样本的标签。 ```python import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris import pandas as pd from sklearn.model_selection import train_test_split import math sqrt, exp, pi = np.sqrt, np.exp, np.pi def createData(): iris = load_iris() df = pd.DataFrame(iris.data, columns = iris.feature_names) df['label'] = iris.target df.columns = ['sepal length', 'sepal width', 'petal length', 'petal width', 'label'] return df.iloc[:,:-1],df.iloc[:,-1] X,y = createData() Xtrain, Xtest, Ytrain, Ytest = train_test_split(X, y, test_size = 0.5, random_state = 1028) class GaussianNaiveBayes(object): ''' 高斯朴素贝叶斯,用于处理连续数据,输入使用numpy.array. ''' def __init__(self): self.model = None @staticmethod def mean(x): ''' 求array类型的特征(列)平均值 ''' return sum(x)/float(len(x)) def var(self, x): ''' 求特征的方差 ''' return sum(pow(x-self.mean(x),2)*1.0/len(x)) def gaussianProba(self, x, mean, var): ''' 使用高斯概率密度,求测试集属于某个特征的值 ''' return 1/(sqrt(2*pi*var))*exp(-pow(x-mean,2)/(2.0*var)) def summarize(self, data): ''' 返回训练集每个特征的平均值,方差。 ''' data = np.array(data) return [self.mean(data),self.var(data)] def fit(self, x, y): ''' 获得训练集每个标签对应每个特征的平均值,方差。 ''' labels = np.unique(y) data = {label:[] for label in labels} for f, label in zip(x, y): data[label].append(f.tolist()) self.model = {label: self.summarize(value) for label, value in data.items()} return data,self.model def calculateProba(self, data): ''' 计算测试集对应在每个类别的概率。 ''' prob = {} data = data.transpose() for label, value in self.model.items(): prob[label] = 1 for i in range(len(data)): prob[label] *= self.gaussianProba(data[i], value[0][i], value[1][i]) return prob def predict(self, data): ''' 把概率最高的值作为样本的标签。 ''' res = [] for label, value in self.calculateProba(data).items(): res.append(value) res = np.array(res) return np.argmax(res, axis = 0) def score(self, x, y): ''' 计算预测的准确率。 ''' score = 0 label = self.predict(x) for i in range(len(label)): if label[i] ==y[i]: score+=1 return score*1.0/len(label) if __name__ == '__main__': model = GaussianNaiveBayes() data, m1 = model.fit(Xtrain.values, Ytrain.values) prob = model.calculateProba(Xtest.values) label = model.predict(Xtest.values) score = model.score(Xtest.values, Ytest.values) print('accuary', score) ``` 结果:`accuary 0.9466666666666667` #### 3.2 多项式朴素贝叶斯MultinomialNB 多项式朴素贝叶斯可以用于离散数据的分类中。 调用sklearn API: ```python import numpy as np rng = np.random.RandomState(1) X = rng.randint(5, size=(6, 100)) y = np.array([1, 2, 3, 4, 5, 6]) from sklearn.naive_bayes import MultinomialNB clf = MultinomialNB() clf.fit(X, y) print(clf.predict(X[2:3])) ``` ### 4. 拓展:极大似然估计与贝叶斯估计的区别 贝叶斯是**假定模型参数服从某种分布**,然后对模型参数分布进行估计。这和极大似然法非常不同(极大似然法假设参数是某个值,只是对参数估计,属于点估计范围)。 贝叶斯估计应用分为两种,对离散数据的估计及对连续数据的估计,其实差别不大,只是参数分布假设不同,连续数据时模型参数多假设为高斯分布。 --- 参考: 1. [GitHub贝叶斯详解及代码](https://github.com/endymecy/spark-ml-source-analysis/blob/master/%E5%88%86%E7%B1%BB%E5%92%8C%E5%9B%9E%E5%BD%92/%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF/nb.md); 2. [CSDN.关于朴素贝叶斯法](http://blog.csdn.net/u012162613/article/details/48323777); 3. [黄海广 GitHub代码](https://github.com/fengdu78/lihang-code/blob/master/code/%E7%AC%AC4%E7%AB%A0%20%E6%9C%B4%E7%B4%A0%E8%B4%9D%E5%8F%B6%E6%96%AF(NaiveBayes)/GaussianNB.ipynb); 4. [wepon大神blog](https://blog.csdn.net/u012162613/article/details/48323777); 5. [Bayes 课件 Utdallas.edu](http://www.utdallas.edu/~nrr150130/cs7301/2016fa/lects/Lecture_14_Bayes.pdf); 6. [Bayes MLE MAP 区别 cmu](http://www.cs.cmu.edu/~aarti/Class/10701_Spring14/slides/MLE_MAP_Part1.pdf); 7. [MLE 解释 英文](https://newonlinecourses.science.psu.edu/stat414/node/191/); 8. [sklearn Naive Bayes](https://scikit-learn.org/stable/modules/naive_bayes.html);

朴素贝叶斯python代码_朴素贝叶斯模型及python实现相关推荐

  1. 浪漫的python代码_七夕,最浪漫的Python代码送给陷入爱河的Python男同胞

    七夕,最浪漫的Python代码送给陷入爱河的Python男同胞 image.gif ​ 三句话情书,我们听过.如何用python写一段浪漫的代码?可以是简短有韵味的情书式, 也欢迎冗长而效果拔群的万行 ...

  2. pycharm怎么编写python代码_如何设置PyCharm中的Python代码模版(推荐)

    在MacOs运行的PyCharm中,执行python文件,如果不指定python文件字符编码会报错: SyntaxError: Non-ASCII character '\xe6' in file / ...

  3. 随机森林分类算法python代码_随机森林的原理及Python代码实现

    原标题:随机森林的原理及Python代码实现 最近在做kaggle的时候,发现随机森林这个算法在分类问题上效果十分的好,大多数情况下效果远要比svm,log回归,knn等算法效果好.因此想琢磨琢磨这个 ...

  4. 人眼定位python代码_使用dlib,OpenCV和Python进行人脸识别—人眼眨眼检测

    前期文章我们分享了如何使用python与dlib来进行人脸识别,以及来进行人脸部分的识别, 如下图,dlib人脸数据把人脸分成了68个数据点,从图片可以看出,人脸识别主要是识别:人眉,人眼,人鼻,人嘴 ...

  5. 判断质数和合数python代码_质数,非质数之Python

    质数的定义:指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数(百度百科) 自然数的定义:指用以计量事物的件数或表示事物次序的数.即用数码0,1,2,3,4--所表示的数.自然数由0开始, ...

  6. js如何运行python代码_手把手教你如何使用Python执行js代码

    前言 各位小伙伴,大家好,这次咱们来说一下关于爬虫方向的一个知识,Python如何执行js,快来看看吧!!! 为什么要引出Python执行js这个问题? 都说术业有专攻,每个语言也都有自己的长处和短处 ...

  7. 情人节python代码_情人节攻略:用Python撒狗粮的正确姿势

    掐指一算, 明天就是情人节了! 还没从春节回家被催婚中回过神来, 明天又到了满世界秀恩爱的情人节, 各位程序员给女朋友准备礼物了吗? python学习交流群:923414804,群内每天分享干货,包括 ...

  8. 汉字转拼音python代码_汉字转拼音小程序——Python版

    首先说明,我不是计算机专业的!我是学油藏工程的(石油工程专业方向之一),大学毕业后一直从事石油开发地质专业的工作.石油领域内前期的地震资料处理,中期的开发地质研究,以及后期的油藏数值模拟和动态分析都需 ...

  9. 牛逼的python代码_几段牛逼的 Python 代码理解面向对象

    Python技术相关的干货加群: 227435450 Python 有什么好处?功能强大,使用简单,语言唯一性的特征明显(唯一性的意思就是你不能用十八种写法实现一个功能),而且具备海量的第三方库--P ...

最新文章

  1. 从零开始一个http服务器(五)-模拟cgi
  2. centos mysql-5.5.20_centos 下安装mysql5.5.20出现的问题
  3. WINDOWS 逻辑坐标 设备坐标 屏幕坐标 客户区坐标
  4. java程序错误类型及异常处理
  5. 跟本菜菜一起去体验Microsoft Windows Server Code Name Longhorn Server Core
  6. 搬家后第一次缴电费,查询客户编号的解决办法
  7. python 0xa_python在获取字节0xa或0xd后停止对文件的二进制读取
  8. ggplot2作图详解:主题(theme)设置
  9. 天堂2单机版服务器时间修改,L2Jserver版本天堂2进游戏公告的修改
  10. 在SOUI里使用真窗口时使用SOUI的滚动条
  11. Ubuntu下安装新版QQ
  12. 太实用啦,4种方法教你轻松制作交互式仪表板
  13. 如何构建自己的知识体系
  14. 【调剂】上海理工大学软件工程接收调剂研究生
  15. python 自动化测试基础
  16. 风扇,html css3,纯CSS3实现的3D风扇动画
  17. 获取手机设备型号、系统版本、手机型号等信息
  18. 怎样才算得上是一名优秀的软件测试工程师呢?
  19. 酸奶能通便吗?身体知道酸奶用效果给你答案
  20. 三维坐标点绕任意轴旋转的新坐标计算

热门文章

  1. 【LADRC】线性自抗扰控制
  2. 善于抓热点的董明珠,借新型肺炎疫情契机推动格力多元化发展
  3. ipo 增量发行 存量发行
  4. 【洞见研报】研报速读:光伏行业简报——分布式光伏“势不可挡”(光伏,分布式光伏,太阳能)
  5. 带你了解那些超爱自黑的程序员:程序员的专用表情包,快来收藏吧!
  6. 机器学习(六)Python实现进阶人脸识别
  7. 练习(一)——决策树与随机森林分析Titanic数据集船员生还情况
  8. mysql的replace用法
  9. EOMONTH 函数:计算当月/前后几个月的最后一天
  10. js插值计算_插值法怎么计算,完全看不懂