朴素贝叶斯 (native Bayes) 是基于贝叶斯定理与特征条件独立假设的分类方法。
贝叶斯定理便是基于条件概率,通过P(A|B)来求P(B|A):
P(B|A)=P(A|B)P(B)P(A)
顺便提一下,上式中的分母P(A),可以根据全概率公式分解为:
P(A)=∑ni=P(Bi)P(A|Bi)
求出所有的后验概率,就可以得到问题的解
算法实现可以分类两个过程:
- 对于给定的训练数据集,先经过基于特征条件独立假设学习输入\输出的联合概率密度;
- 根据上一步计算的结果,对于给定的输入,利用Bayes定理求出后验概率,概率最大所对应的类别即为所求类别
例子,有如下训练数据,15个样本,2维特征X1,X2,2种类别-1,1。给定测试样本x=(2,S)T,判断其类别。
训练数据:
{‘x1’:[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],
‘x2’:[‘S’,’M’,’M’,’S’,’S’,’S’,’M’,’M’,’L’,’L’,’L’,’M’,’M’,’L’,’L’],
‘y’:[-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]}
解答如下:
# -*- coding: utf-8 -*-
"""
Created on Sun Nov 12 10:53:22 2017
@author: mynumber
"""
import pandas as pd
#Fraction 可以用来表示分数
from fractions import Fraction
#计算条件概率的乘积
def fin_data1(data,x,y):
column=data.columns
column=column[0:len(column)-1]
data_y=data[data['y'].isin([y])]
p=1
xi=0
for word in column:
x_set=x[xi]
xi+=1
data_y_x=data_y[data_y[word].isin([x_set])] #统计有多少满足条件的数据
p=p*Fraction(len(data_y_x),len(data_y)) #计算条件概率
return p
#计算先验概率
def fin_data2(data,y):
return Fraction(len(data[data['y'].isin([y])]),len(data))
def answer(data,x):
y_data=data['y'].unique()
P=[]
for i in y_data:
p1=fin_data2(data,i)*fin_data1(data,x,i) #分别计算x被分到所有类别的概率
P.append(p1)
print(' y取%d时的概率为%s' %(i,P[i]))
p_max=max(P)
dx=P.index(p_max)
print('概率最大值是:%s,对应的y值为%d'%(p_max,y_data[dx]))
#先验知识,使用DataFrame进行存储
data_dict={'x1':[1,1,1,1,1,2,2,2,2,2,3,3,3,3,3],
'x2':['S','M','M','S','S','S','M','M','L','L','L','M','M','L','L'],
'y':[-1,-1,1,1,-1,-1,-1,1,1,1,1,1,1,1,-1]}
data=pd.DataFrame(data_dict)
#测试数据
x=(2,'S')
print('when input is ',x)
print('The answer are :')
answer(data,x)
#结果如下:
when input is (2, 'S')
The answer are :
y取-1时的概率为1/15
y取1时的概率为1/45
概率最大值是:1/15,对应的y值为-1
参考文献:
- 《统计学习方法》,李航