changeset 193:cc540df790f4 danieleb

Simple example that demonstrated dictionary learning... to be completed
author Daniele Barchiesi <daniele.barchiesi@eecs.qmul.ac.uk>
date Fri, 09 Mar 2012 15:12:01 +0000
parents f1e601cc916d
children 9b0595a8478d
files examples/SMALL_DL_test.m
diffstat 1 files changed, 62 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/SMALL_DL_test.m	Fri Mar 09 15:12:01 2012 +0000
@@ -0,0 +1,62 @@
+function SMALL_DL_test
+clear, clc, close all
+% Create a 2-dimensional dataset of points that are oriented in 3
+% directions on a x-y plane
+nData = 10000;						%number of data
+theta = [pi/6 pi/3 4*pi/6];			%angles
+m     = length(theta);
+Q	  = [cos(theta); sin(theta)];	%rotation matrix
+X	  = Q*randmog(m,nData);
+
+% find principal directions using PCA and plot them
+XXt = X*X';
+[U ~] = svd(XXt);
+scale = 3;
+subplot(1,2,1), hold on
+title('Principal Component Analysis')
+scatter(X(1,:), X(2,:),'.');
+O = zeros(size(U));
+quiver(O(1,1:2),O(2,1:2),scale*U(1,:),scale*U(2,:),'LineWidth',2,'Color','k')
+axis equal
+
+subplot(1,2,2), hold on
+title('K-SVD Dictionary')
+scatter(X(1,:), X(2,:),'.');
+axis equal
+nAtoms   = 3;
+initDict = randn(2,nAtoms);
+nIter = 10;
+O = zeros(size(initDict));
+% apply dictionary learning algorithm
+ksvd_params = struct('data',X,...		%training data
+					 'Tdata',1,...		%sparsity level
+					 'dictsize',nAtoms,...	%number of atoms
+					 'initdict',initDict,...
+					 'iternum',10);		%number of iterations
+DL = SMALL_init_DL('ksvd','ksvd',ksvd_params);
+DL.D = initDict;
+xdata = DL.D(1,:);
+ydata = DL.D(2,:);
+qPlot = quiver(O(1,:),O(2,:),scale*initDict(1,:),scale*initDict(2,:),...
+	'LineWidth',2,'Color','k','XDataSource','xdata','YDataSource','ydata');
+problem = struct('b',X);				%training data
+
+%plot dictionary and learn
+for iIter=1:nIter
+	DL.ksvd_params.initdict = DL.D;
+	DL = SMALL_learn(problem,DL);			%learn dictionary
+	xdata = DL.D(1,:);	
+	ydata = DL.D(2,:);
+	pause
+	refreshdata(gcf,'caller');
+	%quiver(O(1,:),O(2,:),scale*DL.D(1,:),scale*DL.D(2,:),'LineWidth',2,'Color','k');
+end
+
+
+function X = randmog(m, n)
+% RANDMOG - Generate mixture of Gaussians
+s = [0.2 2];
+% Choose which Gaussian
+G1 = (rand(m, n) < 0.9);
+% Make them
+X = (G1.*s(1) + (1-G1).*s(2)) .* randn(m,n);