2016-11-10 4 views
1

EDIT: Набор данных представляет собой данные MNIST набор из Домашней Недели 4 машинного обучения Эндрю Нг курсSciPy оптимизации функции: матрицы не выровнены

Я проверил question on scipy optimize, но я до сих пор не мог понять, что не так с моим кодом. Я пытаюсь оптимизировать theta для вопроса oneVsAll на курсе курьера Andrew Ng.

Вот соответствующий код

def sigmoid(x): 
a = [] 
for item in x: 
    a.append(1/(1+math.exp(-item))) 
return a 

def hypothesis(x, theta): 
    return np.array(sigmoid(np.dot(x, theta))) 

def costFunction(theta, x, y, lamba_): 
    m = X.shape[0] 

    part1 = np.dot(y.T, np.log(hypothesis(x, theta)).reshape(m,1)) 
    part2 = np.dot((np.ones((m,1)) - y).T, np.log(1 - hypothesis(x, theta)).reshape(m,1)) 

    summ = (part1 + part2) 

    return -summ[0]/m 

def gradientVect(theta, x, y, lambda_): 
    n = X.shape[1] 
    m = X.shape[0] 
    gradient = [] 

    theta = theta.reshape(n,1) 

    beta = hypothesis(x, theta) - y 

    reg = theta[1:] * lambda_/m 

    grad = np.dot(X.T, beta) * 1./m 

    grad[1:] = grad[1:] * reg 

    return grad.flatten() 


from scipy import optimize 

def optimizeTheta(x, y, nLabels, lambda_): 

    for i in np.arange(0, nLabels): 
     theta = np.zeros((n,1)) 
     res = optimize.minimize(costFunction, theta, args=(x, (y == i)*1, lambda_), method=None, 
         jac=gradientVect, options={'maxiter':50}) 
     print(res) 
    return result 

но работает

optimizeTheta(X, y, 10, 0) # X shape = 401, 500 

дает мне следующую ошибку:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-247-e0e6e4c1eddd> in <module>() 
     3 n = X.shape[1] 
     4 
----> 5 optimizeTheta(X, y, 10, 0) 

<ipython-input-246-0a15e9f4769a> in optimizeTheta(x, y, nLabels, lambda_) 
    54   theta = np.zeros((n,1)) 
    55   res = optimize.minimize(costFunction, x0 = theta, args=(x, (y == i)*1, lambda_), method=None, 
---> 56      jac=gradientVect, options={'maxiter':50}) 
    57   print(res) 
    58  return result 

//anaconda/lib/python3.5/site-packages/scipy/optimize/_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options) 
    439   return _minimize_cg(fun, x0, args, jac, callback, **options) 
    440  elif meth == 'bfgs': 
--> 441   return _minimize_bfgs(fun, x0, args, jac, callback, **options) 
    442  elif meth == 'newton-cg': 
    443   return _minimize_newtoncg(fun, x0, args, jac, hess, hessp, callback, 

//anaconda/lib/python3.5/site-packages/scipy/optimize/optimize.py in _minimize_bfgs(fun, x0, args, jac, callback, gtol, norm, eps, maxiter, disp, return_all, **unknown_options) 
    859  gnorm = vecnorm(gfk, ord=norm) 
    860  while (gnorm > gtol) and (k < maxiter): 
--> 861   pk = -numpy.dot(Hk, gfk) 
    862   try: 
    863    alpha_k, fc, gc, old_fval, old_old_fval, gfkp1 = \ 

ValueError: shapes (401,401) and (2005000,) not aligned: 401 (dim 1) != 2005000 (dim 0) 

И я не могу понять, почему формы не являются выровнены.

Спасибо!

+0

вектор, возвращенный 'gradientVec' должен иметь точно такое же количество элементов, как и в' theta', так как градиент скалярной функции против тета. Очевидно, что ваша функция вычисляет не градиент. Поэтому вам нужно отладить эту функцию. –

+0

У этого есть, но в документации говорится, что градиент должен быть 1D-массивом, поэтому я сплющил его (401 500 -> 2005000). Вот почему это выглядит иначе: –

+0

http://stackoverflow.com/questions/25880634/logistic-regression-objects-are-not-aligned; http://stackoverflow.com/questions/38837155/how-to-get-dimensions-right-using-fmin-cg-in-scipy-optimize – hpaulj

ответ

0

Итак, я понял, что случилось с моим вопросом. Проблема заключалась в том, что функция сигмоида возвращала список, а не целое число, и поэтому впоследствии он перепутал умножения матриц. Новая функция сигмовидной является

def sigmoid(z): 
return(1/(1 + np.exp(-z))) 
Смежные вопросы