问题描述
我正在 Python 中实现逻辑回归,并且正在编写代码,根据此公式对参数向量进行最大似然估计:
我已经通过以下方式实现了它:
-np.sum(np.log(1 + np.exp(-1*(y*x.dot(w.T)))))
在一个函数中,w
是权重向量,x
是特征矩阵,y
是标签向量。我没有根据测试数据获得我期望的分类,并怀疑这与我实现这个对数似然方程的方式有关。我在 scipy.minimize.optimize 中运行此函数,其中附加参数是初始权重估计(全部初始化为零)和 args = (x,y)。在终端中,我收到以下错误:
RuntimeWarning: overflow encountered in exp; return -np.sum(np.log(1 + np.exp(-1*(y*x.dot(w.T)))))
RuntimeWarning: invalid value encountered in subtract df = fun(x) - f0
这是一个简单的二元分类任务。有人可以就为什么会发生这种情况以及我如何以最有效的方式解决它提供一些提示吗?
编辑:我的一位同事建议可以使用 logsumexp()
完成相同的操作,因为它在数值上更稳定,但我不确定这是怎么可能的,所以方程需要对数总和,但 logsumexp()
是总和的对数。有什么建议吗?
解决方法
原因是当-1*(y*x.dot(w.T))))
太大时,函数exp
会溢出。
我在我的 x64 机器上测试,发现当 exp
的参数大于 750
时,exp
会溢出:
>>> np.exp(750)
inf
>>>
因此我建议对权重 w
和输入 x
应用归一化。