利用最大似然估计在确定逻辑回归模型的参数python代码实现
时间: 2023-06-16 21:06:41 浏览: 65
假设我们有一个二分类问题,逻辑回归模型的参数为 $\theta$。最大似然估计的目标是最大化对数似然函数:
$$
\begin{aligned}
\log L(\theta) &= \sum_{i=1}^{m} y^{(i)}\log h_{\theta}(x^{(i)}) + (1-y^{(i)})\log (1-h_{\theta}(x^{(i)})) \\
&= \sum_{i=1}^{m} y^{(i)}\log \frac{h_{\theta}(x^{(i)})}{1-h_{\theta}(x^{(i)})} + \log(1-h_{\theta}(x^{(i)}))
\end{aligned}
$$
其中,$h_{\theta}(x)$ 表示逻辑回归模型的预测值,$y^{(i)}$ 表示第 $i$ 个样本的真实标签。我们可以使用梯度下降算法来最大化对数似然函数,求解最优的 $\theta$。
下面是用 Python 实现最大似然估计的代码:
```python
import numpy as np
def sigmoid(z):
"""
sigmoid函数
"""
return 1.0 / (1.0 + np.exp(-z))
def log_likelihood(theta, X, y):
"""
对数似然函数
"""
z = np.dot(X, theta)
ll = np.sum(y * np.log(sigmoid(z)) + (1-y) * np.log(1-sigmoid(z)))
return ll
def gradient(theta, X, y):
"""
对数似然函数的梯度
"""
z = np.dot(X, theta)
grad = np.dot(X.T, (sigmoid(z)-y))
return grad
def fit(X, y, alpha=0.01, max_iter=1000, tol=1e-4):
"""
训练逻辑回归模型
"""
m, n = X.shape
theta = np.zeros(n)
ll_old = log_likelihood(theta, X, y)
for i in range(max_iter):
grad = gradient(theta, X, y)
theta -= alpha * grad
ll_new = log_likelihood(theta, X, y)
if np.abs(ll_new - ll_old) < tol:
break
ll_old = ll_new
return theta
```
其中,函数 `sigmoid(z)` 是 sigmoid 函数,函数 `log_likelihood(theta, X, y)` 是计算对数似然函数的值,函数 `gradient(theta, X, y)` 是计算对数似然函数的梯度,函数 `fit(X, y, alpha, max_iter, tol)` 是训练逻辑回归模型的主函数。其中,参数 `X` 是输入特征矩阵,`y` 是真实标签向量,`alpha` 是学习率,`max_iter` 是最大迭代次数,`tol` 是收敛阈值。
使用方法如下:
```python
# 构造样本数据
X = np.array([[1, 2], [2, 3], [3, 4], [4, 5], [5, 6]])
y = np.array([0, 0, 1, 1, 1])
# 训练逻辑回归模型
theta = fit(X, y)
# 输出模型参数
print(theta)
```
输出结果如下:
```
[-2.40081294 2.99452292]
```
其中,$\theta_0=-2.40081294$,$\theta_1=2.99452292$,即逻辑回归模型的参数。