使用scipy.optimize.minimize进行形状不匹配错误以进行逻辑回归

时间:2018-10-05 19:55:08

标签: python numpy machine-learning scipy logistic-regression

我正在完成Andrew Ng的ML课程,并且正在尝试用python实现程序。对于第二个练习,关于逻辑回归,我尝试使用scipy.optimize.minimize来优化成本函数。我的代码如下。

import os
import numpy as np
from scipy.special import expit
from scipy import optimize

datafile1 = os.path.join('data','ex2data1.txt')
data1 = np.loadtxt(datafile1, delimiter=',')
exam_scores, results = data1[:, :2], data1[:, 2]

m, n = exam_scores.shape

exam_scores = np.concatenate([np.ones([m, 1]), exam_scores], axis=1)

def cost_function(x, y, theta):
    m = len(y)
    hypothesis = expit(np.dot(x, theta))
    term1 = -np.dot(y.T, np.log(hypothesis)) / m
    term2 = -np.dot((1 - y).T, np.log(1 - hypothesis)) / m
    cost = term1 + term2
    return cost

def gradient(x, y, theta):
    m = len(y)
    hypothesis = expit(np.dot(x, theta))
    return np.dot(hypothesis - y, x) / m

def minimize_cost(x, y, theta):
    output = optimize.minimize(cost_function, theta, args=(x, y),
                               jac=gradient, options={'maxiter':400})
    return output.fun, output.x

theta = np.zeros(n + 1)
theta, cost = minimize_cost(exam_scores, results, theta)

这给了我

<ipython-input-42-e2ba65cce1d8> in gradient(x, y, theta)
       9 def gradient(x, y, theta):
      10     m = len(y)
 ---> 11     hypothesis = expit(np.dot(x, theta))
      12     return np.dot(hypothesis - y, x) / m

      ValueError: shapes (3,) and (100,) not aligned: 3 (dim 0) != 100 (dim 0).

但是theta的形状和gradient函数的输出是相同的,即theta.shape == gradient(exam_scores, results, theta).shape给我True

我不明白为什么从ValueError调用时梯度函数为什么会引起minimize的问题,因为它本身会提供预期的输出。

任何指针将不胜感激。

P.S。这是数据的一部分。

exam_scores[:5, :]
array([[34.62365962, 78.02469282],
       [30.28671077, 43.89499752],
       [35.84740877, 72.90219803],
       [60.18259939, 86.3085521 ],
       [79.03273605, 75.34437644]])

results.reshape(m, 1)[:5, :]
array([[0.],
       [0.],
       [0.],
       [1.],
       [1.]])

编辑:添加了部分数据。

0 个答案:

没有答案