小瓜讲机器学习——分类算法(三)朴素贝叶斯法(naive Bayes)算法原理及Python代码实现

3.朴素贝叶斯分类算法原理

朴素贝叶斯分类算法主要是基于概率模型建立的分类算法。

朴素贝叶斯分类算法本质:对于某分类问题和训练样本 T ( X , Z ) = { ( X ( 1 ) , Z ( 1 ) ) , ( X ( 2 ) , Z ( 2 ) ) , . . . , ( X ( n ) , Z ( n ) ) } T(X, Z)=\{(X^{(1)},Z^{(1)}),(X^{(2)},Z^{(2)}),...,(X^{(n)},Z^{(n)})\} T(X,Z)={(X(1),Z(1)),(X(2),Z(2)),...,(X(n),Z(n))},描述问题的特征向量为 X = ( x 1 , . . . , x l ) X=(x_1,...,x_l) X=(x1,...,xl),标签为 Z = ( z 1 , . . . , z m ) Z=(z_1,...,z_m) Z=(z1,...,zm),推测待预测点的正确分类结果,等同于当我们知道了待预测点的特征向量 X X X,取待预测点类别为 z i z_i zi的条件概率为最大值的那个分类,即
P ( Z = z i ∣ X ) = P ( X ∣ Z = z i ) P ( z i ) P ( X ) P(Z=z_i|X)=\frac {P(X|Z=z_i)P(z_i)}{P(X)} P(Z=ziX)=P(X)P(XZ=zi)P(zi)
取到最大。
这就是贝叶斯分类器,原理非常简单,实现也很简单。

3.1 P ( z i ) P(z_i) P(zi)如何计算
根据大数定理, P ^ ( z i ) \hat P(z_i) P^(zi)可以用样本 P ( z i ) P(z_i) P(zi)来估计,且是无偏估计,即
P ( z i ) = ∑ i = 1 N I ( Z = z i ) N P(z_i)=\frac {\sum_{i=1}^NI(Z=z_i)}{N} P(zi)=Ni=1NI(Z=zi)
3.2 P ( X ∣ z i ) P(X|z_i) P(Xzi)如何计算
在这里需要用到一个属性独立的假设,在该假设的前提条件下,可以把 P ( X ∣ z i ) P(X|z_i) P(Xzi)分解为各分量的条件概率连乘
P ( X ∣ z i ) = ∏ j = 1 l P ( x j ∣ z i ) P(X|z_i)=\prod_{j=1}^l P(x_j|z_i) P(Xzi)=j=1lP(xjzi)
估计 P ( x j ∣ z i ) P(x_j|z_i) P(xjzi)是相对容易的,直接采用样本中的条件概率来进行估计
P ( x j ∣ z i ) = P ( x j , z i ) P ( z i ) = ∑ i = 1 N I ( x = x j , Z = z i ) ∑ i = 1 N I ( Z = z i ) P(x_j|z_i)=\frac{P(x_j,z_i)}{P(z_i)}=\frac{\sum_{i=1}^NI(x=x_j,Z=z_i)}{\sum_{i=1}^NI(Z=z_i)} P(xjzi)=P(zi)P(xj,zi)=i=1NI(Z=zi)i=1NI(x=xj,Z=zi)
3.3 朴素贝叶斯分类算法
朴素贝叶斯分类算法的步骤如下

  1. 计算训练集的先验概率 P ( z i ) ‾ \overline {P(z_i)} P(zi)和条件概率 P ( x j ∣ z i ) ‾ \overline {P(x_j|z_i)} P(xjzi)
  2. 计算预测实例各类别的后验条件概率 P ( Z = z i ∣ X ) P(Z=z_i|X) P(Z=ziX)
    P ( Z = z i ∣ X ) = P ( X ∣ Z = z i ) P ( z i ) = ∏ j = 1 l P ( x j , z i ) ‾ ∙ P ( z i ) ‾ P(Z=z_i|X)=P(X|Z=z_i)P(z_i)=\prod_{j=1}^l\overline {P(x_j,z_i)}\bullet\overline {P(z_i)} P(Z=ziX)=P(XZ=zi)P(zi)=j=1lP(xj,zi)P(zi)
  3. 确定预测实例的分类标签
    Z = arg ⁡ max ⁡ z P ( Z = z i ∣ X ) Z=\arg \max_zP(Z=z_i|X) Z=argzmaxP(Z=ziX)

3.4朴素贝叶斯分类出现问题
概率为0的问题
对于样本不充分的情况下,容易出现先验概率或者条件概率为0的情况,为了解决这个问题,一般在估计概率的时候采用平滑处理,典型的是拉普拉斯平滑,即
P ( z i ) = ∑ i = 1 N I ( Z = z i ) + 1 N + K P(z_i)=\frac {\sum_{i=1}^NI(Z=z_i)+1}{N+K} P(zi)=N+Ki=1NI(Z=zi)+1
P ( z i ) = ∑ i = 1 N I ( x = x j , Z = z i ) + 1 ∑ i = 1 N I ( Z = z i ) + L P(z_i)=\frac{\sum_{i=1}^NI(x=x_j,Z=z_i)+1}{\sum_{i=1}^NI(Z=z_i)+L} P(zi)=i=1NI(Z=zi)+Li=1NI(x=xj,Z=zi)+1
连续变量的处理
对于连续变量考虑概率密度函数的方法,设定条件概率服从正太分布
P ( x i ∣ z i ) ~ N ( μ ( z i , i ) , σ ( z i , i ) 2 ) P(x_i|z_i)\text{\textasciitilde}N(\mu_{(z_i,i)}, \sigma_{(z_i,i)}^2) P(xizi)~N(μ(zi,i),σ(zi,i)2)
其中 μ c , i , σ c , i 2 \mu_{c,i}, \sigma_{c,i}^2 μc,i,σc,i2分别是第 z i z_i zi类样本在 x i x_i xi上取值的均值和方差,那么条件概率为
P ( x i ∣ z i ) = 1 2 π σ z i , i exp ⁡ ( − ( x i − μ z i , i ) 2 2 σ ( z i , i ) 2 ) P(x_i|z_i)=\frac{1}{\sqrt {2\pi}\sigma_{z_i,i}}\exp (-\frac{(x_i-\mu_{z_i,i})^2}{2\sigma_{(z_i,i)}^2 }) P(xizi)=2π σzi,i1exp(2σ(zi,i)2(xiμzi,i)2)
3.5 朴素贝叶斯分类Python代码实现


