Лассо разреженной группы с помощью пакета CVX MATLAB

Кто-нибудь знает, как я могу реализовать разреженное групповое лассо, используя CVX, пакет выпуклой оптимизации в MATLAB?

Я не знаю, как я могу описать формулу как прототип CVX.


person user4704857    schedule 25.03.2015    source источник


Ответы (4)


Я нашел кое-что здесь

Решил поделиться!!

person user4704857    schedule 25.03.2015

Обязательно ли использовать CVX? У Inria есть разреженный пакет моделирования под названием Spams, написанный на Matlab, R и Python. Если вам нужен групповой регуляризатор лассо, просмотрите документацию в проксимальном наборе инструментов. под mexproximalFlat. Есть и примеры. Я довольно часто использую спам-пакет python.

person Scott    schedule 29.03.2015

(исправление: оба поддерживают разные размеры групп. Пример из nfs поддерживает разные размеры групп за счет дополнительных ограничений.)

Обратитесь к этой веб-странице за примером, предоставленным nfs: http://ask.cvxr.com/t/formulating-sparse-group-lasso-in-cvx/793/4.
Однако этот пример, похоже, не позволяет использовать другую группу размеры. Вы можете обратиться к следующему примеру (используемая формула — уравнение 3 в Simon, Noah, and Robert Tibshirani. «Стандартизация и групповой штраф за лассо». Statistica Sinica 22.3 (2012): 983.)

% Refer to Eq. (3) in /Simon, Noah, and Robert Tibshirani. 
%    "Standardization and the group lasso penalty." 
%    Statistica Sinica 22.3 (2012): 983./

% Note that group LASSO allows different group sizes
N = 64; m = 3;   
rho = [2; 4; 6];  % group sizes
n = sum(rho); % num of total parameters
X = rand(N,n);   % X = [X1, X2, ..., X_m]
y = rand(N,1);
lambda = 1;

IndexM = [1, 2; 3, 6; 7, 12];  % indexes of elements in each group
cvx_begin
    % w = [beta1'; beta2'; ...; beta_m']
    variable w(n)    
    expression ws(m)
    for i = 1:m
        ws(i) = norm(w(IndexM(i,1):IndexM(i,2)),2);
    end

    minimize( norm(y-X*w, 2) +  lambda*(sqrt(rho)' * ws) )
cvx_end

% get beta_i, i.e. i-th beta corresponding to i-th group
% e.g. 
i = 2;
beta_i = w(IndexM(i,1):IndexM(i,2));
person oracleyue    schedule 21.02.2017

Я считаю, что CVX не может легко обрабатывать групповую норму в SGL, если вы жестко не запрограммируете групповую норму для каждого набора данных. Если вы используете Matlab, вы можете использовать набор инструментов SLEP.

person Frank Puk    schedule 15.03.2018