| 1 | function[phi,llh] = constructionModelesLassoRank(Pi,Rho,mini,maxi,X,Y,tau,A1,rangmin,rangmax) |
| 2 | |
| 3 | PI = 4.0 * atan(1.0); |
| 4 | |
| 5 | %get matrix sizes |
| 6 | [n,p] = size(X); |
| 7 | [~,m,k,~] = size(Rho); |
| 8 | L = size(A1, 2); %A1 est p x m+1 x L ou p x L ?! |
| 9 | |
| 10 | %On cherche les rangs possiblement intéressants |
| 11 | deltaRank = rangmax - rangmin + 1; |
| 12 | Size = deltaRank^k; |
| 13 | Rank = zeros(Size,k,'int64'); |
| 14 | for r=1:k |
| 15 | %On veut le tableau de toutes les combinaisons de rangs possibles |
| 16 | %Dans la première colonne : on répète (rangmax-rangmin)^(k-1) chaque chiffre : ca remplit la colonne |
| 17 | %Dans la deuxieme : on répète (rangmax-rangmin)^(k-2) chaque chiffre, et on fait ca (rangmax-rangmin)^2 fois |
| 18 | %... |
| 19 | %Dans la dernière, on répète chaque chiffre une fois, et on fait ca (rangmin-rangmax)^(k-1) fois. |
| 20 | Rank(:,r) = rangmin + reshape(repmat(0:(deltaRank-1), deltaRank^(k-r), deltaRank^(r-1)), Size, 1); |
| 21 | end |
| 22 | |
| 23 | %output parameters |
| 24 | phi = zeros(p,m,k,L*Size); |
| 25 | llh = zeros(L*Size,2); |
| 26 | for lambdaIndex=1:L |
| 27 | %On ne garde que les colonnes actives |
| 28 | %active sera l'ensemble des variables informatives |
| 29 | active = A1(:,lambdaIndex); |
| 30 | active(active==0) = []; |
| 31 | if length(active) > 0 |
| 32 | for j=1:Size |
| 33 | [phiLambda,LLF] = EMGrank(Pi(:,lambdaIndex),Rho(:,:,:,lambdaIndex),mini,maxi,X(:,active),Y,tau,Rank(j,:)); |
| 34 | llh((lambdaIndex-1)*Size+j,:) = [LLF, sum(Rank(j,:) .* (length(active)-Rank(j,:)+m))]; |
| 35 | phi(active,:,:,(lambdaIndex-1)*Size+j) = phiLambda; |
| 36 | end |
| 37 | end |
| 38 | end |
| 39 | |
| 40 | end |