设T为60000x1数组,为简单起见,T [i]为0或1.真实数据库存储0到9之间的数字,但是我们不要那么远,并假设整个数据库包含一堆零和的。
所以我们有训练集,它由D指定的输入数据和T指定的相应目标组成。
我们希望实现逻辑回归模型,其中我们使用的误差函数由负对数似然定义。
和θ是我们试图找到的权重(维度1x784)。我们希望最小化此错误函数,因此我们所做的是找到相应的导数。
由于我们无法解析地解决0,我们必须应用gradient descent。
到目前为止,这是我的代码。
对于sigmoid函数,我使用pylab的帮助:
import numpy as np
def sigmoid(self,s):
return expit(s)
然后我试图找到某个给定θ的J(θ),看看我的错误现在有多好:
def getInfo(self, D, T, theta):
afterSigmoid = self.sigmoid(D.dot(theta))
Ein = -np.sum(target*np.log(afterSigmoid)+
(1-target)*np.log(1-afterSigmoid))
gradient=-D.T.dot(T-afterSigmoid)
return (Ein, gradient)
然后我应用梯度下降算法
def log_grad(self, data, target, theta):
iterations = 1000
it = 0
step = 0.01
while(it <= iterations):
(Ein, vt) = self.getInfo(data, target, theta)
print(Ein,it)
theta = theta - step*vt
it = it + 1
return theta
我得到的是以下内容:
nan 1
nan 2
nan 3
nan 4
nan 5
nan 6
nan 7
nan 8
nan 9
nan 10
nan 11
nan 12
nan 13
nan 14
nan 15
nan 16
.
.
.
我正在严格遵循这些公式,我根据理论做了一切,但我仍然无法在我的python程序中得到任何有意义的东西。