简洁高斯朴素贝叶斯分类原理及python实现

高斯朴素贝叶斯分类器是针对特征值连续的情况下给出的一种分类方法。

贝叶斯公式
所有的贝叶斯分类器的基石都是概率论中的贝叶斯公式,给定训练数据集 D = { x i , C i } , i = 1 , . . . , N , x i ∈ R D , C i ∈ 1 , . . . , K D=\{x_i,C_i\},i=1,...,N,x_i\in R^D,C_i\in {1,...,K} D={xi,Ci},i=1,...,N,xiRD,Ci1,...,K有贝叶斯公式如下: p ( C ∣ x ) = p ( C ) p ( x ∣ C ) p ( x ) , C ∈ { C 1 , C 2 , . . . , C k } p(C|x)=\frac {p(C)p(x|C)}{p(x)},C\in \{C_1,C_2,...,C_k\} p(Cx)=p(x)p(C)p(xC),C{C1,C2,...,Ck}
其中 p ( C ) p(C) p(C)为分类先验概率, p ( x ∣ C ) p(x|C) p(xC)为分类条件分布概率。我们的主要任务就是求得 p ( x ∣ C ) 和 p ( C ) p(x|C)和p(C) p(xC)p(C)

高斯分布式
在此时我们假设 p ( x ∣ C ) p(x|C) p(xC)是服从高斯分布的,对任意 x i ∈ ( x 1 , x 2 , . . . , x D ) T x_i\in(x_1,x_2,...,x_D)^T xi(x1,x2,...,xD)T是相互独立的并且均服从高斯分布:
p ( x ∣ C ) = 1 2 π σ c e x p [ − ( x − μ c ) 2 2 σ c 2 ] p(x|C)=\frac {1}{\sqrt {2\pi}\sigma_c}exp[- \frac{(x-\mu_c)^2}{2\sigma_c^2} ] p(xC)=2π σc1exp[2σc2(xμc)2]
其中 μ c 和 σ c \mu_c和\sigma_c μcσc分别为各特征的平均值和标准差。

最终分类条件概率可写成:
p ( x ∣ C ) = ∏ d = 1 D p ( x i ∣ C ) = ∏ d = 1 D 1 2 π σ c d e x p [ − ( x − μ c d ) 2 2 ( σ c d ) 2 ] p(x|C)=\prod_{d=1}^Dp(x_i|C)=\prod_{d=1}^D\frac {1}{\sqrt{2\pi}\sigma_c^d}exp[- \frac{(x-\mu_c^d)^2}{2(\sigma_c^{d})^2}] p(xC)=d=1Dp(xiC)=d=1D2π σcd1exp[2(σcd)2(xμcd)2]

那么最终得到的预测分类结果就是:
C = arg max ⁡ c p ( C ∣ x ) C=\argmax_c{p(C|x)} C=cargmaxp(Cx)

算法流程
明确了高斯朴素贝叶斯分类器的原理以及计算过程,那么我们很容易得到其算法流程如下:

  1. 准备数据集,分离出feature集以及label集,并根据label集计算先验概率p(C)
  2. 训练模型,根据training dataset计算各特征向量的平均值及标准差
  3. 预测分类,根据输入特征向量计算出所有特征对应的p(x|C)p(C)即k*p(x|C),这里由于分母均相同,所以直接忽略计算分母
  4. 求argmax(k*p(x|C))=argmax(p(x|C))

python实现
花的分类问题:
数据集:数据集链接

import numpy as np
import collections

#高斯朴素贝叶斯类
class GuassianNB:
    def __init__(self):
        self.prior = None #先验概率
        self.avgs = None #均值
        self.vars = None #方差值
        self.nums = None # 特征值数量

    #计算先验概率
    def _get_prior(self, label: np.array)->dict:
        cnt = collections.Counter(label)
        a = {}
        for k,v in cnt.items():
            a[k]=v/len(label)
        return a

    #计算均值
    def _get_avgs(self,data:np.array,label:np.array)->np.array:
        return np.array([data[label == i].mean(axis=0) for i in self.nums])

    #计算方差
    def _get_vars(self,data:np.array,label:np.array)->np.array:
        return np.array([data[label == i].var(axis=0) for i in self.nums])

    #计算似然度
    def _get_likelihood(self,row:np.array)->np.array:
        return (1 / np.sqrt(2 * np.pi * self.vars) * np.exp(
            -(row - self.avgs) ** 2 / (2 * self.vars))).prod(axis=1)

    #训练数据集
    def fit(self, data: np.array, label: np.array):
        self.prior = self._get_prior(label)
        print(self.prior)
        a=[]
        for key in self.prior.keys():
            a.append(key)
        self.nums = a
        self.avgs = self._get_avgs(data, label)
        self.vars = self._get_vars(data, label)

    #预测label
    def predict_prob(self, data: np.array) -> np.array:
        likelihood = np.apply_along_axis(self._get_likelihood, axis=1, arr=data)
        print(likelihood)
        a = []
        for key in self.prior.keys():
            a.append(self.prior[key])
        probs = np.array(a) * likelihood
        print(probs)
        probs_sum = probs.sum(axis=1)
        return probs / probs_sum[:, None]

    #预测结果
    def predict(self, data: np.array) -> np.array:
        return self.predict_prob(data).argmax(axis=1)

