朴素贝叶斯算法原理及鸢尾花分类代码实现

一、概率模型

1、全概率公式(由因推果)

设事件B1,B2,…,Bn构成一个完备事件组,即两两不相容,和为全集且P(Bi)>0,则对任意事件A,有

贝叶斯回归树_贝叶斯公式


贝叶斯回归树_python_02

由因推果的理解:如上图:可以理解为A事件的发生是由贝叶斯回归树_朴素贝叶斯_03这些原因导致的,有:贝叶斯回归树_python_04,再由条件概率公式即可推导出全概率公式。

2、贝叶斯公式(由果溯因)

贝叶斯回归树_朴素贝叶斯_05

二、在机器学习中的应用(朴素贝叶斯算法)

1、贝叶斯公式在机器学习分类问题中的形式:
贝叶斯回归树_贝叶斯公式_06
因为朴素贝叶斯假设数据的各个特征之间是彼此独立的:

所以有:贝叶斯回归树_朴素贝叶斯_07

故朴素贝叶斯公式为:
贝叶斯回归树_机器学习_08

当用于分类问题时,贝叶斯回归树_python_09 ,由于贝叶斯回归树_python_10的分母都是相同的,所以只需要求分子的最大值来判断分类结果,即就是: 贝叶斯回归树_朴素贝叶斯_11,注意:在代码中往往将连乘用log函数转换为相加。由此,只需要计算先验概率:贝叶斯回归树_python_12和似然度:贝叶斯回归树_贝叶斯回归树_13

三、3种常见的朴素贝叶斯模型(三种计算先验概率和似然度的方法)

1、高斯分布模型

适用:数据集的特征时连续型数据时
贝叶斯回归树_朴素贝叶斯_14
其中贝叶斯回归树_机器学习_15是训练样本中类别为贝叶斯回归树_机器学习_16的样本的个数,N为训练样本的总个数。

2、多项式模型

适用:数据集的特征为离散型
贝叶斯回归树_机器学习_17

3、伯努利模型

**使用:数据集的特征为bool类型,即特征的值只能取0或者1
贝叶斯回归树_朴素贝叶斯_18

鸢尾花分类代码实现

import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
X = iris.data
Y = iris.target
# 分割训练集和验证集
x_train,x_test,y_train,y_test = train_test_split(X,Y,random_state=4)
print(len(x_train))
print(len(x_test))
print(len(y_train))
print(len(y_test))
# 计算每一类的先验概率,以及每一类中每一种特征的均值和方差
def prior_Mean_Var(x_train,y_train):
    prior_list=[]
    mean = np.array([[0,0,0,0]])
    var = np.array([[0,0,0,0]])
    for kind in range(3):
        x_class = x_train[np.nonzero(kind==y_train)]
        prior_list.append(len(x_class)/len(x_train))
        m = np.mean(x_class,axis=0,keepdims=True)
        mean = np.append(mean,m,axis=0)
        v = np.var(x_class,axis=0,keepdims=True)
        var = np.append(var,v,axis=0)
    return prior_list,mean[1:],var[1:]

# 对样本进行分类
def predict(x_test,y_test,prior,mean,var):
#     防止分母为0
    _class = []
    eps = 1e-10  
    for i in x_test:
        x = np.tile(i,(3,1))
        p = (np.exp(-(x-mean)**2/(2*var+eps)))/(np.sqrt(2*np.pi)*var+eps)
        # 每个类别对应的后验概率,p(x/yi)
        p_after = np.sum(np.log(p),axis=1) 
        p_class = np.log(prior)+p_after
        _class.append(np.argmax(p_class))
    return _class
prior,mean,var=prior_Mean_Var(x_train,y_train)
y_pred = predict(x_test,y_test,prior,mean,var)

# 计算模型的准确率:
count=0
for i in range(len(y_test)):
    if(y_pred[i]==y_test[i]):
        count=count+1
accuracy = count/len(y_test)
print('accuracy: {:.2%}'.format(accuracy))

输出准确率:

贝叶斯回归树_机器学习_19