高斯朴素贝叶斯-python sklearn实现 作者:马育民 • 2023-01-11 16:23 • 阅读:10054 # 介绍 高斯朴素贝叶斯,假设特征所属于某个类别的值符合高斯分布(正态分布) 有些特征可能是连续型变量,比如:人的身高,物体的长度。 这些特征可以 **转换成离散型的值**,比如: - 身高在160cm以下,特征值为1 - 身高在160cm和170cm之间,特征值为2 - 身高在170cm之上,特征值为3 也可以这样转换: - 如果身高是160cm以下,这三个特征的值分别是 `1、0、0` - 如果身高在160cm和170cm之间,特征值为 `0、1、0` - 若身高在170cm之上,特征值是 `0、0、1` 不过这些方式都不够细腻,高斯模型可以解决这个问题 # 声明 ``` class sklearn.naive_bayes.GaussianNB (priors=None, var_smoothing=1e-09) ``` **参数解释:** - prior(先验概率):可输入任何类数组结构,形状为(n_classes,) 表示类的先验概率。如果指定,则不根据数据调整先验,如果不指定,则自行根据数据计算先验概率。 - var_smoothing:浮点数,可不填(默认值= 1e-9) 在估计方差时,为了追求估计的稳定性,将所有特征的方差中最大的方差以某个比例添加到估计的方差中。这个比例,由var_smoothing参数控制。 # 例子 下面是一组人类身体特征的统计资料 |性别|身高(英尺)|体重(磅)|脚掌(英寸)| |---|---|---| |男|6|180|12| |男|5.92|190|11| |男|5.58|170|12| |男|5.92|165|10| |女|5|100|6| |女|5.5|150|8| |女|5.42|130|7| |女|5.75|150|9| 问:已知某人身高6英尺、体重130磅,脚掌8英寸,请问该人是男是女? ### 分析 计算朴素贝叶斯的分子,如下: ``` P(身高|性别) x P(体重|性别) x P(脚掌|性别) x P(性别) ``` 这里的困难在于,由于身高、体重、脚掌都是连续变量,不能采用离散变量的方法计算概率。而且由于样本太少,所以也无法分成区间计算。怎么办? 这时,可以假设男性和女性的身高、体重、脚掌都是正态分布,通过样本计算出均值和方差,也就是得到正态分布的密度函数。有了密度函数,就可以把值代入,算出某一点的密度函数的值 ### 代码 ``` import numpy as np #导入朴素贝叶斯 from sklearn.naive_bayes import GaussianNB ''' 训练数据 第一列表示颜值,1表示帅,0表示不帅 第二列表示性格,1表示好,0表示不好 第三列表示身高,1表示高,0表示矮 第四列表示是否上进,1表示上进,0表示不上进 ''' x=np.array([[6,180,12], [5.92,190,11], [5.58,170,12], [5.92,165,10], [5,100,6], [5.5,150,8], [5.42,130,7], [5.75,150,9] ]) # 训练数据的标签,0表示女,1表示男 y=np.array([1,1,1,1,0,0,0,0]) nb=GaussianNB() nb.fit(x,y) # 预测 prd_x=np.array([ [6,130,8], ]) pre=nb.predict(prd_x) pre2=nb.predict_proba(prd_x) # 输出模型预测结果 print("预测结果为:",pre) #输出模型预测的分类概率 print("预测的概率为:",pre2) ``` 执行结果: ``` 预测结果为: [0] # 0表示女 预测的概率为: [[9.99999846e-01 1.54426632e-07]] #女性概率99.99% ``` 参考: https://blog.csdn.net/ac540101928/article/details/103941495 https://blog.csdn.net/qq_38163244/article/details/109154089 原文出处:http://malaoshi.top/show_1IX4lAuXKRdT.html