Scipy `fmin_cg` args не совпадают с моими функциями args - PullRequest
0 голосов
/ 15 октября 2018

Я пытаюсь построить модель линейной регрессии и найти оптимальные значения с помощью оптимизатора 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 в качестве входных данных и извлекаю в функции стоимости и градиента в качестве матрицы.

ошибка вывода:

<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?И как мне решить эту проблему?

Спасибо за любой совет

1 Ответ

0 голосов
/ 15 октября 2018

Все ваши реализации верны, но у вас есть небольшая ошибка.
Будьте информированы, чтобы передать аргументы для обеих ваших функций.
Ваша проблема порядка 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, который является вашим входом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...