我正在尝试建立线性回归模型并使用fmin_cg
优化器找到最佳值。
我有两项职能。第一个linear_reg_cost
是成本函数,第二个linear_reg_grad
是成本函数的梯度。这两个函数具有相同的参数。
def hypothesis(x,theta):
return np.dot(x,theta)
成本函数:
def linear_reg_cost(x_flatten, y, theta_flatten, lambda_, num_of_features,num_of_samples):
x = x_flatten.reshape(num_of_samples, num_of_features)
theta = theta_flatten.reshape(n,1)
loss = hypothesis(x,theta)-y
regularizer = lambda_*np.sum(theta[1:,:]**2)/(2*m)
j = np.sum(loss ** 2)/(2*m)
return j
梯度函数:
def linear_reg_grad(x_flatten, y, theta_flatten, lambda_, num_of_features,num_of_samples):
x = x_flatten.reshape(num_of_samples, num_of_features)
m,n = x.shape
theta = theta_flatten.reshape(n,1)
new_theta = np.zeros(shape=(theta.shape))
loss = hypothesis(x,theta)-y
gradient = np.dot(x.T,loss)
new_theta[0:,:] = gradient/m
new_theta[1:,:] = gradient[1:,:]/m + lambda_*(theta[1:,]/m)
return new_theta
和fmin_cg
:
theta = np.ones(n)
from scipy.optimize import fmin_cg
new_theta = fmin_cg(f=linear_reg_cost, x0=theta, fprime=linear_reg_grad,args=(x.flatten(), y, lambda_, m,n))
注意:我将x
展平为输入,并在cost和gradient函数中检索为矩阵。
输出错误:
<ipython-input-98-b29c1b8f6e58> in linear_reg_grad(x_flatten, y, theta_flatten, lambda_, num_of_features, num_of_samples)
1 def linear_reg_grad(x_flatten, y, theta_flatten, lambda_,num_of_features, num_of_samples):
----> 2 x = x_flatten.reshape(num_of_samples, num_of_features)
3 m,n = x.shape
4 theta = theta_flatten.reshape(n,1)
5 new_theta = np.zeros(shape=(theta.shape))
ValueError: cannot reshape array of size 2 into shape (2,12)
注意:x.shape = (12,2)
,y.shape = (12,1)
,theta.shape = (2,)
。所以num_of_features =2
和num_of_samples=12
。但是错误表明我的输入x
正在解析,而不是theta
。即使我在args
中明确分配了fmin_cg
,为什么仍会发生这种情况?以及我该如何解决这个问题?
谢谢您的建议
答案 0 :(得分:1)
您所有的实现都是正确的,但是有一点错误。
通知您传递参数以便同时使用这两个函数。
您的问题是num_of_feature
和num_of_samples
的顺序。您可以在linear_reg_grad
或linear_reg_cost
中相互替换他们的位置。当然,您应该在scipy.optimize.fmin_cg
,args
参数中更改此顺序。
第二个重要的事情是,x
中的第一个参数fmin_cg
是您要每次更新并找到最佳变量的变量。因此,在您的解决方案中,x
中的fmin_cg
必须是theta
,而不是您的输入x
。