Python 线性回归:成本函数独立工作,但不在scipy.optimize函数内

Python 线性回归:成本函数独立工作,但不在scipy.optimize函数内,python,machine-learning,linear-regression,Python,Machine Learning,Linear Regression,我正在实现正则线性回归。数据可在此处找到: 我的代码如下: import numpy as np import scipy.optimize as optimize from scipy.io import loadmat data = loadmat('ex5data1.mat') X = data['X'] X = np.insert(X, 0, 1, axis=1) y = data['y'] theta = np.ones((2, 1)) def cost_function(the

我正在实现正则线性回归。数据可在此处找到:

我的代码如下:

import numpy as np 
import scipy.optimize as optimize
from scipy.io import loadmat

data = loadmat('ex5data1.mat')
X = data['X']
X = np.insert(X, 0, 1, axis=1)
y = data['y']
theta = np.ones((2, 1))

def cost_function(theta, X, y, reg_param):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    m = y.shape[0]
    h = X * theta
    error = np.power((h - y), 2)
    error = np.sum(error)
    term = error / (2*m)
    reg = (reg_param * np.sum(np.power(theta[1:, :], 2))) / (2*m)

    return term + reg

print "Cost function: \n %s" % (cost_function(theta, X, y, 1))

def cost_function_gradient(theta, X, y, reg_param):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    m = y.shape[0]

    grad = np.zeros((len(X[0]) + 1, 1))
    reg = np.multiply(theta[1:, :], reg_param/m)

    for j in xrange(len(X[0])):
        term = np.multiply((X * theta) - y, X[:, j + 1])
        term = np.sum(term) / m
        grad[j + 1, 0] = term + reg

    grad[0, 0] = np.sum(np.multiply((X*theta - y), X[:, 0])) / m

    return grad

print "Cost function gradient: \n %s" % (cost_function_gradient(theta, X, y, 1))

reg_param = 1
opt = optimize.fmin_cg(cost_function, theta, args=(X, y, reg_param), maxiter=200)
我的问题

在我开始尝试优化参数以最小化成本函数之前,成本函数()和成本函数梯度()函数工作正常,输出正确的结果。然而,当我开始优化参数时,我得到以下错误:

Traceback (most recent call last):
  File "ex5.py", line 49, in <module>
    opt = optimize.fmin_cg(cost_function, theta, args=(X, y, reg_param), maxiter=200)
  File "/Users/Olly/anaconda2/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 1177, in fmin_cg
    res = _minimize_cg(f, x0, args, fprime, callback=callback, **opts)
  File "/Users/Olly/anaconda2/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 1228, in _minimize_cg
    gfk = myfprime(x0)
  File "/Users/Olly/anaconda2/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 292, in function_wrapper
    return function(*(wrapper_args + args))
  File "/Users/Olly/anaconda2/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 688, in approx_fprime
    return _approx_fprime_helper(xk, f, epsilon, args=args)
  File "/Users/Olly/anaconda2/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 622, in _approx_fprime_helper
    f0 = f(*((xk,) + args))
  File "/Users/Olly/anaconda2/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 292, in function_wrapper
    return function(*(wrapper_args + args))
  File "ex5.py", line 17, in cost_function
    h = X * theta
  File "/Users/Olly/anaconda2/lib/python2.7/site-packages/numpy/matrixlib/defmatrix.py", line 309, in __mul__
    return N.dot(self, asmatrix(other))
ValueError: shapes (12,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)
回溯(最近一次呼叫最后一次):
文件“ex5.py”,第49行,在
opt=optimize.fmin\u cg(成本函数,θ,args=(X,y,reg\u参数),最大值=200)
文件“/Users/Olly/anaconda2/lib/python2.7/site packages/scipy/optimize/optimize.py”,第1177行,在fmin_cg中
res=\u最小化\u cg(f,x0,args,fprime,callback=callback,**选项)
文件“/Users/Olly/anaconda2/lib/python2.7/site packages/scipy/optimize/optimize.py”,第1228行,在cg中
gfk=myfprime(x0)
文件“/Users/Olly/anaconda2/lib/python2.7/site packages/scipy/optimize/optimize.py”,第292行,在函数包装器中
返回函数(*(包装器参数+参数))
文件“/Users/Olly/anaconda2/lib/python2.7/site packages/scipy/optimize/optimize.py”,第688行,约为
return _approx_fprime_helper(xk,f,epsilon,args=args)
文件“/Users/Olly/anaconda2/lib/python2.7/site packages/scipy/optimize/optimize.py”,第622行,在“近似”fprime\u助手中
f0=f(*(xk,)+args))
文件“/Users/Olly/anaconda2/lib/python2.7/site packages/scipy/optimize/optimize.py”,第292行,在函数包装器中
返回函数(*(包装器参数+参数))
成本函数中第17行的文件“ex5.py”
h=X*θ
文件“/Users/Olly/anaconda2/lib/python2.7/site packages/numpy/matrixlib/defmatrix.py”,第309行,在__
返回N.dot(自身、asmatrix(其他))
ValueError:形状(12,2)和(1,2)未对齐:2(尺寸1)!=1(尺寸0)
因此,似乎当fmin_cg()函数启动时,X和θ的尺寸会发生不同的变化/使用。在应用fmin_cg()之前,我尝试将X、y和θ更改为矩阵,但这没有改变任何东西

