前言: 学习笔记,记录下对于一些问题的记录和理解,复习和加深记忆用,挖坑补坑用。
参考:李航 《统计学习方法》
0. 基本内容
P ( Y = c k ∣ X = x ) = P ( Y = c k ) P ( X = x ∣ Y = c k ) P ( X = x ) P(Y=c_k|X=x) = \frac{P(Y=c_k)P(X=x|Y=c_k)}{P(X=x)} P(Y=ck∣X=x)=P(X=x)P(Y=ck)P(X=x∣Y=ck)
1. 问题与理解
-
贝叶斯定理,朴素贝叶斯法,贝叶斯估计,极大似然估计
-
贝叶斯定理(生成模型): P ( Y = c k ∣ X = x ) = P ( Y = c k ) P ( X = x ∣ Y = c k ) P ( X = x ) P(Y=c_k|X=x) = \frac{P(Y=c_k)P(X=x|Y=c_k)}{P(X=x)} P(Y=ck∣X=x)=P(X=x)P(Y=ck)P(X=x∣Y=ck)
-
朴素贝叶斯法:是一种方法,用于分类。是基于贝叶斯定理同时对条件概率分布作了特征条件独立假设。独立假设即: P ( X = x ∣ Y = c k ) = ∑ i = 1 n P ( X ( i ) = x ( i ) ∣ Y = c k ) P(X=x|Y=c_k) = \sum_{i=1}^{n} P(X^{(i)} = x^{(i)}|Y=c_k) P(X=x∣Y=ck)=∑i=1nP(X(i)=x(i)∣Y=ck)。这一假设大大简化了模型,同时也是朴素贝叶斯法的由来。
该算法可表述为,对于给定实例x,确定实例的分类y:
y = a r g m a x c k P ( Y = c k ) P ( X ∣ Y = c k ) y =arg\ \underset{c_k}{max}\ P(Y=c_k)P(X|Y=c_k) y=arg ckmax P(Y=ck)P(X∣Y=ck) -
贝叶斯估计,极大似然估计:是一种参数估计方法,都可用于朴素贝叶斯法中的参数估计。注:朴素贝叶斯法参数并非一定用贝叶斯估计求得。
-
-
极大似然估计与贝叶斯估计推导
对于一个事件Y,可能取值为 y 1 , y 2 , y 3 , . . . , y k {y_1, y_2, y_3, ..., y_k} y1,y2,y3,...,yk。现对事件Y进行试验,得到一个样本Y’: y 4 , y 1 , y 1 , . . . . , y k {y_4, y_1, y_1, ...., y_k} y4,y1,y1,....,yk,在已知样本情况下,估计Y对应取值的概率(离散估计取值概率,连续估计概率密度)。
(参考实例:事件Y==>掷骰子; 可能取值==> {1,2,3,4,5,6}; 投掷n次,样本==>{2, 3, 6, 2, …}, 估计P(Y=n) n=1,2,3,4,5,6)。若设 y 1 , y 2 , y 3 , . . . , y k {y_1, y_2, y_3, ..., y_k} y1,y2,y3,...,yk对应取值概率设为 θ 1 , θ 2 , θ 3 , . . . , θ k {\theta_1, \theta_2, \theta_3, ..., \theta_k} θ1,θ2,θ3,...,θk,即估计 θ i \theta_i θi值。
-
极大似然估计
其假定 θ i \theta_i θi 为定值。
对于样本 y 4 , y 1 , y 1 , . . . . , y k {y_4, y_1, y_1, ...., y_k} y4,y1,y1,....,yk,似然函数表示为:
l ( θ ) = θ 4 θ 1 θ 1 . . . . . θ k = θ 1 m 1 θ 2 m 2 θ 3 m 3 . . . θ k m k ( m k 表 示 样 本 中 y k 出 现 的 次 数 ) l(\theta) = \theta_4 \theta_1 \theta_1 .....\theta_k=\theta_1^{m_1} \theta_2^{m_2} \theta_3^{m_3}...\theta_k^{m_k} \ (m_k表示样本中y_k出现的次数) l(θ)=θ4θ1θ1.....θk=θ1m1θ2m2θ3m3...θkmk (mk表示样本中yk出现的次数)
取对数:
l n ( l ( θ ) ) = m 1 l n θ 1 + m 2 l n θ 2 + . . . + m k l n θ k ln(l(\theta)) = m_1ln\theta_1+m_2ln\theta_2+...+m_kln\theta_k ln(l(θ))=m1lnθ1+m2lnθ2+...+mklnθk
问题等价于:
{ 求 解 θ : m a x θ l n ( l ( θ ) ) s . t . θ 1 + θ 2 + . . . θ k = 1 \left\{\begin{aligned}求解\theta:\ \ \ \ \ \ \ \underset{\theta}{max}\ ln(l(\theta)) \\s.t.\ \ \theta_1+\theta_2+...\theta_k = 1 \end{aligned}\right. ⎩⎨⎧求解θ: θmax ln(l(θ))s.t. θ1+θ2+...θk=1
此为有等式约束的最优化问题,使用拉格朗日乘子法,构建拉格朗日函数:
L ( θ ) = l n ( l ( θ ) ) + λ ( θ 1 + θ 2 + . . . + θ k − 1 ) L(\theta) = ln(l(\theta)) + \lambda(\theta_1+\theta_2+...+\theta_k-1) L(θ)=ln(l(θ))+λ(θ1+θ2+...+θk−1)
求偏导 ∂ L ( θ ) ∂ θ i = 0 \frac{\partial L(\theta)}{\partial \theta_i} = 0 ∂θi∂L(θ)=0得:
∂ L ( θ ) ∂ θ i = 0 = > { m 1 θ 1 + λ = 0 = > θ 1 = − m 1 λ m 2 θ 2 + λ = 0 = > θ 2 = − m 2 λ . . . . . . m k θ k + λ = 0 = > θ k = − m k λ \frac{\partial L(\theta)}{\partial \theta_i} = 0\ \ \ \ => \ \ \ \ \left\{ \begin{aligned}\\ \frac{m_1}{\theta_1}+\lambda = 0 & => &\theta_1=-\frac{m_1}{\lambda}\\ \frac{m_2}{\theta_2}+\lambda = 0 & => &\theta_2=-\frac{m_2}{\lambda} \\ ...... \\ \frac{m_k}{\theta_k}+\lambda = 0 & => &\theta_k=-\frac{m_k}{\lambda} \end{aligned} \right. ∂θi∂L(θ)=0 => ⎩⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎧θ1m1+λ=0θ2m2+λ=0......θkmk+λ=0=>=>=>θ1=−λm1θ2=−λm2θk=−λmk
再根据 θ 1 + θ 2 + . . . θ k = 1 \theta_1+\theta_2+...\theta_k = 1 θ1+θ2+...θk=1得:
θ 1 + θ 2 + . . . θ k = 1 = > { λ = − ( m 1 + m 2 + m 3 + . . . + m k ) = − N θ i = m i N \theta_1+\theta_2+...\theta_k = 1\ \ \ \ => \ \ \ \ \left\{ \begin{aligned}\\ \lambda = -(m_1+m_2+m_3+...+m_k) = -N\\ \theta_i = \frac{m_i}{N} \end{aligned} \right. θ1+θ2+...θk=1 => ⎩⎨⎧λ=−(m1+m2+m3+...+mk)=−Nθi=Nmi
也即:
θ ^ i = m i N \hat\theta_i = \frac{m_i}{N} θ^i=Nmi -
贝叶斯估计
其假定 θ i \theta_i θi并非定值,受到一定限制,例如大致服从某一分布。
对于上述例子,假设 θ \theta θ 服从某一先验分布,如 P ( θ ) = η θ 1 α 1 θ 2 α 2 . . . θ k α k P(\theta) = \eta \theta_1^{\alpha_1} \theta_2^{\alpha_2} ...\theta_k^{\alpha_k} P(θ)=ηθ1α1θ2α2...θkαk
则根据贝叶斯估计:
p ( θ ∣ Y ′ ) = p ( θ ) p ( Y ′ ∣ θ ) p ( Y ) p(\theta|Y') = \frac{p(\theta) p(Y'|\theta)}{p(Y)} \\ p(θ∣Y′)=p(Y)p(θ)p(Y′∣θ)
m a x θ p ( θ ∣ Y ′ ) = > m a x θ p ( θ ) p ( Y ′ ∣ θ ) \underset{\theta}{max}\ p(\theta|Y') => \underset{\theta}{max}\ p(\theta)p(Y'|\theta)\\ θmax p(θ∣Y′)=>θmax p(θ)p(Y′∣θ)
其中:
p ( θ ) = η θ 1 α θ 2 α . . . θ k α p(\theta) = \eta \theta_1^{\alpha}\theta_2^{\alpha}...\theta_k^{\alpha} \\ p(θ)=ηθ1αθ2α...θkα
p ( Y ′ ∣ θ ) p(Y'|\theta) p(Y′∣θ)也即使前面极大似然估计中 l ( θ ) l(\theta) l(θ):
p ( Y ′ ∣ θ ) = θ 4 θ 1 θ 1 . . . . . θ k = θ 1 m 1 θ 2 m 2 θ 3 m 3 . . . θ k m k p(Y'|\theta) = \theta_4 \theta_1 \theta_1 .....\theta_k=\theta_1^{m_1} \theta_2^{m_2} \theta_3^{m_3}...\theta_k^{m_k}\\ p(Y′∣θ)=θ4θ1θ1.....θk=θ1m1θ2m2θ3m3...θkmk
最优化问题:
m a x θ { p ( θ ) p ( Y ′ ∣ θ ) } = > m a x θ { η θ 1 α θ 2 α . . . θ k α θ 1 m 1 θ 2 m 2 . . . θ k m k } = > m a x θ { θ 1 α + m 1 θ 2 α + m 2 . . . θ k α + m k } \underset{\theta}{max}\{ p(\theta)p(Y'|\theta)\}=>\underset{\theta}{max}\{\eta \theta_1^{\alpha}\theta_2^{\alpha}...\theta_k^{\alpha}\theta_1^{m_1}\theta_2^{m_2}...\theta_k^{m_k}\}=>\underset{\theta}{max}\{\theta_1^{\alpha+m_1}\theta_2^{\alpha+m_2}...\theta_k^{\alpha+m_k}\} θmax{p(θ)p(Y′∣θ)}=>θmax{ηθ1αθ2α...θkαθ1m1θ2m2...θkmk}=>θmax{θ1α+m1θ2α+m2...θkα+mk}
该最优化问题的解,根据极大似然估计的解决步骤,可以得出:
θ ^ i = m i + α N + k α \hat \theta_i = \frac{m_i+\alpha}{N+k\alpha} θ^i=N+kαmi+α
-
-
极大似然估计与贝叶斯估计的比较
- 当样本中测试数量足够大时,即 N 足够大时,可以根据式子看出,极大似然估计与贝叶斯估计结果等价。
- 当N很小的时候,极有可能样本中出现某种Y取值情况数为零的情况,即 m i = 0 m_i=0 mi=0,因此会出现 θ i = 0 \theta_i=0 θi=0,导致 l ( θ ) = 0 l(\theta)=0 l(θ)=0。此时最优化问题求解就会有问题。对比于极大似然估计,就可以杜绝这种问题的发生。特别的,当 α = 1 \alpha=1 α=1时,为拉普拉斯平滑;当 α = 0 \alpha=0 α=0时,就为极大似然估计。
- 极大似然估计的先验分布,可根据具体情况选择。常用的有高斯分布,多项式分布等。
2. 实例与实现
- 训练数据
X : 特征; Y : 类标记 预测:x = (2, S)
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
X_1 | 1 | 1 | 1 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 3 | 3 | 3 | 3 | 3 |
X_2 | 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 |
- 代码实现
import numpy as np
import pandas as pd
class bayes():
def __init__(self):
pass
# 计算p(y)
def Py(self):
y_info = self.df.y.value_counts()
K = y_info.count()
self.Py = (y_info + self.l)/ float((y_info.sum() + K*self.l))
# print('Py: ')
# print(self.Py)
# 计算p(x|y)
def Px_y(self):
# print(self.df)
self.Px_y = pd.DataFrame()
S = [self.x[i].value_counts().shape[0] for i in self.x.columns]
y_ = self.df.y.value_counts().index
for _y in y_:
y_df = self.df.loc[self.df['y'] == _y]
# print(y_df)
dfxy = pd.DataFrame()
for i,_x in enumerate(self.x.columns):
_x_info = y_df[_x].value_counts()
xy = (_x_info + self.l)/ float((y_df.count().y + S[i]*self.l))
# print(xy)
df = pd.DataFrame({'%s'%_y:xy})
dfxy = dfxy.append(df)
# print(dfxy)
self.Px_y =pd.concat([self.Px_y, dfxy], axis = 1, sort = False)
# print('Px_y: ')
# print(self.Px_y)
# 参数估计:当l=0时,采用极大似然估计;l=1时,拉普拉斯平滑
def fit(self, x_data, y_label, l = 0):
x_data = np.array(x_data)
y_data = np.array(y_label)
'''
if len(x_data.shape) == 1:
x_col = ['x_0']
else:
x_col = ['x_%s'%i for i in range(x_data.shape[-1])]
'''
self.x = pd.DataFrame(x_data)
self.y = pd.DataFrame(y_data, columns = ['y'])
df = pd.concat([self.x,self.y], axis=1)
self.l = l
self.df = df
self.Py()
self.Px_y()
# 分类预测
def predict(self, x):
predict_dic = {}
y_ = self.df.y.value_counts().index
for _y in y_:
py = self.Py[_y]
for _x in x:
py *= float(self.Px_y[str(_y)][str(_x)])
predict_dic[_y] = py
# 结果输出包含各类概率的字典
#result = sorted(predict_dic.items(), key = lambda x:x[1], reverse = True)
#print(result)
return predict_dic
if __name__ == '__main__':
x_data = [
[1, 'S'], [1, 'M'], [1, 'M'], [1, 'S'], [1, 'S'],\
[2, 'S'], [2, 'M'], [2, 'M'], [2, 'L'], [2, 'L'],\
[3, 'L'], [3, 'M'], [3, 'M'], [3, 'L'], [3, 'L']\
]
y_label =[-1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1, 1, 1, -1]
B = bayes()
B.fit(x_data, y_label, 1)
p = B.predict([2, 'S'])
print(p)
结果展示:
使用贝叶斯估计参数,得到预测分类的概率分别为
实例应用:
- 垃圾邮件过滤: 训练一个模型,判定邮件是垃圾邮件与否(网上实现较多;挖坑)
- 新闻文本分类: 给定一篇文章,判定其所属类型。