Python中Statsmodels GMM的optim_method可选值查询及报错处理
关于statsmodels GMM中optim_method参数的问题
一、错误原因:单纯形法的正确参数名
你传入的simplex并非statsmodels GMM支持的参数名,单纯形法对应的正确名称是'nm'(Nelder-Mead单纯形法的缩写)。
二、查询可用优化器的方法
方法1:查看GMM类fit方法的文档字符串
在Python环境中执行以下代码,直接查看fit方法的参数说明,里面会列出所有支持的optim_method可选值:
from statsmodels.sandbox.regression.gmm import GMM help(GMM.fit)
文档中optim_method参数的说明部分会明确列出支持的优化器名称,常见的包括:
'nm': Nelder-Mead 单纯形法(即你需要的单纯形法)'bfgs': BFGS拟牛顿法'lbfgs': 有限内存BFGS'cg': 共轭梯度法'ncg': 非线性共轭梯度法'powell': Powell方法
方法2:查看statsmodels优化模块的源码定义
statsmodels的优化器统一由statsmodels.base.optimizer模块管理,你可以直接查看该模块中_get_optimizer函数的逻辑,里面定义了所有支持的优化器名称映射关系。
三、修正后的代码示例
将optim_method='simplex'替换为optim_method='nm'即可正常运行:
import numpy as np import pandas as pd import statsmodels.api as sm from statsmodels.sandbox.regression.gmm import GMM rand_array = np.random.rand(150, 7) yvar=rand_array[:, [0,1]] zvar=rand_array[:, [2,3,4]] xvar=rand_array[:, [5,6]] xvar=sm.add_constant(xvar) class GMMREM (GMM): def momcond(self, params): b0, b1, b2, b3, b4,m0, m1, m2, m3 = params x = self.exog z = self.instrument y= self.endog error1 = x[:,0]*(y[:,0]-b0-b1*y[:,1]-b2*z[:,0]-b3*z[:,1]-b4*x[:,1]) error2 = y[:,1]*(y[:,0]-b0-b1*y[:,1]-b2*z[:,0]-b3*z[:,1]-b4*x[:,1]) error3 = z[:,0]*(y[:,0]-b0-b1*y[:,1]-b2*z[:,0]-b3*z[:,1]-b4*x[:,1]) error4 = z[:,1]*(y[:,0]-b0-b1*y[:,1]-b2*z[:,0]-b3*z[:,1]-b4*x[:,1]) error5 = x[:,1]*(y[:,0]-b0-b1*y[:,1]-b2*z[:,0]-b3*z[:,1]-b4*x[:,1]) error6= z[:,2]*(y[:,0]-b0-b1*y[:,1]-b2*z[:,0]-b3*z[:,1]) error7 = x[:,0]*(y[:,1]-m0-m1*y[:,0]-m2*z[:,2]-m3*x[:,1]) error8 = y[:,0]*(y[:,1]-m0-m1*y[:,0]-m2*z[:,2]-m3*x[:,1]) error9 = z[:,2]*(y[:,1]-m0-m1*y[:,0]-m2*z[:,2]-m3*x[:,1]) error10= x[:,1]*(y[:,1]-m0-m1*y[:,0]-m2*z[:,2]-m3*x[:,1]) error11 = z[:,0]*(y[:,1]-m0-m1*y[:,0]-m2*z[:,2])-m3*x[:,1] error12= z[:,1]*(y[:,1]-m0-m1*y[:,0]-m2*z[:,2])-m3*x[:,1] return np.column_stack((error1, error2, error3, error4, error5, error6, error7, error8, error9, error10, error11, error12)) model1 = GMMREM(yvar, xvar, zvar, k_moms=12, k_params=9) b0 = [.01, .08, -.02, 0, 0,.01, 1.7, .05, 0] # 替换为正确的单纯形法参数名'nm' res1 = model1.fit(b0, maxiter=100, optim_method='nm', wargs=dict(centered=False)) print(res1.summary())
内容的提问来源于stack exchange,提问作者Simon Firestone
相关产品推荐
相关产品推荐

