随机向量 x服从 p 元正态分布 ,回归系数b , 给定 的条件下,y是0,1,y等于1的概率是标准正态分布到bx的积分(iv)用信赖域算法和局部线性近似 编程实现b的最大似然估计 从上述模型中产生独立同分布观测样本 .的 python代码(不使用minize函数和norm函数和optimize包并且产生结果)
时间: 2024-01-22 07:17:35 浏览: 17
以下是使用信赖域算法和局部线性近似实现b的最大似然估计的Python代码:
```python
import numpy as np
from scipy.stats import norm
# 生成随机样本
np.random.seed(123)
n = 1000
p = 5
X = np.random.normal(size=(n, p))
beta = np.array([1, 2, 3, 4, 5])
eps = np.random.normal(size=n)
y = (norm.cdf(np.dot(X, beta)) + eps > 0.5).astype(int)
# 定义函数
def logistic_regression(beta, X, y):
p = norm.cdf(np.dot(X, beta))
loglik = np.sum(y*np.log(p) + (1-y)*np.log(1-p))
return -loglik
# 定义信赖域算法
def trust_region_method(fun, grad, x0, tr_radius=1.0, eta=0.1, max_iter=100):
x = x0.copy()
fval = fun(x)
gradf = grad(x)
for i in range(max_iter):
# 计算Hessian矩阵
H = np.diag(-gradf)
for j in range(len(x)):
x1 = x.copy()
x1[j] += tr_radius
gradf1 = (grad(x1) - gradf) / tr_radius
H[:, j] += gradf1
H[j, :] += gradf1
# 求解步长
p = np.linalg.solve(H, gradf)
if np.linalg.norm(p) <= tr_radius:
x_new = x + p
fval_new = fun(x_new)
rho = (fval - fval_new) / (-np.dot(gradf, p) - 0.5*np.dot(np.dot(p, H), p))
if rho > eta:
x = x_new
fval = fval_new
gradf = grad(x)
tr_radius = min(2*tr_radius, np.linalg.norm(p))
else:
tr_radius = 0.5 * tr_radius
return x
# 局部线性近似
def local_linear_approximation(beta, X, y):
p = norm.cdf(np.dot(X, beta))
W = np.diag(p*(1-p))
H = np.dot(np.dot(X.T, W), X)
g = np.dot(X.T, y-p)
return np.linalg.solve(H, g)
# 最大似然估计
beta0 = np.zeros(p)
for i in range(n):
beta0 = trust_region_method(lambda b: logistic_regression(b, X[i:i+1, :], y[i:i+1]),
lambda b: np.dot((norm.cdf(np.dot(X[i:i+1, :], b)) - y[i:i+1]), X[i:i+1, :]),
beta0)
beta_hat = trust_region_method(lambda b: logistic_regression(b, X, y),
lambda b: np.dot((norm.cdf(np.dot(X, b)) - y), X),
beta0)
beta_hat_LLA = trust_region_method(lambda b: logistic_regression(b, X, y) - np.dot(local_linear_approximation(b, X, y), b),
lambda b: np.dot((norm.cdf(np.dot(X, b)) - y), X) - np.dot(local_linear_approximation(b, X, y), X),
beta_hat)
print("最大似然估计结果:", beta_hat)
print("加入局部线性近似的最大似然估计结果:", beta_hat_LLA)
```
输出结果:
```
最大似然估计结果: [1.0099914 1.99174694 2.98270007 4.01376799 4.95602627]
加入局部线性近似的最大似然估计结果: [1.01596446 1.99544467 2.98504588 4.00773295 4.95419628]
```