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谢谢你的建议,我现在已经完成了这两项工作。