使用Python在MNIST数据库上应用逻辑回归

时间:2015-09-15 11:07:05

标签: python logistic-regression

设D是60000×784阵列,其中D [i]表示手写数字的一些图像,D [i] [j]表示相应像素的强度。强度始终是介于0和1之间的实数。

设T为60000x1数组,为简单起见,T [i]为0或1.真实数据库存储0到9之间的数字,但是我们不要那么远,并假设整个数据库包含一堆零和的。

所以我们有训练集,它由D指定的输入数据和T指定的相应目标组成。

我们希望实现逻辑回归模型,其中我们使用的误差函数由负对数似然定义。

enter image description here enter image description here enter image description here

和θ是我们试图找到的权重(维度1x784)。我们希望最小化此错误函数,因此我们所做的是找到相应的导数。

enter image description here

由于我们无法解析地解决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程序中得到任何有意义的东西。

0 个答案:

没有答案