Регрессия в Matlab, исходя из условий распределенной ошибки студента - PullRequest
1 голос
/ 21 февраля 2010

Я вижу, что можно использовать регресс / регаты для OLS, и я обнаружил онлайн-реализацию L1-регрессии (Лапласа), но я не могу понять, как реализовать термины распределенной ошибки. Я пытался максимизировать логарифмическую вероятность остатков, но, похоже, не нашел правильного ответа.

classdef student < handle
   methods (Static)

       % Find the sigma that maximizes the Log Liklihood function given a B
       function s = findLonS(r,df)
           n = length(r);

           % if x ~ t location, scale distribution with df 
           % degrees of freedom, then (x-u)/sigma ~ t(df)
           f = @(s) -sum(log(tpdf(r ./ s, df)));

           s = fminunc(f, (r'*r)/n);
       end

       function B = regress(X,Y,df) 
           [n,m] = size(X);

           bInit = ones(m, 1);

           r = (Y - X*bInit);
           s = student.findLonS(r, df);

           % if x ~ t location, scale distribution with df 
           % degrees of freedom, then (x-u)/sigma ~ t(df)
           f = @(b) -sum(log(tpdf((Y - X*b) ./ s, df)));

           options = optimset('MaxFunEvals', 10000, 'TolX', 1e-16, 'TolFun', 1e-16);
           [B, fval] = fminunc(f, bInit, options); 
       end
   end
end

По сравнению с реализацией R (которая, как я знаю, была протестирована и точна), решения, которые я получаю, неверны.

Какие-либо предложения по исправлению или идеи, где я мог бы найти решение уже доступно?

1 Ответ

0 голосов
/ 21 февраля 2010

Я думаю, вы должны настроить масштаб s для заданного b. Это будет означать либо выполнение альтернативной оптимизации b, затем настройку s и повторную оптимизацию b, либо, возможно, переписать вашу цель как

f = @(b)(-sum(log(tpdf((Y-X*b) ./ student.findLonS(Y-X*b,df),df))));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...