Scipy`fmin_cg` args与我的函数args不匹配

时间:2018-10-15 07:03:54

标签: python optimization scipy linear-regression

我正在尝试建立线性回归模型并使用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 =2num_of_samples=12。但是错误表明我的输入x正在解析,而不是theta。即使我在args中明确分配了fmin_cg,为什么仍会发生这种情况?以及我该如何解决这个问题?

谢谢您的建议

1 个答案:

答案 0 :(得分:1)

您所有的实现都是正确的,但是有一点错误。
通知您传递参数以便同时使用这两个函数。
您的问题是num_of_featurenum_of_samples的顺序。您可以在linear_reg_gradlinear_reg_cost中相互替换他们的位置。当然,您应该在scipy.optimize.fmin_cgargs参数中更改此顺序。

第二个重要的事情是,x中的第一个参数fmin_cg是您要每次更新并找到最佳变量的变量。因此,在您的解决方案中,x中的fmin_cg必须是theta,而不是您的输入x