最全朴素贝叶斯算法原理详解及python 代码实现
背景
朴素贝叶斯是⼀种分类算法,基于贝叶斯定理,是⼀种⽣成模型。
补充:
1. ⽣成模型:学习得到联合概率分布P(x,y),即特征x和标记y共同出现的概率,然后求条件概率分布P(y|x),能够学习到数据⽣成的机制。分类⽅法中⽣成模型的代表就是朴素贝叶斯算法,参考 [此处]。(www.zhihu/question/20446337)优势:
(1)⽣成给出的是联合分布,不仅能够由联合分布计算条件分布,还可以给出其他信息,⽐如可以使⽤来计算边缘分布。如果⼀个输⼊样本的边缘分布很⼩的话,那么可以认为学习出的这个模型可能不太适合对这个样本进⾏分类,分类效果可能会不好,这也是所谓的outlier detection。
(2)⽣成模型收敛速度⽐较快,即当样本数量较多时,⽣成模型能更快地收敛于真实模型。
(3)⽣成模型能够应付存在隐变量的情况,⽐如混合⾼斯模型就是含有隐变量的⽣成⽅法。
2. 判别模型:学习得到条件概率分布P(y|x),即在特征x出现的情况下标记y出现的概率。
原理
朴素贝叶斯法的假设:每个特征是条件独⽴的。
朴素贝叶斯没有参数,直接根据训练样本获取联合分布概率,具体原理如下:
训练集 朴素贝叶斯通过训练集学习联合概率分布⾸先通过训练数据计算先验概率分布则条件概率分布如下:
朴素贝叶斯对条件概率做独⽴性假设,具体如下
这⼀假设时朴素贝叶斯变得简单,但也牺牲⼀定的分类准确率。
定义模型
那么接下来讲解朴素贝叶斯是怎么实现分类任务的:
根据训练数据可以求出:
1. 2. T ={(x ,y ),(x ,y ),...,(x ,y )}
1122N N P (X ,Y )
P (Y =c ),k =k 1,2,...,K
P (X =x ∣Y =c )=k P (X =(1)x ,...,X =(1)(n )x ),k =(n )1,2,...,K
P (X =x ∣Y =c )=k P (X =(1)x ,...,X =(1)(n )x )
(n )=P (X =i =1∏n (i )x ∣Y =(i )c )
k P (X =x ∣Y =c )
k P (Y =c )
k
则可以根据以上两个值计算后验概率,然后选择后验概率最⼤的类别作为预测结果。
其中后验概率根据贝叶斯定理计算:
于是贝叶斯分类器可以表⽰如下:
求先验(以MultiNomial Naive Bayes 为例)
可以利⽤极⼤似然估计求出下⾯两个先验值:
表⽰第i个特征的第l个去取值。
后验概率最⼤化的含义
P (Y =c ∣X =k x )P (Y =c ∣X =k x )=P (X =x ∣Y =c )∗P (Y =c )
∑k k k P (X =x ∣Y =c )∗P (Y =c )
k k =P (Y =c )P (X =x ∣Y =c )∑k k ∏i =1n (i )(i )k P (Y =c )P (X =x ∣Y =c )k ∏i =1n
(i )(i )k y =f (x )=c k argmax P (Y =c )P (X =x ∣Y =c )∑k k ∏i =1n (i )(i )k P (Y =c )P (X =x ∣Y =c )k ∏i =1n
(i )(i )k P (Y =c )=k N I (y =c )
∑i =1N
i k P (X =(i )a ∣Y =il c )=k I (y =c )∑i =1N
i k I (x =a ,y =c )
∑i =1N i (i )il i k i =1,2,...,n ;k =1,2,...,K
a il
朴素贝叶斯将分类结果定位后验概率最⼤的类别,等价于期望风险最⼩化
假设损失函数:
则分类器f对应的期望风险函数为:
则条件期望如下:
为了使风险最⼩,则对每个样本极⼩化,以此求出:
这样通过期望风险最⼩化准则就得到了后验概率最⼤化准则:
即朴素贝叶斯法采⽤的原理
三种朴素贝叶斯
根据应⽤场景不同,有三种对应类型:
L (Y ,f (X ))={1,Y =f (X )
0,Y =f (X )
R (f )=exp E [L (Y ,f (X ))]
R (f )=exp E [L (c ,f (X ))]P (c ∣X )X k =1∑K
k k R (f )exp f f (x )=L (c ,f (X ))P (c ∣X =y ∈Y
argmin k =1∑K k k x )
=P (Y =y ∈Y argmin k =1∑K
c ∣X =k x )=(1−y ∈Y argmin P (Y =c ∣X =k x ))
=P (Y =y ∈Y argmax c ∣X =k x )
f (x )=P (c ∣X =c k argmax k x )
1. Gaussian Naive Bayes:适合在特征变量具有连续性的时候使⽤,同时它还假设特征遵从于⾼斯分布(正态分布)。该⽅法假设特征
项都是正态分布,然后通过样本计算出均值与标准差,这样就得到了正态分布的密度函数,有了密度函数,就可以代⼊值,进⽽在预测的时候算出某⼀点的密度函数的值。
2. MultiNomial Naive Bayes:与Gaussian Naive Bayes相反,多项式模型更适合处理特征是离散变量的情况,该模型会在计算先验
概率和条件概率,会做拉普拉斯平滑:
它的思想其实就是对每类别下所有划分的计数加1,这样如果训练样本数量⾜够⼤时,就不会对结果产⽣影响,并且解决了的频率为0的现象(某个类别下的某个特征划分没有出现,这会严重影响分类器的质量)。
3. Bernoulli Naive Bayes:Bernoulli适⽤于在特征属性为⼆进制的场景下,它对每个特征的取值是基于布尔值的,⼀个典型例⼦就是
判断单词有没有在⽂本中出现。
最常⽤的Gaussian NB python 代码实现及讲解
⾸先简单介绍Gaussian NB python的先验公式(带拉普拉斯平滑):
使⽤sklearn⾃带数据集
from  sklearn import  datasets
from  sklearn .model_selection import  train_test_split
def  load_data ():
cancer = datasets .load_breast_cancer ()
X = cancer .data
y = cancer .target
X_train , X_test , y_train , y_test = train_test_split (X , y )
return  X_train , X_test , y_train , y_test
按类别分隔数据
P (c )k P (X =(i )a ∣Y =il c )k P (Y =c )=k N +K I (y =c )+1
∑i =1N
i k P (X =(i )a ∣Y =il c )=k I (y =c )+K ∑i =1N
i k I (x =a ,y =c )+1
∑i =1N i (i )il i k P (X =(i )a ∣Y =il c )k P (Y =c )=k N +K I (y =c )+1
∑i =1N
i k P (X =(i )a ∣Y =il c )=k e 2πσ12σ
−(X −μ)(i )i 2
def SepByClass(self, X, y):
###按类别分隔数据###
###输⼊未分类的特征和⽬标,输出分类完成的数据(字典形式)###
self.num_of_samples =len(y)# 总样本数
y = y.reshape(X.shape[0],1)
data = np.hstack((X, y))# 把特征和⽬标合并成完整数据
data_byclass ={}# 初始化分类数据,为⼀个空字典
# 提取各类别数据,字典的键为类别名,值为对应的分类数据
for i in range(len(data[:,-1])):
if i in data[:,-1]:
data_byclass[i]= data[data[:,-1]== i]
self.class_name =list(data_byclass.keys())# 类别名
self.num_of_class =len(data_byclass.keys())# 类别总数
return data_byclass
μσ
计算每个特征的⾼斯分布参数,:
def CalMeanPerFeature(self, X_byclass):
###计算各类别特征各维度的平均值###
###输⼊当前类别下的特征,输出该特征各个维度的平均值###
X_mean =[]
for i in range(X_byclass.shape[1]):
X_mean.an(X_byclass[:, i]))
return X_mean
def CalVarPerFeature(self, X_byclass):
###计算各类别特征各维度的⽅差###
###输⼊当前类别下的特征,输出该特征各个维度的⽅差###
X_var =[]
for i in range(X_byclass.shape[1]):
X_var.append(np.var(X_byclass[:, i]))
return X_var
计算每个类别的先验概率(带拉普拉斯平滑):
def CalPriorProb(self, y_byclass):
python新手代码及作用
###计算y的先验概率(使⽤拉普拉斯平滑)###
###输⼊当前类别下的⽬标,输出该⽬标的先验概率###
# 计算公式:(当前类别下的样本数+1)/(总样本数+类别总数)
return(len(y_byclass)+1)/(self.num_of_samples + self.num_of_class)
训练模型
def fit(self, X, y):
###训练数据###
###输⼊训练集特征和⽬标,输出⽬标的先验概率,特征的平均值和⽅差### # 将输⼊的X,y转换为numpy数组
X, y = np.asarray(X, np.float32), np.asarray(y, np.float32)
data_byclass = Gaussian_NB.SepByClass(X, y)# 将数据分类
# 计算各类别数据的⽬标先验概率,特征平均值和⽅差
for data in data_byclass.values():
X_byclass = data[:,:-1]
y_byclass = data[:,-1]
self.prior_list.append(Gaussian_NB.CalPriorProb(y_byclass))
预测

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。