import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

with open(r'H:\python dataanalysis\navie Bayes\train-data2.txt') as f:
    train_data = []

    for loopline in f.readlines():
        line = loopline.strip().split('\t')
        train_data.append([np.float(line[0]),np.float(line[1]), np.int(line[2])])

train_data = pd.DataFrame(train_data, columns=['x', 'y', 'label'])

with open(r'H:\python dataanalysis\navie Bayes\predict-data2.txt') as f:
    predict_data = []

    for loopline in f.readlines():
        line = loopline.strip().split('\t')
        predict_data.append([np.float(line[0]),np.float(line[1]), np.int(line[2])])

predict_data = pd.DataFrame(predict_data, columns=['x', 'y', 'label'])

p1 = train_data.label.sum()
p0 = 1 - p1

miu1x = train_data.x[train_data.label == 1].mean()
miu1y = train_data.y[train_data.label == 1].mean()
miu0x = train_data.x[train_data.label == 0].mean()
miu0y = train_data.y[train_data.label == 0].mean()

var1x = train_data.x[train_data.label == 1].var()
var1y = train_data.y[train_data.label == 1].var()
var0x = train_data.x[train_data.label == 0].var()
var0y = train_data.y[train_data.label == 0].var()


px1 = np.exp(-(predict_data.x-miu1x).pow(2)/2/var1x).mul(1/np.sqrt(2*np.pi*var1x))
px0 = np.exp(-(predict_data.x-miu0x).pow(2)/2/var0x).mul(1/np.sqrt(2*np.pi*var0x))
py1 = np.exp(-(predict_data.y-miu1y).pow(2)/2/var1y).mul(1/np.sqrt(2*np.pi*var1y))
py0 = np.exp(-(predict_data.y-miu0y).pow(2)/2/var0y).mul(1/np.sqrt(2*np.pi*var0y))


pxy1 = px1.mul(py1)
pxy0 = px0.mul(py0)

p1xy = pxy1.mul(p1)
p0xy = pxy0.mul(p1)
predict_data['Bayes'] = p0xy-p1xy
predict_data.Bayes[predict_data.Bayes>0] = 0
predict_data.Bayes[predict_data.Bayes<0] = 1
print(predict_data)

plt.scatter(predict_data.x[predict_data.Bayes==0], predict_data.y[predict_data.Bayes==0], marker='+', c='red')
plt.scatter(predict_data.x[predict_data.Bayes==1], predict_data.y[predict_data.Bayes==1], marker='o', c='red')
plt.scatter(train_data.x[train_data.label==0], train_data.y[train_data.label==0], marker='+', c='green')
plt.scatter(train_data.x[train_data.label==1], train_data.y[train_data.label==1], marker='o', c='blue')
plt.show()

结果如下,绿色和蓝色为样本点,红色为待预测点。
小瓜讲机器学习——分类算法(三)朴素贝叶斯法(naive Bayes)算法原理及Python代码实现_第1张图片

参考文献:

[1] 机器学习[M]. 周志华.
[2] 统计学习方法[M]. 李航

文章导引列表:
机器学习
1.小瓜讲机器学习——分类算法(一)logistic regression(逻辑回归)算法原理详解
2. 小瓜讲机器学习——分类算法(二)支持向量机(SVM)算法原理详解
3. 小瓜讲机器学习——分类算法(三)朴素贝叶斯法(naive Bayes)算法原理及Python代码实现
4. 小瓜讲机器学习——分类算法(四)K近邻法算法原理及Python代码实现
5. 待续


数据分析
  1. 小呆学数据分析——使用pandas中的merge函数进行数据集合并
  2. 小呆学数据分析——使用pandas中的concat函数进行数据集堆叠
  3. 小呆学数据分析——pandas中的层次化索引
  4. 小呆学数据分析——使用pandas的pivot进行数据重塑
  5. 小呆学数据分析——用duplicated/drop_duplicates方法进行重复项处理
  6. 小呆学数据分析——缺失值处理(一)
  7. 小呆学数据分析——异常值判定与处理(一)
  8. 小瓜讲数据分析——数据清洗

数据可视化
  1. 小瓜讲数据分析——数据可视化工程(matplotlib库使用基础篇)
  2. 小瓜讲matplotlib高级篇——坐标轴设置(坐标轴居中、坐标轴箭头、刻度设置、标识设置)

你可能感兴趣的:(Python数据分析,机器学习,Python)