You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 00:34:56