2012-02-20 3 views
4

Matlab построил логистическую регрессию с использованием mnrfit, однако мне нужно реализовать логистическую регрессию с регуляцией L2. Я совершенно не понимаю, как это сделать. Я нашел несколько хороших документов и ссылок на веб-сайты с кучей уравнений, но не знаю, как реализовать алгоритм спуска градиента, необходимый для оптимизации.Реализация логистической регрессии с регуляцией L2 в Matlab

Есть ли доступный образец кода в Matlab для этого. Я нашел несколько библиотек и пакетов, но они все являются частью более крупных пакетов и вызывают так много запутанных функций, что можно потеряться, просто пройдя трассировку.

+0

Вы, вероятно, лучше использовать некоторый оптимизатор pre-fab, чем ваш собственный. LBFGS и конъюгатный градиент являются наиболее широко используемыми алгоритмами для точной оптимизации моделей LR, а не спуска с градиентом ванили. См. [этот набор инструментов] (http://www.di.ens.fr/~mschmidt/Software/minFunc.html). –

+0

Если вы правильно пометили свой вопрос (т. Е. С тегом matlab), вы облегчите другим поиск этого вопроса и улучшите ваши шансы на ответ. – tr9sh

+0

Этот вопрос может получить лучшие ответы на статистику стека обмена. –

ответ

2

Вот аннотированный фрагмент кода для простого градиентного спуска для логистической регрессии. Чтобы ввести регуляризацию, вы захотите обновить уравнения стоимости и градиента. В этом коде, тета являются параметры, X являются прогностическим классом, у классовой-метка и альфа скорость

обучения я надеюсь, что это помогает :)

function [theta,J_store] = logistic_gradientDescent(theta, X, y,alpha,numIterations) 

% Initialize some useful values 
m = length(y); % number of training examples 
n = size(X,2); %number of features 

J_store = 0; 
%J_store = zeros(numIterations,1); 


for iter=1:numIterations 

    %predicts the class labels using the current weights (theta) 
    Z = X*theta; 
    h = sigmoid(Z); 

    %This is the normal cost function equation 
    J = (1/m).*sum(-y.*log(h) - (1-y).*log(1-h)); 


    %J_store(iter) = J; 



    %This is the equation to obtain the given the current weights, without regularisation 
    grad = [(1/m) .* sum(repmat((h - y),1,n).*X)]'; 


    theta = theta - alpha.*grad; 


end 

end 
Смежные вопросы