机器学习-高斯朴素贝叶斯算法(Gaussian Naive Bayes)

1、贝叶斯定理:

        P(A|B) = \frac{P(B|A)\cdot P(A)}{P(B)}

2、高斯分布(正态分布):

        y = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x - \mu )^{2}}{2\sigma ^{2}}}  (\mu为均值,\sigma为标准差)

3、高斯朴素贝叶斯算法:

        假设在给定的样本X中不同特征之间是独立的,在样本之间是独立同分布(iid)的

        由贝叶斯定理:

                P(y|X) = \frac{P(X|y)\cdot P(y)}{P(X)} \\ P(y|X) \propto P(X|y)\cdot P(y) \\ \left\{\begin{matrix} P(y_{0}|X) \propto P(X|y_{0})\cdot P(y_{0})\\ P(y_{1}|X) \propto P(X|y_{1})\cdot P(y_{1})\\ ...\\ P(y_{m}|X) \propto P(X|y_{m})\cdot P(y_{m}) \end{matrix}\right. \Rightarrow \\ \left\{\begin{matrix} P(y_{0}|x_{0},x_{1},...,x_{n}) \propto P(x_{0},x_{1},...,x_{n}|y_{0})\cdot P(y_{0})\\ P(y_{1}|x_{0},x_{1},...,x_{n}) \propto P(x_{0},x_{1},...,x_{n}|y_{1})\cdot P(y_{1})\\ ...\\ P(y_{m}|x_{0},x_{1},...,x_{n}) \propto P(x_{0},x_{1},...,x_{n}|y_{m})\cdot P(y_{m}) \end{matrix}\right.\Rightarrow \\ \left\{\begin{matrix} P(y_{0}|x_{0},x_{1},...,x_{n}) \propto P(x_{0}|y_{0})P(x_{1}|y_{0})...P(x_{n}|y_{0})\cdot P(y_{0})\\ P(y_{1}|x_{0},x_{1},...,x_{n}) \propto P(x_{0}|y_{1})P(x_{1}|y_{1})...P(x_{n}|y_{1})\cdot P(y_{1})\\ ...\\ P(y_{m}|x_{0},x_{1},...,x_{n}) \propto P(x_{0}|y_{m})P(x_{1}|y_{m})...P(x_{n}|y_{m})\cdot P(y_{m}) \end{matrix}\right.

        示例:

                已知鸢尾花如下,其有四种性状和三种分类结果,不同的结果对应不同的鸢尾花品种

花瓣长(x0)花瓣宽(x1)花萼长(x2)花萼宽(x3)结果(y)
5.03.61.40.20
6.43.15.51.82
5.93.05.11.82
5.63.04.11.31
5.43.41.70.20
5.43.04.51.51
6.73.15.62.42
6.73.05.22.32
5.72.94.21.31
5.72.55.02.02
6.73.14.41.41
6.42.85.62.12
7.23.05.81.62
6.93.15.12.32
5.03.51.60.60

                使用高斯朴素贝叶斯算法来推断已知性状(花瓣长:7.1,花瓣宽:3.2,花萼长:5.3,花萼宽1.8)对应的鸢尾花品种方法如下:

                由上表格可知:

                        y_{0} = 0,y_{1} = 1,y_{2} = 2 \\ x_{0} = \left\{\begin{matrix} 5.0\\ 6.4\\ 5.9\\ 5.6\\ 5.4\\ 5.4\\ 6.7\\ 6.7\\ 5.7\\ 5.7\\ 6.7\\ 6.4\\ 7.2\\ 6.9\\ 5.0 \end{matrix}\right. x_{1} = \left\{\begin{matrix} 3.6\\ 3.1\\ 3.0\\ 3.0\\ 3.4\\ 3.0\\ 3.1\\ 3.0\\ 2.9\\ 2.5\\ 3.1\\ 2.8\\ 3.0\\ 3.1\\ 3.5 \end{matrix}\right. x_{2} = \left\{\begin{matrix} 1.4\\ 5.5\\ 5.1\\ 4.1\\ 1.7\\ 4.5\\ 5.6\\ 5.2\\ 4.2\\ 5.0\\ 4.4\\ 5.6\\ 5.8\\ 5.1\\ 1.6 \end{matrix}\right. x_{3} = \left\{\begin{matrix} 0.2\\ 1.8\\ 1.8\\ 1.3\\ 0.2\\ 1.5\\ 2.4\\ 2.3\\ 1.3\\ 2.0\\ 1.4\\ 2.1\\ 1.6\\ 2.3\\ 0.6 \end{matrix}\right.

                1、求先验概率

                        P(y_{0}=0) = \frac{3}{15},P(y_{1}=1) = \frac{4}{15},P(y_{2}=2) = \frac{8}{15} \\

                2、假定该样本是独立同分布的。并且服从高斯分布(正态分布)

                3、先验概率对应的均值和标准差,例如当y=0时:

                        x_{0}: \mu = \frac{(5.0 + 5.4 + 5.0)}{3} = 5.13 ,\sigma =\sqrt{\frac{(5.0 - 5.13)^{2} + (5.4 - 5.13)^{2} + (5.0 - 5.13)^{2}}{3}}=0.01127 \\ x_{1}: \mu =3.5, \sigma = 0.00667\\ x_{2}: \mu = 1.567,\sigma =0.01556 \\ x_{3}: \mu = 0.3334,\sigma =0.2485 \\

                4、计算

        ​​​​​​​        ​​​​​​​        P(y_{0}|x_{0},x_{1},...,x_{n})\\ P(y_{1}|x_{0},x_{1},...,x_{n})\\ ...\\ P(y_{m}|x_{0},x_{1},...,x_{n})

                      即计算

        ​​​​​​​        ​​​​​​​        P(x_{0}|y_{0})P(x_{1}|y_{0})...P(x_{n}|y_{0})\cdot P(y_{0})......(1)\\ P(x_{0}|y_{1})P(x_{1}|y_{1})...P(x_{n}|y_{1})\cdot P(y_{1})......(2)\\ ...\\ P(x_{0}|y_{m})P(x_{1}|y_{m})...P(x_{n}|y_{m})\cdot P(y_{m})......(m)

                      例如当x = (7.1,3.2,5.3,1.8)

                ​​​​​​​        ​​​​​​​P(x_{0}|y_{0}) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x - \mu )^{2}}{2\sigma ^{2}}} = \frac{1}{\sqrt{2\pi}* (0.01127)}e^{-\frac{(7.1 - 5.13 )^{2}}{2*(0.01127) ^{2}}}\\ P(x_{0}|y_{0}) = \frac{1}{\sqrt{2\pi} \sigma}e^{-\frac{(x - \mu )^{2}}{2\sigma ^{2}}} = \frac{1}{\sqrt{2\pi}* (0.00667)}e^{-\frac{(3.2 - 3.5 )^{2}}{2*(0.00667) ^{2}}}\\ ...\\ P(y_{0}) = \frac{3}{15}

                      比较以上(1),(2),...,(m)式的大小,例如(1)式最大,说明当x发生时y_{0}发生的概率最大

                      那么当前的预测结果就是y_{0}

                高斯朴素贝叶斯算法python代码实现如下:

import numpy as np
class myGaussianNB(object):
    #初始化方法
    def __init__(self):
    #训练方法
    def fit(self,X,y):
        #将输入参数转为numpy方便计算
        X = np.array(X)
        y = np.array(y)
        #校验参数
        if X.ndim!=2 or y.ndim!=1 or X.shape[0]!=y.shape[0]:
            raise ValueError("参数错误")
        #获取特征数量
        self.n_feature = X.shape[1]
        #定义先验概率
        self.y_probs = {}
        #定义条件概率的概率密度函数参数mus,sigma
        self.X_y_params = {}
        #去掉重复标签
        lables = set(y)
        #固定标签顺序
        self.lables = list(lables)
        #循环遍历标签
        for lable in lables:
            #获取先验概率
            self.y_probs[lable] = (y == lable).mean()
            #筛选当前标签对应的x
            X_lables = X[y==lable]
            #计算当前标签对应x的mus,sigma
            mus = X_lables.mean()
            sigmas = X_lables.std()
            #将标签参数存入概率密度函数参数
            self.X_y_params[lable] = {"mus":mus,"sigmas":sigmas}
    #高斯分布概率密度函数方法
    def Gaussian(x,mus,sigma):
        return 1 / np.sqrt(2 * np.pi) / sigma * np.exp(-(x - mus) ** 2 / 2 / simga ** 2))
    #预测方法
    def predict(self,X):
        #将输入参数转为numpy方便计算
        X = np.array(X)
        #校验参数
        if X.ndim!=2 or X.shape[1]!=self.n_feature:
            raise ValueError("参数错误")
        #定义返回结果标签
        return = []
        #遍历样本
        for x in X:
            #定义当前样本概率数组
            probs = []
            #计算每个标签对应的概率
            for lable in self.lables:
                prob = self.y_probs[lable]
                for feature_idx in range(self.n_feature):
                    prob *= self.Gaussian(x=x[feature_idx],
                                mus=self.X_y_params[lable]["mus"][feature_idx],
                                sigma=self.X_y_params[lable]["sigmas"][feature_idx],)
                probs.append(prob)
            #从当前样本概率数组选取概率最大的标签加入结果标签
            result.append(self.lables[np.array(probs).argmax()])
        return result

                       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值