随机向量 x服从 p 元正态分布 ,回归系数b , 给定 的条件下,y是0,1,y等于1的概率是标准正态分布到bx的积分(iv)用信赖域算法和局部线性近似 编程实现b的最大似然估计 从上述模型中产生独立同分布观测样本,b的范围在(1,2,3,4。。。P)附近 . PYTHON语言代码以及正确运行结果(不使用minize函数和optimistic包并且产生结果
时间: 2024-02-15 12:06:14 浏览: 66
如果不使用 minimize 函数和 optimistic 包,可以使用手动实现的梯度下降算法来实现最大似然估计。下面是一个简单的 Python 代码实现。
```
import numpy as np
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def gradient(x, y, b):
# 计算梯度
p = len(b)
grad = np.zeros(p)
for i in range(len(y)):
z = np.dot(b, x[i])
grad += (y[i] - sigmoid(z)) * x[i]
return grad
def hessian(x, b):
# 计算黑塞矩阵
p = len(b)
H = np.zeros((p, p))
for i in range(len(x)):
z = np.dot(b, x[i])
s = sigmoid(z)
H += s * (1 - s) * np.outer(x[i], x[i])
return H
def log_likelihood(x, y, b):
# 计算对数似然
l = 0
for i in range(len(y)):
z = np.dot(b, x[i])
l += y[i] * np.log(sigmoid(z)) + (1 - y[i]) * np.log(1 - sigmoid(z))
return l
# 产生独立同分布观测样本
p = 3
n = 100
x = np.random.normal(size=(n, p))
b_true = np.array([1, 2, 3])
y = np.random.binomial(1, sigmoid(np.dot(x, b_true)))
# 最大似然估计
b0 = np.ones(p) # 初始值
alpha = 0.01 # 学习率
max_iter = 1000 # 最大迭代次数
for i in range(max_iter):
# 计算梯度和黑塞矩阵
grad = gradient(x, y, b0)
H = hessian(x, b0)
# 计算步长
step = np.dot(np.linalg.inv(H), grad)
# 更新参数
b1 = b0 + alpha * step
# 判断是否收敛
if np.max(np.abs(b1 - b0)) < 1e-6:
break
b0 = b1
b_mle = b0
print("True b: ", b_true)
print("MLE b: ", b_mle)
```
这段代码首先定义了一个 sigmoid 函数,用于计算 logistic 回归中的激活值。然后定义了 gradient 函数和 hessian 函数,分别用于计算梯度和黑塞矩阵。接着定义了 log_likelihood 函数,用于计算对数似然。
在最大似然估计的过程中,使用手动实现的梯度下降算法来最小化对数似然。需要设置学习率和最大迭代次数。最终输出真实的回归系数 b 和估计的回归系数 b_mle。
需要注意的是,这种手动实现的梯度下降算法可能会比较慢,而且收敛性也不如使用优化算法。因此,如果数据集比较大或者维度比较高,建议使用更高效的优化算法来实现最大似然估计。
阅读全文