Avrei bisogno di un vostro aiuto per un esame in università dal quale non riesco ad uscirne da solo .
L'argomento del progetto è effettuare una comparazione tra alcuni algoritmi di regressione / interpolazione (tipo metodo dei minimi quadrati, spline...) con degli algoritmi di apprendimento (prima SVN / pegasos e in seguito kernel polinomiale).
La teoria su cui mi sto basando (fornita dal professore) per effettuare la regressione via apprendimento, ovvero l'utilizzo della funzione epsilon-insensitive al posto di una normale hinge loss, è discussa nel paper a questo link : http://www.jmlr.org/papers/volume6/dekel05a/dekel05a.pdf ed è proprio su questo paper che sto avendo delle difficoltà.
In particolare sto usando lo pseudocodice che si trova in pagina 16 partendo dalla base di Gradient Descend.
Ora, tralasciando l'errore nello pseudocodice dove nel passo di predizione manca il parametro y facendo quindi diventare l'operazione δt=λt*Xt-Yt al posto di δt=λt*Xt come riportato; non riesco a capire perchè il calcolo effettuato dal mio algoritmo non riesce ad apprendere correttamente la funzione in ingresso, anzi, resta piatta. (link all'immagine: https://postimg.org/image/ab3j40dnn/ )
L'algoritmo che ho scriptato con matlab basato sullo pseudo codice è il seguente:
function [ w_norm ] = Pegasos (x,y,eps)
% inizializzazione parametri
t=max(size(x)); %numero di cicli
w=x;
for i=1:t
w(i)=0; %primo peso
end
R=2*(norm(x)^2); %massimo parametro di perdita cumulativa
for i=1:t-1
y_pred=w(i)*x(i)-y(i);
L=(1/(1+exp((-1*y_pred)+eps)))-(1/(1+exp(y_pred+eps)));
B=L/R;
for j=1:i+1
w(j)=w(j)-B*x(j);
end
end
w_norm=w;
end
Passando ai dati, la funzione che ho tentato di stimare è la
y=sin(log(x)) nell'intervallo X=0.001:1:150 ma come riporto di seguito, il risultato non è come sperato. Anche con funzioni più semplici (Y=x) senza perturbazione dei dati in ingresso il risultato non varia, quindi mi viene da pensare che ci sia un errore nell'algoritmo, ma se così fosse non lo riesco a trovare. Per calcolare la Y partendo dal parametro w_norm che l'algoritmo di apprendimento mi restituisce, effettuo Y=w_norm*x come riportato in pagina 1 del paper.
So che il tipo di problema non si vede tutti i giorni ma riuscite a darci un occhio e dirmi se per caso c'è un errore in quanto sto eseguendo? Ho riletto più e più volte il paper e il discorso teorico fila per quanto il pratico invece mi risponda picche.
Se avete richieste su altre parti del codice o del progetto sono a disposizione ovviamente nel caso non fosse sufficiente quanto riportato!
Grazie mille in anticipo per qualsiasi aiuto, ormai non so più dove sbattere la testa!