引自免费微信小程序:皆我百晓生
在最大化逻辑回归的对数似然函数时,我们首先定义对数似然函数 (L(B)),然后通过梯度上升法找到使 (L(B)) 最大的参数 (B)。根据给定的对数似然函数:
[ L(B) = \frac{1}{n} \sum_{i=1}^{n} [y_i B^T x_i - \ln(1 + e^{B^T x_i})] ]
梯度上升法的目的是增加 (L(B)),因此我们需要计算 (L(B)) 关于 (B) 的梯度,并沿这个方向更新 (B)。梯度表示了函数增长最快的方向。对于 (L(B)),其关于 (B) 的梯度是每个分量的偏导数构成的向量,即:
[ \nabla_B L(B) = \frac{1}{n} \sum_{i=1}^{n} [y_i x_i - \frac{e^{B^T x_i}}{1 + e^{B^T x_i}} x_i] ]
接下来,我们可以使用梯度上升法的更新规则进行迭代,其中 (a) 是学习率(步长):
[ B_{t+1} = B_t + a \cdot \nabla_B L(B_t) ]
将梯度表达式代入上述迭代公式,得到具体的参数更新迭代公式:
[ B_{t+1} = B_t + a \cdot \left(\frac{1}{n} \sum_{i=1}^{n} [y_i x_i - \frac{e^{B_t^T x_i}}{1 + e^{B_t^T x_i}} x_i]\right) ]
下面是 Python 代码实现这一过程:
import numpy as np
def log_likelihood_gradient(B, X, y):
# 计算对数似然函数的梯度
exp_scores = np.exp(np.dot(X, B))
probabilities = exp_scores / (1 + exp_scores)
gradient = np.dot((y - probabilities).T, X) / len(y)
return gradient
def gradient_ascent(B_init, X, y, learning_rate, num_iterations):
B = B_init
for _ in range(num_iterations):
gradient = log_likelihood_gradient(B, X, y)
B += learning_rate * gradient
return B
# 假设你已经有了数据 X 和标签 y,以及初始参数 B_init,学习率 learning_rate 和迭代次数 num_iterations
B_init = np.zeros(X.shape[1]) # 初始化参数
learning_rate = 0.01 # 学习率
num_iterations = 1000 # 迭代次数
B_optimized = gradient_ascent(B_init, X, y, learning_rate, num_iterations)
print("Optimized parameters: ", B_optimized)
这段代码定义了一个 gradient_ascent
函数,用于执行梯度上升过程并返回优化后的参数。你需要提供训练数据矩阵 X
、标签向量 y
、初始参数 B_init
、学习率 learning_rate
和迭代次数 num_iterations
。