Vous n'êtes pas identifié.
Vous êtes sur le forum du master ESA !
Le site du master ESA - description de la formation, notes de cours, contacts... vient de déménager !!!
Venez visiter notre nouveau site : www.master-esa.fr
Pages: 1
Une petite macro faite maison pour trouver le parametre de lissage selon la methode validation croisée.
%macro lissage(index=); proc iml; use &index; read all var _all_ into index; n=nrow(index); cvb1=j(1000,1,0); liss=j(1000,1,0); plot=j(1000,2,0); do l=1 to 1000 ; b=l/1000; c1=1/(n*b); c2=1/n; c3=2/(n-1); somme1=0; somme2=0; do i=1 to n; do j=1 to n; som1=1/(2*sqrt(3.14))*exp(-1/4*((index[j]-index[i])/b)##2); somme1=somme1+som1; som2=1/sqrt(2*3.14)*exp(-1/2*((index[j]-index[i])/b)##2); somme2=somme2+som2; end; end; cvb=c1*((c2*somme1)-(c3*somme2)+(c3*(n/sqrt(2*3.14)))); cvb1[l,1]=cvb; liss[l,1]=l/1000; plot[l,1]=cvb; plot[l,2]=l/1000; end; resulta=min(cvb1); fin=j(1000,2,0); do j=1 to 1000; if cvb1[j,1]=resulta then fin[j,1]=cvb1[j,1]; else fin[j,1]=0; if cvb1[j,1]=resulta then fin[j,2]=liss[j,1]; else fin[j,2]=0; end; create sortie FROM fin ; append FROM fin ; close sortie ; create graph FROM plot ; append FROM plot ; close graph ; quit; data sortie; set sortie; label COL1='valeur de la lscv'; label COL2='paramétre de lissage'; run; proc print data=sortie label noobs; where COL1^=0; run; proc sort data=graph; by COL2; run; symbol i=join v=none c=blue; axis1 label=('h' justify=right); axis2 label=('lscv' justify=right); proc gplot data=graph; plot COL1*COL2 / vref=0 haxis=axis1 vaxis=axis2; title 'La fonction lscv'; run; %mend; %lissage(index=score);
qlqs explications :
-tout d'abord ca concerne le kernel normal, pour les autres kernel il suffit de mofier ' f ' (cf le pdf de Sonia Jean) ( la flème de faire les '%if' ).
-Ca permet de tracer la lscv en fonction de h ( on remarque que la fonction est globalement convexe ).
-il est possible de l'integrer dans la macro 'klein spady' (c'est le but aprés tout !) modulo qlqs petites modifs (mais ca c'est à vous de chercher ).
-le calcul est un peu long quand il s'agit d'échatillons "balèz" !
-on fait ce qu'on peut !
Bonne utilisation ! (..si utilisation il y a..)
Hors ligne
version light, un peu plus rapide.
%macro lissage(index=); proc iml; use &index; read all var _all_ into index; start liss(b) global(index); n=nrow(index); c1=1/(n*b); c2=1/n; c3=2/(n-1); somme1=0; somme2=0; do i=1 to n; do j=1 to n; som1=1/(2*sqrt(3.14))*exp(-1/4*((index[j]-index[i])/b)##2); somme1=somme1+som1; som2=1/sqrt(2*3.14)*exp(-1/2*((index[j]-index[i])/b)##2); somme2=somme2+som2; end; end; cvb=-c1*((c2*somme1)-(c3*somme2)+(c3*(n/sqrt(2*3.14)))); return(cvb); finish liss; options = {1,2}; parmin=j(1,1,0.1); call nlpnra(rc,h,"liss",parmin,options); call nlpfdd(f,g,hess,"liss",h); param=h; print,"Résultats de la méthode de validation croisée",, param; quit; %mend; %lissage(index=score);
Hors ligne
Voici le lien du pdf sur le ql je me suis basé pour ecrire ce programme.
http://www.collectionscanada.ca/obj/s4/ … q25615.pdf
Les méthodes d'identification du 'bandwidth parameter' sont mentionnées à partir de la page 17 ( 2.5 choix du paramètre de lissage )
Aprés je ne sais pas si c'est générale comme méthode... espérons le car elles sont faciles !
Hors ligne
La réponse l'an prochain dans le cours de M2...
Hors ligne
i hope so !!
Qui ne tente rien a rien .Sinon j'ai utilisé l'autre méthode (Pas dure à programmer d'ailleurs !) qui consiste à fixer un h arbitraire ( donc faire une boucle sur les h de 0 à 1 avec un pas de 0.01 puis de 0 à 20 avec un pas de 0.1 ) et ensuite maximiser le taux de bon classement du modèle.
Une dernière question ( après j'arrête lol ) est ce qu'il est possible de booster les performances de SAS afin qu'il puisse calculer plus rapidement ? j'ai vu qu'il y a des options dans la proc iml ( WORKSIZE = et SYMSIZE= ) mais c'est pas bien expliqué dans l'aide... je trouve qu'il fait pas assez ramer le PC !
Voila Voila ! merci pour vos conseils !
cordialement
Hors ligne
Pages: 1