#python #numpy #scipy #array-broadcasting
#python #numpy #scipy #массив-трансляция
Вопрос:
Вот мой код для решения проблемы машинного обучения, которую я пытаюсь. Обратите внимание, что считываемый текстовый файл состоит из трех столбцов. В основном я пытаюсь сохранить формы массива в виде (m, n), а не (m,), будь то квадратная матрица или вектор. Что касается векторов, я сохраняю их формы как (m, 1) (вектор столбца), а не (1, m) (вектор строки).
import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as opt
X = np.loadtxt('ex2data1.txt', delimiter=',')[:,:-1]
y = np.loadtxt('ex2data1.txt', delimiter=',')[:,[-1]]
# Add the bias column to X
X = np.hstack(( np.ones((len(X),1)) , X ))
# Model parameter initialization
theta = np.zeros(( len(X[0,:]), 1 ))
def cost(X, y, theta):
h = 1/(1 np.exp(-X@theta))
return (-1/len(X))*( (y.T @ np.log(h)) ((1-y).T @ np.log(1-h)) )
def gradient(X, y, theta):
h = 1/(1 np.exp(-X@theta))
return (1/len(X))*(X.T@(h-y))
J, grad = cost(X, y, theta), gradient(X, y, theta)
print('Cost at initial theta (zeros):n', J)
print('Expected cost (approx): 0.693n')
print('Gradient at initial theta (zeros): n', grad)
print('Expected gradient (approx):n -0.1000n -12.0092n -11.2628n')
-------------------------------------
Cost at initial theta (zeros): |
[[0.69314718]] |
Expected cost (approx): 0.693 |
|
Gradient at initial theta (zeros): |
[[ -0.1 ] |
[-12.00921659] |
[-11.26284221]] |
Expected gradient (approx): |
-0.1000 |
-12.0092 |
-11.2628 |
-------------------------------------
X.shape, y.shape, theta.shape, grad.shape, J.shape
----------------------------------------------|
((100, 3), (100, 1), (3, 1), (3, 1), (1, 1)) |
----------------------------------------------|
theta, cost = opt.fmin_ncg(f=cost, x0=theta, fprime=gradient, args=(X,y))
print(cost)
print(theta)
Я заключил промежуточный вывод в поля. Вызов функции fmin_ncg выдает мне следующее сообщение об ошибке:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-133-86d5d7f476c2> in <module>
----> 1 theta, cost = opt.fmin_ncg(f=cost, x0=theta, fprime=gradient, args=(X,y))
2 print(cost)
3 print(theta)
~Anaconda3libsite-packagesscipyoptimizeoptimize.py in fmin_ncg(f, x0, fprime, fhess_p, fhess, args, avextol, epsilon, maxiter, full_output, disp, retall, callback)
1454
1455 res = _minimize_newtoncg(f, x0, args, fprime, fhess, fhess_p,
-> 1456 callback=callback, **opts)
1457
1458 if full_output:
~Anaconda3libsite-packagesscipyoptimizeoptimize.py in _minimize_newtoncg(fun, x0, args, jac, hess, hessp, callback, xtol, eps, maxiter, disp, return_all, **unknown_options)
1535 k = 0
1536 gfk = None
-> 1537 old_fval = f(x0)
1538 old_old_fval = None
1539 float64eps = numpy.finfo(numpy.float64).eps
~Anaconda3libsite-packagesscipyoptimizeoptimize.py in function_wrapper(*wrapper_args)
291 def function_wrapper(*wrapper_args):
292 ncalls[0] = 1
--> 293 return function(*(wrapper_args args))
294
295 return ncalls, function_wrapper
<ipython-input-129-7fd4b6f3144e> in cost(X, y, theta)
1 def cost(X, y, theta):
----> 2 h = 1/(1 np.exp(-X@theta))
3 return (-1/len(X))*( (y.T @ np.log(h)) ((1-y).T @ np.log(1-h)) )
4
5 def gradient(X, y, theta):
ValueError: shapes (3,) and (100,1) not aligned: 3 (dim 0) != 100 (dim 0)
Я не имею ни малейшего представления о том, почему это происходит. Я позаботился о том, чтобы все матрицы имели правильные размеры, и я почти уверен, что не определял ни одну из матриц как имеющую форму (3,).
Был бы очень рад любой помощи или руководству по этому поводу.
Комментарии:
1.
opt.fmin_ncg
выравниваетсяx0
. В его документах это не совсем понятно, но это обычное поведение вscipy.opitimize
функциях. Я проверил это, просмотрев код (несколько вызовов функций вниз).2. @hpaulj: Таким образом, в основном
theta
сглаживается с (3,1) до (3,). Есть ли способ исправить этот беспорядок?3. Содержит ли
theta
фигура (3,1) какую-либо важную информацию, которой нет в (3,)? Разве вы не можете просто изменить формуX
в началеcost
иgradient
?
Ответ №1:
Я сам отвечу на свой вопрос на случай, если кто-нибудь еще столкнется с такой же проблемой. Как стоимость (функция, подлежащая минимизации), так и функции градиента должны иметь x0 (в данном случае theta) в качестве первого параметра. Кроме того, функция градиента должна возвращать массив формы (n,), а не (n, 1). Вектор параметров x0 также должен иметь форму (n, ) вместо (n, 1).