def main():
    origin_dataset = np.loadtxt('iris.txt',dtype=str,delimiter=',')
    np.random.shuffle(origin_dataset)
    feature_dataset = [] #特征集
    label_dataset = [] #标签集
    feature_dataset_test = [] #测试集
    label_dataset_test = [] #测试结果集
    for i in range(int(len(origin_dataset)*0.8)):
        feature_dataset.append(origin_dataset[i][0:4])
        label_dataset.append(origin_dataset[i][4])
    for i in range(int(len(origin_dataset)*0.8),len(origin_dataset)):
        feature_dataset_test.append(origin_dataset[i][0:4])
        label_dataset_test.append(origin_dataset[i][4])
    # print(feature_dataset)
    # print("--------------------------")
    # print(label_dataset)
    feature_dataset = np.array(feature_dataset,dtype=float)
    label_dataset = np.array(label_dataset,dtype=str)
    feature_dataset_test = np.array(feature_dataset_test,dtype=float)
    label_dataset_test = np.array(label_dataset_test,dtype=str)
    # print(feature_dataset)
    # print(label_dataset)
    nb = GuassianNB()
    nb.fit(feature_dataset,label_dataset) #训练模型
    # print(nb.avgs)
    # print(nb.nums)
    # print(nb.prior)
    # print(nb.vars)
    test_result = nb.predict(feature_dataset_test)
    print(test_result)
    acc = 0
    for i in range(len(test_result)):
        if nb.nums[test_result[i]] == label_dataset_test[i]:
            acc+=1
    print("精确度:"+str(acc/len(test_result)))
if __name__ == '__main__':
    main()

预测结果:
精确度基本可达90%以上。
在这里插入图片描述在这里插入图片描述

高斯朴素贝叶斯分类器是一种基于概率统计的分类算法,在Python中有多种实现方法。其中一种实现方法可以在的博客文章中找到,该文章介绍了高斯朴素贝叶斯分类器的原理Python实现。另外,在的文章中也介绍了Python实现朴素贝叶斯分类器,并给出了具体的定义和使用技巧。 高斯朴素贝叶斯分类器的原理是基于概率论中的贝叶斯定理,通过计算样本的概率来进行分类。在该分类器中,假设每个特征的概率分布都服从高斯分布,即正态分布。具体来说,对于每个特征,根据训练数据计算出每个类别下该特征的均值和方差,然后通过高斯分布公式计算出样本在每个类别下的概率,最后根据概率大小进行分类。 高斯朴素贝叶斯分类器的优点包括:简单、速度快、对于多分类问题有效、在分布独立的假设成立的情况下,效果较好。与逻辑回归相比,需要的样本量更少一些,并且对于类别型特征效果非常好。 然而,高斯朴素贝叶斯分类器也存在一些缺点。例如,如果测试集中的某个类别变量特征在训练集中没有出现过,直接计算概率时会得到0,导致预测功能失效。为了解决这个问题,可以使用平滑技术,如拉普拉斯估计。此外,高斯朴素贝叶斯分类器假设特征之间是独立的,在现实生活中这种假设很难成立。 高斯朴素贝叶斯分类器在文本分类、垃圾文本过滤、情感分析等场景中应用广泛。对于文本相关的多分类实时预测,由于其简单和高效的特点,也被广泛应用。此外,高斯朴素贝叶斯分类器和协同过滤是推荐系统中常用的组合,能够增强推荐的覆盖度和效果。 综上所述,高斯朴素贝叶斯分类器在Python中有多种实现方法,可以根据具体的需求选择适合的方法进行使用。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [【概率图模型】(一)高斯朴素贝叶斯分类器(原理+python实现)](https://blog.csdn.net/u013066730/article/details/125821190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [Python实现朴素贝叶斯分类器示例](https://download.csdn.net/download/weixin_38721565/12871135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值