新手村:逻辑回归-理解03:逻辑回归中的最大似然函数
1. 似然函数
假设我们有一个二分类问题,其中 N N N 个样本的数据集为 { ( x 1 , y 1 ) , ( x 2 , y 2 ) , … , ( x N , y N ) } \{(x_1, y_1), (x_2, y_2), \ldots, (x_N, y_N)\} {(x1,y1),(x2,y2),…,(xN,yN)},每个样本 x i x_i xi 对应一个标签 y i ∈ { 0 , 1 } y_i \in \{0, 1\} yi∈{0,1}。
对于每个样本 i i i,我们可以用逻辑回归模型来预测其属于类别1的概率:
y ^ i = P ( y i = 1 ∣ x i ; w , b ) = σ ( w T x i + b ) \hat{y}_i = P(y_i = 1 | x_i; w, b) = \sigma(w^T x_i + b) y^i=P(yi=1∣xi;w,b)=σ(wTxi+b)
其中 σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+e−z1 是sigmoid函数, w w w 是权重向量, b b b 是偏置项。
2. 单个样本的条件概率
对于单个样本 i i i,其条件概率可以表示为:
P ( y i ∣ x i ; w , b ) = { y ^ i if y i = 1 1 − y ^ i if y i = 0 P(y_i | x_i; w, b) = \begin{cases} \hat{y}_i & \text{if } y_i = 1 \\ 1 - \hat{y}_i & \text{if } y_i = 0 \end{cases} P(yi∣xi;w,b)={y^i1−y^iif yi=1if yi=0
为了方便数学上的操作,我们希望把这两个分支合并成一个通用的公式。注意到:
- 当 y i = 1 y_i = 1 yi=1,我们需要保留 y ^ i \hat{y}_i y^i 并忽略 1 − y ^ i 1 - \hat{y}_i 1−y^i。
- 当 y i = 0 y_i = 0 yi=0,我们需要保留 1 − y ^ i 1 - \hat{y}_i 1−y^i 并忽略 y ^ i \hat{y}_i y^i。
因此,我们可以引入 幂运算 来实现这一点:
P ( y i ∣ x i ; w , b ) = y ^ i y i ( 1 − y ^ i ) 1 − y i . P(y_i | x_i; w, b) = \hat{y}_i^{y_i} (1 - \hat{y}_i)^{1-y_i}. P(yi∣xi;w,b)=y^iyi(1−y^i)1−yi.
解释:
- 当 y i = 1 y_i = 1 yi=1:
- 此时 y i y i = y ^ i 1 = y ^ i y_i^{y_i} = \hat{y}_i^1 = \hat{y}_i yiyi=y^i1=y^i,
- 而 ( 1 − y ^ i ) 1 − y i = ( 1 − y ^ i ) 0 = 1 (1 - \hat{y}_i)^{1-y_i} = (1 - \hat{y}_i)^0 = 1 (1−y^i)1−yi=(1−y^i)0=1。
- 所以整个表达式变为 P ( y i ∣ x i ; w , b ) = y ^ i P(y_i | x_i; w, b) = \hat{y}_i P(yi∣xi;w,b)=y^i,符合我们的预期。
- 当 y i = 0 y_i = 0 yi=0:
- 此时 y ^ i y i = y ^ i 0 = 1 \hat{y}_i^{y_i} = \hat{y}_i^0 = 1 y^iyi=y^i0=1,
- 而 ( 1 − y ^ i ) 1 − y i = ( 1 − y ^ i ) 1 = 1 − y ^ i (1 - \hat{y}_i)^{1-y_i} = (1 - \hat{y}_i)^1 = 1 - \hat{y}_i (1−y^i)1−yi=(1−y^i)1=1−y^i。
- 所以整个表达式变为 P ( y i ∣ x i ; w , b ) = 1 − y ^ i P(y_i | x_i; w, b) = 1 - \hat{y}_i P(yi∣xi;w,b)=1−y^i,也符合我们的预期。
指数的作用
通过使用 y ^ i y i \hat{y}_i^{y_i} y^iyi 和 ( 1 − y ^ i ) 1 − y i (1 - \hat{y}_i)^{1-y_i} (1−y^i)1−yi,我们巧妙地利用了 y i y_i yi 的值(0或1)来选择合适的项:
- 当 y i = 1 y_i = 1 yi=1,第一项 y ^ i y i \hat{y}_i^{y_i} y^iyi 生效,第二项被消除。
- 当 y i = 0 y_i = 0 yi=0,第二项 ( 1 − y ^ i ) 1 − y i (1 - \hat{y}_i)^{1-y_i} (1−y^i)1−yi 生效,第一项被消除。
这种技巧的优点在于它允许我们在数学上用一个统一的表达式来描述两种不同的情况,而不需要显式的分支判断
。
P ( y i ∣ x i ; w , b ) = y ^ i y i ( 1 − y ^ i ) 1 − y i P(y_i | x_i; w, b) = \hat{y}_i^{y_i} (1 - \hat{y}_i)^{1-y_i} P(yi∣xi;w,b)=y^iyi(1−y^i)1−yi
3. 似然函数
似然函数是所有样本条件概率的乘积:
L ( w , b ) = ∏ i = 1 N P ( y i ∣ x i ; w , b ) = ∏ i = 1 N ( y ^ i y i ( 1 − y ^ i ) 1 − y i ) L(w, b) = \prod_{i=1}^N P(y_i | x_i; w, b) = \prod_{i=1}^N \left( \hat{y}_i^{y_i} (1 - \hat{y}_i)^{1-y_i} \right) L(w,b)=i=1∏NP(yi∣xi;w,b)=i=1∏N(y^iyi(1−y^i)1−yi)
4. 对数似然函数
为了简化优化过程,通常取似然函数的自然对数(ln),称为对数似然函数:
log L ( w , b ) = log ( ∏ i = 1 N ( y ^ i y i ( 1 − y ^ i ) 1 − y i ) ) \log L(w, b) = \log \left( \prod_{i=1}^N \left( \hat{y}_i^{y_i} (1 - \hat{y}_i)^{1-y_i} \right) \right) logL(w,b)=log(i=1∏N(y^iyi(1−y^i)1−yi))
利用对数的性质 log ( a b ) = log ( a ) + log ( b ) \log(ab) = \log(a) + \log(b) log(ab)=log(a)+log(b),我们可以将乘积转换为求和:
log L ( w , b ) = ∑ i = 1 N log ( y ^ i y i ( 1 − y ^ i ) 1 − y i ) \log L(w, b) = \sum_{i=1}^N \log \left( \hat{y}_i^{y_i} (1 - \hat{y}_i)^{1-y_i} \right) logL(w,b)=i=1∑Nlog(y^iyi(1−y^i)1−yi)
进一步利用对数的性质 log ( a b ) = b log ( a ) \log(a^b) = b \log(a) log(ab)=blog(a),得到:
log L ( w , b ) = ∑ i = 1 N ( y i log ( y ^ i ) + ( 1 − y i ) log ( 1 − y ^ i ) ) \log L(w, b) = \sum_{i=1}^N \left( y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right) logL(w,b)=i=1∑N(yilog(y^i)+(1−yi)log(1−y^i))
这就是我们熟悉的对数似然函数的形式。
完整推导总结
-
似然函数:
L ( w , b ) = ∏ i = 1 N ( y ^ i y i ( 1 − y ^ i ) 1 − y i ) L(w, b) = \prod_{i=1}^N \left( \hat{y}_i^{y_i} (1 - \hat{y}_i)^{1-y_i} \right) L(w,b)=i=1∏N(y^iyi(1−y^i)1−yi) -
对数似然函数:
log L ( w , b ) = ∑ i = 1 N ( y i log ( y ^ i ) + ( 1 − y i ) log ( 1 − y ^ i ) ) \log L(w, b) = \sum_{i=1}^N \left( y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right) logL(w,b)=i=1∑N(yilog(y^i)+(1−yi)log(1−y^i))
可视化对数似然函数
为了更好地理解对数似然函数的行为,我们可以绘制不同预测概率下的对数似然函数曲线。
import numpy as np
import matplotlib.pyplot as plt# 定义对数似然函数
def log_likelihood(y_true, y_pred):"""计算二分类问题的对数似然函数:param y_true: 真实标签 (0或1):param y_pred: 预测概率 (0到1之间的浮点数):return: 对数似然函数值"""epsilon = 1e-15 # 防止log(0)错误y_pred = np.clip(y_pred, epsilon, 1 - epsilon)return y_true * np.log(y_pred) + (1 - y_true) * np.log(1 - y_pred)# 构造一系列不同的预测概率y_pred,并计算对应的对数似然值
y_pred_values = np.linspace(0.01, 0.99, 400) # 预测概率从0.01到0.99# 真实标签为1的情况
ll_y_true_1 = [log_likelihood(1, y_pred) for y_pred in y_pred_values]# 真实标签为0的情况
ll_y_true_0 = [log_likelihood(0, y_pred) for y_pred in y_pred_values]# 可视化对数似然函数随预测概率的变化趋势
plt.figure(figsize=(10, 6))
plt.plot(y_pred_values, ll_y_true_1, label='真实标签为1', color='blue')
plt.plot(y_pred_values, ll_y_true_0, label='真实标签为0', color='red')plt.title("二分类问题中的对数似然函数", fontsize=16)
plt.xlabel("预测概率 $P(y=1|x)$", fontsize=14)
plt.ylabel("对数似然函数值", fontsize=14)
plt.grid(True)
plt.legend(fontsize=12)
plt.tight_layout()
plt.show()
说明
-
对数似然函数定义:
- 函数
log_likelihood
根据公式 log L ( w , b ) = y i log ( y ^ i ) + ( 1 − y i ) log ( 1 − y ^ i ) \log L(w, b) = y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) logL(w,b)=yilog(y^i)+(1−yi)log(1−y^i) 实现。 - 使用
np.clip
来防止预测概率接近0或1时出现 log ( 0 ) \log(0) log(0) 错误。
- 函数
-
构造预测概率:
- 我们生成了一系列预测概率 y ^ \hat{y} y^ 的值,范围从0.01到0.99。
-
计算对数似然值:
- 分别计算真实标签为1和真实标签为0时的对数似然函数值。
-
可视化:
- 使用 Matplotlib 绘制两条曲线,一条表示真实标签为1时的对数似然函数值变化,另一条表示真实标签为0时的对数似然函数值变化。
- 曲线的颜色分别为蓝色和红色,便于区分。
结果分析
- 当真实标签为1时,如果预测概率 y ^ \hat{y} y^ 接近1,对数似然函数值很大;反之,如果 y ^ \hat{y} y^ 接近0,对数似然函数值很小。
- 当真实标签为0时,如果预测概率 y ^ \hat{y} y^ 接近0,对数似然函数值很大;反之,如果 y ^ \hat{y} y^ 接近1,对数似然函数值很小。
- 这种特性使得对数似然函数能够有效地衡量预测分布与真实分布之间的差异,并引导模型朝着正确的方向进行优化。
通过这种可视化方式,您可以直观地理解对数似然函数的行为及其在二分类问题中的应用。