[Machine Learning - programmazione] SVM - pegasos e regressione

Ciao a tutti!

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!
non hai amici in uni? asd
Veramente si, quelli della triennale ma anche per loro il problema è troppo specifico quindi non riescono ad aiutarmi. Per quanto riguarda i colleghi di corso, non ho mai avuto tempo di socializzare visto che devo fuggire al lavoro facendo un full time.
Siccome nessuno ti caga, ti dico, io non so niente dell'argomento. Ma quando ho problemi simili, cerco su google books o google scholar libri o articoli che affrontano l'argomento, poi mi "procuro" il libro/articolo (piemma se vuoi per sapere dove).
Non so una mazza del metodo in esame, e non ho la forza di navigare 30 pagine. Posso dire due cose:

1) stai attento che nei linguaggi di programmazione la divisione di un intero per qualcosa ritorna un valore intero. ho il sospetto che MATLAB ti stia arrotondando di brutto questi valori

L=(1/(1+exp((-1*y_pred)+eps)))-(1/(1+exp(y_pred+eps)));

mandando a zero il valore di L, con gli effetti che hai già descritto. è un'ipotesi, prova a verificare.

2) personalmente ho repulsione per il gradient descent e tecniche affini, che non funzionano in nessuna occasione pratica, se non quando la soluzione di partenza si trova già nel bacino di attrazione di una soluzione ottimale. però, com'è ovvio, tale posizione non è nota a priori poi magari per i tuoi modelli la tecnica funziona, ma personalmente le regressioni non lineari le faccio con qualcos'altro di più robusto agli ottimi locali

Avevo già verificato ed effettivamente andava a zero in quanto manca nel paper il parametro -Yt nel calcolo della "y_predetta". Attualmente i valori vengono calcolati, valori piccoli ma "esistenti". Provo a ricontrollare con calma questo punto comunque!


Eh infatti io volevo farlo con un altro algoritmo, ma questa è stata la direttiva del prof