有人能解释一下为什么这个函数在fmin_cg()函数之外工作,而不是在它里面工作吗

如何更改代码以使其正常工作


提前感谢。

问题在于将参数数组定义为

theta = np.ones((2, 1))
这表现在以下错误中:

ValueError: shapes (12,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)
它描述了θ数组和X数组的维数不匹配。这可以通过如下定义θ来解决:

theta = np.ones(2)
这创建了与θ((2,1))完全相同的东西,只是它被重塑了。现在需要对上面的代码进行的唯一区别是在乘法中对所有θ进行转置,以确保矩阵乘法是合法的。以下是完整的工作代码:

import numpy as np 
import matplotlib.pyplot as plt 
import scipy.optimize as optimize 
from scipy.io import loadmat

data = loadmat('ex5data1.mat')
x = data['X']
X = data['X']
X = np.insert(X, 0, 1, axis=1)
y = data['y']
theta = np.ones(2)

def cost_function(theta, X, y, reg_param):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    m = float(y.shape[0])
    h = X * theta.T
    error = np.power((h - y), 2)
    error = np.sum(error)
    term = error / (2*m)
    reg = (reg_param * np.sum(np.power(theta[1:, :], 2))) / (2*m)

return term + reg

print "Cost function: \n %s" % (cost_function(theta, X, y, 1))

def cost_function_gradient(theta, X, y, reg_param):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    m = float(y.shape[0])

    grad = np.zeros((len(X[0]) + 1, 1))
    reg = np.multiply(theta.T[1:, :], reg_param/m)

    for j in xrange(len(X[0])):
        term = np.multiply((X * theta.T) - y, X[:, j + 1])
        term = np.sum(term) / m
        grad[j + 1, 0] = term + reg

    grad[0, 0] = np.sum(np.multiply((X*theta.T - y), X[:, 0])) / m

    return grad

print "Cost function gradient: \n %s" % (cost_function_gradient(theta, X, y, 1))

reg_param = 0
opt = optimize.fmin_cg(cost_function, theta, args=(X, y, reg_param), maxiter=200)

np.ones((2,1))->np.ones(2)
@sascha你能解释一下它做什么/为什么这么做吗?它抛出了相同的错误你的初始化有2个DIM。预计将有1个dim。当然,您可能需要更改其余代码以反映这一点。并且永远不要在这里显示修剪过的错误消息。把整个错误都放在你的问题上。另外:它是不可复制的。创建合成数据或上传该文件。@sascha谢谢你的建议,我现在已经完成了这两项工作。