2013-09-14 4 views
13

Есть ли альтернатива функции fminunc (из октавы/matlab) в python? У меня есть функция стоимости для бинарного классификатора. Теперь я хочу запустить спуск градиента, чтобы получить минимальное значение тета. Реализация октавы/матлаба будет выглядеть следующим образом.fminunc alternate in numpy

% Set options for fminunc 
options = optimset('GradObj', 'on', 'MaxIter', 400); 

% Run fminunc to obtain the optimal theta 
% This function will return theta and the cost 
[theta, cost] = ... 
    fminunc(@(t)(costFunction(t, X, y)), initial_theta, options); 

Я преобразовал мою costFunction в питоне с использованием библиотеки Numpy, и ищут fminunc или любую другую реализацию алгоритма градиентного спуска в NumPy.

ответ

17

Существует более подробную информацию о функциях, представляющих интерес здесь: http://docs.scipy.org/doc/scipy-0.10.0/reference/tutorial/optimize.html

Кроме того, похоже, что вы делаете Coursera Machine Learning курс, но в Python. Вы можете проверить http://aimotion.blogspot.com/2011/11/machine-learning-with-python-logistic.html; этот парень делает то же самое.

4

Похож, что вы должны изменить на scipy.

Здесь вы можете легко найти все основные алгоритмы оптимизации.

http://docs.scipy.org/doc/scipy/reference/optimize.html

+0

Более конкретно, из [этот пост на форуме] (http://octave.1599824.n4.nabble.com/algorithm-for-fminunc-td4648956.html), кажется, что Октава 'fminunc' использует некоторую форму BFGS (не удалось найти более авторитетную ссылку). Поэтому ['scipy.optimize.fmin_bfgs'] (http://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.fmin_bfgs.html#scipy.optimize.fmin_bfgs) кажется ближайшей параллелью с' fminunc'. – Alec

9

Я также пытался реализовать логистическую регрессию, как обсуждалось в курсе Coursera ML, но в python. Я нашел scipy полезным. После попытки реализации различных алгоритмов в функции минимизации, я нашел Newton Conjugate Gradient наиболее полезным. Также после изучения возвращаемого значения кажется, что он эквивалентен значению fminunc в Octave. Я включил мою реализацию в python ниже, чтобы найти оптимальную тету.

import numpy as np 
import scipy.optimize as op 

def Sigmoid(z): 
    return 1/(1 + np.exp(-z)); 

def Gradient(theta,x,y): 
    m , n = x.shape 
    theta = theta.reshape((n,1)); 
    y = y.reshape((m,1)) 
    sigmoid_x_theta = Sigmoid(x.dot(theta)); 
    grad = ((x.T).dot(sigmoid_x_theta-y))/m; 
    return grad.flatten(); 

def CostFunc(theta,x,y): 
    m,n = x.shape; 
    theta = theta.reshape((n,1)); 
    y = y.reshape((m,1)); 
    term1 = np.log(Sigmoid(x.dot(theta))); 
    term2 = np.log(1-Sigmoid(x.dot(theta))); 
    term1 = term1.reshape((m,1)) 
    term2 = term2.reshape((m,1)) 
    term = y * term1 + (1 - y) * term2; 
    J = -((np.sum(term))/m); 
    return J; 

# intialize X and y 
X = np.array([[1,2,3],[1,3,4]]); 
y = np.array([[1],[0]]); 

m , n = X.shape; 
initial_theta = np.zeros(len(n)); 
Result = op.minimize(fun = CostFunc, 
           x0 = initial_theta), 
           args = (X, y), 
           method = 'TNC', 
           jac = Gradient); 
optimal_theta = Result.x;