【问题标题】:Why is this implementation of the conditional logit gradient failing?为什么这种条件 logit 梯度的实现会失败?
【发布时间】:2016-09-19 13:00:40
【问题描述】:

我为条件 logit 模型编写了一个非常简单的可能性/梯度实现(解释为 here) - 可能性工作正常,但梯度不正确。我的两个问题是:我对梯度的推导是否正确,如果是,我在 Python 中的实现是否正确?如果在数学论坛中提出这个问题更好,请随时移动。

型号:

日志可能性:

最后是渐变:

这里,i 是每个观测值,j 是观测值 i 中的备选方案,c 是观测值 i 中选择的备选方案,Xij 是 i 中选择 j 的特征向量,B 是相应的系数。 似然公式应该是特征向量乘以系数向量。我的错误

我对可能性和梯度的实现如下:

可能性:

def log_likelihood(coefs, observations, config, lasso):
    def func(grp):
        mtrx = grp.as_matrix(config.features)
        dp = np.dot(mtrx, coefs)
        sub = np.log(np.exp(dp).sum())
        inc = (dp * grp['choice']).sum()
        return inc - sub 
    ll = observations.groupby(['observation_id']).apply(func).sum()
    if lasso is not None:
        ll -= (np.abs(coefs).sum() * lasso)
    neg_log = ll * -1
return neg_log

渐变:

def gradient(coefs, observations, config, lasso):
    def func(grp):
        mtrx = grp.as_matrix([config.features])
        tmtrx = mtrx.transpose()
        tmp = np.exp(tmtrx * coefs[:, np.newaxis])
        sub = (tmp * tmtrx).sum(1) / tmp.sum(1)
        inc = (mtrx * grp['choice'][:, np.newaxis]).sum(0)
        ret = inc - sub 
        return ret 
    return -1 * observations.groupby(['observation_id']).apply(func).sum()

这里,coefs 是一个包含系数的 numpy 数组,observations 是一个数据框,其中每一行代表一个观察值中的一个替代项,列是一个选择列,表示列中的选择为 0/1,observation_id 列在哪里观察中的所有备选方案都具有相同的 id,最后 config 是一个包含成员“特征”的字典,该成员是包含特征的观察 df 中的列列表。 注意我在测试时不使用套索参数。下面是数据的示例。

我已验证可能性是正确的;但是,使用 scipy.optimize.check_grad 时,梯度的误差非常大。当不将渐变传递给 scipy.optimize.minimize 时,我也能够求解 B。梯度按我的预期计算,所以在这一点上我只能认为我的推导是不正确的,但我不确定为什么。

In [27]: df.head(14)
Out[27]: 
          x1        x2        x3  observation_id  choice
0   0.187785  0.435922 -0.475349             211       1
1  -0.935956 -0.405833 -1.753128             211       0
2   0.210424  0.141579  0.415933             211       0
3   0.507025  0.307965 -0.198089             211       0
4   0.080658 -0.125473 -0.592301             211       0
5   0.605302  0.239491  0.287094             293       1
6   0.259580  0.415388 -0.396969             293       0
7  -0.637267 -0.984442 -1.376066             293       0
8   0.241874  0.435922  0.855742             293       0
9   0.831534  0.650425  0.930592             293       0
10 -1.682565  0.435922 -2.517229             293       0
11 -0.149186  0.300299  0.494513             293       0
12 -1.918179 -9.967421 -2.774450             293       0
13 -1.185817  0.295601 -1.974923             293       0

【问题讨论】:

    标签: python scipy statistics mathematical-optimization


    【解决方案1】:

    推导不正确。在求幂中,我只包括给定系数的偏导数的特征和系数。相反,它应该是所有特征和系数的点积。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-15
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 2021-09-08
      相关资源
      最近更新 更多