daniele@193: function SMALL_DL_test daniele@193: clear, clc, close all daniele@193: % Create a 2-dimensional dataset of points that are oriented in 3 daniele@193: % directions on a x-y plane daniele@193: nData = 10000; %number of data daniele@193: theta = [pi/6 pi/3 4*pi/6]; %angles daniele@193: m = length(theta); daniele@193: Q = [cos(theta); sin(theta)]; %rotation matrix daniele@193: X = Q*randmog(m,nData); daniele@193: daniele@193: % find principal directions using PCA and plot them daniele@193: XXt = X*X'; daniele@193: [U ~] = svd(XXt); daniele@193: scale = 3; daniele@193: subplot(1,2,1), hold on daniele@193: title('Principal Component Analysis') daniele@193: scatter(X(1,:), X(2,:),'.'); daniele@193: O = zeros(size(U)); daniele@193: quiver(O(1,1:2),O(2,1:2),scale*U(1,:),scale*U(2,:),'LineWidth',2,'Color','k') daniele@193: axis equal daniele@193: daniele@193: subplot(1,2,2), hold on daniele@193: title('K-SVD Dictionary') daniele@193: scatter(X(1,:), X(2,:),'.'); daniele@193: axis equal daniele@193: nAtoms = 3; daniele@193: initDict = randn(2,nAtoms); daniele@193: nIter = 10; daniele@193: O = zeros(size(initDict)); daniele@193: % apply dictionary learning algorithm daniele@193: ksvd_params = struct('data',X,... %training data daniele@193: 'Tdata',1,... %sparsity level daniele@193: 'dictsize',nAtoms,... %number of atoms daniele@193: 'initdict',initDict,... daniele@193: 'iternum',10); %number of iterations daniele@193: DL = SMALL_init_DL('ksvd','ksvd',ksvd_params); daniele@193: DL.D = initDict; daniele@193: xdata = DL.D(1,:); daniele@193: ydata = DL.D(2,:); daniele@193: qPlot = quiver(O(1,:),O(2,:),scale*initDict(1,:),scale*initDict(2,:),... daniele@193: 'LineWidth',2,'Color','k','XDataSource','xdata','YDataSource','ydata'); daniele@193: problem = struct('b',X); %training data daniele@193: daniele@193: %plot dictionary and learn daniele@193: for iIter=1:nIter daniele@193: DL.ksvd_params.initdict = DL.D; daniele@193: DL = SMALL_learn(problem,DL); %learn dictionary daniele@193: xdata = DL.D(1,:); daniele@193: ydata = DL.D(2,:); daniele@193: pause daniele@193: refreshdata(gcf,'caller'); daniele@193: %quiver(O(1,:),O(2,:),scale*DL.D(1,:),scale*DL.D(2,:),'LineWidth',2,'Color','k'); daniele@193: end daniele@193: daniele@193: daniele@193: function X = randmog(m, n) daniele@193: % RANDMOG - Generate mixture of Gaussians daniele@193: s = [0.2 2]; daniele@193: % Choose which Gaussian daniele@193: G1 = (rand(m, n) < 0.9); daniele@193: % Make them daniele@193: X = (G1.*s(1) + (1-G1).*s(2)) .* randn(m,n);