function varargout = mani(varargin) % mani: MANIfold learning demonstration GUI % by Todd Wittman, Department of Mathematics, University of Minnesota % E-mail wittman@math.umn.edu with comments & questions. % MANI Website: http://www.math.umn.edu/~wittman/mani/index.html % Last Modified by GUIDE v2.5 10-Apr-2005 13:28:36 % % Methods obtained from various authors. % MDS -- Michael Lee % ISOMAP -- J. Tenenbaum, de Silva, & Langford % LLE -- Sam Roweis & Lawrence Saul % Hessian LLE -- D. Donoho & C. Grimes % Laplacian -- M. Belkin & P. Niyogi % Diffusion Map -- R. Coifman & S. Lafon % LTSA -- Zhenyue Zhang & Hongyuan Zha % Begin initialization code - DO NOT EDIT gui_Singleton = 1; gui_State = struct('gui_Name', mfilename, ... 'gui_Singleton', gui_Singleton, ... 'gui_OpeningFcn', @mani_OpeningFcn, ... 'gui_OutputFcn', @mani_OutputFcn, ... 'gui_LayoutFcn', @mani_LayoutFcn, ... 'gui_Callback', []); if nargin & isstr(varargin{1}) gui_State.gui_Callback = str2func(varargin{1}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end % End initialization code - DO NOT EDIT % --- Executes just before mani is made visible. function mani_OpeningFcn(hObject, eventdata, handles, varargin) handles.output = hObject; guidata(hObject, handles); axes(handles.maniAXES); axis off; axes(handles.embedAXES); axis off; handles.X = 0; handles.ColorVector = 0; handles.Y = 0; handles.isExample = 0; handles.K = 12; handles.d = 2; handles.sigma = 1.45; handles.runTime = 0; handles.alpha = 0; guidata(hObject, handles); warning off; % --- Outputs from this function are returned to the command line. function varargout = mani_OutputFcn(hObject, eventdata, handles) varargout{1} = handles.output; function MatrixEdit_CreateFcn(hObject, eventdata, handles) % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end function MatrixEdit_Callback(hObject, eventdata, handles) % Hints: get(hObject,'String') returns contents of MatrixEdit as text % str2double(get(hObject,'String')) returns contents of MatrixEdit as a double function FileEdit_CreateFcn(hObject, eventdata, handles) % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end function FileEdit_Callback(hObject, eventdata, handles) % Hints: get(hObject,'String') returns contents of FileEdit as text % str2double(get(hObject,'String')) returns contents of FileEdit as a double % --- Executes on button press in LoadMatrix. function LoadMatrix_Callback(hObject, eventdata, handles) handles.X = evalin ('base', get(handles.MatrixEdit,'String')); handles.isExample = 0; guidata(hObject, handles); PlotManifold(hObject,eventdata,handles,0); updateString{1} = ['Matrix ',get(handles.MatrixEdit,'String'),' loaded.']; set(handles.UpdatesText,'String',updateString); guidata(hObject, handles); % --- Executes on button press in LoadFile. function LoadFile_Callback(hObject, eventdata, handles) Xtemp = dlmread(get(handles.FileEdit,'String'),' '); [m,n] = size(Xtemp); % Check if last column is all zeros. Reading error. if max(abs(Xtemp(:,n))) == 0 Xtemp = Xtemp(1:m,1:n-1); end; handles.X = Xtemp; handles.isExample = 0; guidata(hObject, handles); PlotManifold(hObject,eventdata,handles,0); updateString{1} = ['File ',get(handles.FileEdit,'String'),' loaded.']; set(handles.UpdatesText,'String',updateString); guidata(hObject, handles); % --- Executes during object creation, after setting all properties. function ExampleMenu_CreateFcn(hObject, eventdata, handles) % Hint: popupmenu controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes on selection change in ExampleMenu. function ExampleMenu_Callback(hObject, eventdata, handles) % Hints: contents = get(hObject,'String') returns ExampleMenu contents as cell array % contents{get(hObject,'Value')} returns selected item from ExampleMenu exampleValue = get(handles.ExampleMenu,'Value'); switch exampleValue case 1 % Swiss Roll set(handles.text19,'String','Z Scaling ='); set(handles.ParamEdit,'String','1.0'); case 2 % Swiss Hole set(handles.text19,'String','Z Scaling ='); set(handles.ParamEdit,'String','1.0'); case 3 % Corner Planes set(handles.text19,'String','Lift Angle ='); set(handles.ParamEdit,'String','45.0'); case 4 % Punctured Sphere set(handles.text19,'String','Z Scaling ='); set(handles.ParamEdit,'String','1.0'); case 5 % Twin Peaks set(handles.text19,'String','Z Scaling ='); set(handles.ParamEdit,'String','1.0'); case 6 % 3D Clusters set(handles.text19,'String','# Clusters ='); set(handles.ParamEdit,'String','3'); case 7 % Toroidal Helix set(handles.text19,'String','Sample Rate ='); set(handles.ParamEdit,'String','1.0'); case 8 % Gaussian set(handles.text19,'String','Sigma ='); set(handles.ParamEdit,'String','1.0'); case 9 % Occluded Disks set(handles.text19,'String','Occluder r ='); set(handles.ParamEdit,'String','1.0'); end; guidata(hObject,handles); % --- Executes during object creation, after setting all properties. function DimEdit_CreateFcn(hObject, eventdata, handles) % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end function DimEdit_Callback(hObject, eventdata, handles) % Hints: get(hObject,'String') returns contents of DimEdit as text % str2double(get(hObject,'String')) returns contents of DimEdit as a double % --- Executes during object creation, after setting all properties. function KEdit_CreateFcn(hObject, eventdata, handles) % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end function KEdit_Callback(hObject, eventdata, handles) % Hints: get(hObject,'String') returns contents of KEdit as text % str2double(get(hObject,'String')) returns contents of KEdit as a double % --- Executes during object creation, after setting all properties. function REdit_CreateFcn(hObject, eventdata, handles) % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end % --- Executes during object creation, after setting all properties. function SigmaEdit_CreateFcn(hObject, eventdata, handles) % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end function SigmaEdit_Callback(hObject, eventdata, handles) % Hints: get(hObject,'String') returns contents of SigmaEdit as text % str2double(get(hObject,'String')) returns contents of SigmaEdit as a double % --- Executes on button press in PCAButton. function PCAButton_Callback(hObject, eventdata, handles) handles.d = round(str2double(get(handles.DimEdit,'String'))); handles.d = max(1,handles.d); updateString{1} = 'Running PCA.'; set(handles.UpdatesText,'String',updateString); tic; handles.Y = pca(handles.X,handles.d); runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,0); assignin ('base','maniY',handles.Y); updateString{2} = ['PCA complete: ',num2str(runTime),'s']; updateString{3} = 'Embedding data written to matrix "maniY"'; set(handles.UpdatesText,'String',updateString); % --- Executes on button press in LLEButton. function LLEButton_Callback(hObject, eventdata, handles) handles.K = round(str2double(get(handles.KEdit,'String'))); handles.K = max(1,handles.K); handles.d = round(str2double(get(handles.DimEdit,'String'))); handles.d = max(1,handles.d); updateString{1} = 'Running LLE.'; set(handles.UpdatesText,'String',updateString); tic; handles.Y = lle(handles.X',handles.K,handles.d)'; runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,0); assignin ('base','maniY',handles.Y); updateString{2} = ['LLE complete: ',num2str(runTime),'s']; updateString{3} = 'Embedding data written to matrix "maniY"'; set(handles.UpdatesText,'String',updateString); % --- Executes on button press in MDSButton. function MDSButton_Callback(hObject, eventdata, handles) handles.d = round(str2double(get(handles.DimEdit,'String'))); handles.d = max(1,handles.d); updateString{1} = 'Running MDS.'; set(handles.UpdatesText,'String',updateString); tic; D = L2_distance(handles.X',handles.X',1); handles.Y = mdsFast(D, handles.d); runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,0); assignin ('base','maniY',handles.Y); updateString{2} = ['MDS complete: ',num2str(runTime),'s']; updateString{3} = 'Embedding data written to matrix "maniY"'; set(handles.UpdatesText,'String',updateString); % --- Executes on button press in LaplacianButton. function LaplacianButton_Callback(hObject, eventdata, handles) handles.K = round(str2double(get(handles.KEdit,'String'))); handles.K = max(1,handles.K); handles.d = round(str2double(get(handles.DimEdit,'String'))); updateString{1} = 'Running Laplacian Eigenmap.'; set(handles.UpdatesText,'String',updateString); tic; [E,V] = leigs(handles.X, 'nn', handles.K, handles.d+1); handles.Y = E(:,1:handles.d); runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,0); assignin ('base','maniY',handles.Y); updateString{2} = ['Laplacian complete: ',num2str(runTime),'s']; updateString{3} = 'Embedding data written to matrix "maniY"'; set(handles.UpdatesText,'String',updateString); % --- Executes on button press in ISOMAPButton. function ISOMAPButton_Callback(hObject, eventdata, handles) handles.K = round(str2double(get(handles.KEdit,'String'))); handles.K = max(1,handles.K); handles.d = round(str2double(get(handles.DimEdit,'String'))); handles.d = max(1,handles.d); options.dims = handles.d; updateString{1} = 'Running ISOMAP.'; set(handles.UpdatesText,'String',updateString); tic; D = L2_distance(handles.X',handles.X',1); [Y, R] = Isomap(D, handles.K, options); runTime = toc; handles.Y = Y.coords{1}'; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,0); assignin ('base','maniY',handles.Y); updateString{2} = ['ISOMAP complete: ',num2str(runTime),'s']; updateString{3} = 'Embedding data written to matrix "maniY"'; set(handles.UpdatesText,'String',updateString); % --- Executes on button press in HessianButton. function HessianButton_Callback(hObject, eventdata, handles) handles.K = round(str2double(get(handles.KEdit,'String'))); handles.K = max(1,handles.K); handles.d = round(str2double(get(handles.DimEdit,'String'))); handles.d = max(1,handles.d); updateString{1} = 'Running Hessian LLE.'; set(handles.UpdatesText,'String',updateString); tic; [Y, mse] = HLLE(handles.X',handles.K,handles.d); handles.Y = Y'; runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,0); assignin ('base','maniY',handles.Y); updateString{2} = ['Hessian LLE complete: ',num2str(runTime),'s']; updateString{3} = 'Embedding data written to matrix "maniY"'; set(handles.UpdatesText,'String',updateString); % --- Executes during object creation, after setting all properties. function ColorEdit_CreateFcn(hObject, eventdata, handles) % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end function ColorEdit_Callback(hObject, eventdata, handles) % Hints: get(hObject,'String') returns contents of ColorEdit as text % str2double(get(hObject,'String')) returns contents of ColorEdit as a double % --- Executes on button press in ColorCheck. function ColorCheck_Callback(hObject, eventdata, handles) % Hint: get(hObject,'Value') returns toggle state of ColorCheck % --- Executes during object creation, after setting all properties. function PointsEdit_CreateFcn(hObject, eventdata, handles) % Hint: edit controls usually have a white background on Windows. % See ISPC and COMPUTER. if ispc set(hObject,'BackgroundColor','white'); else set(hObject,'BackgroundColor',get(0,'defaultUicontrolBackgroundColor')); end function PointsEdit_Callback(hObject, eventdata, handles) % Hints: get(hObject,'String') returns contents of PointsEdit as text % str2double(get(hObject,'String')) returns contents of PointsEdit as a double % --- Executes on button press in RunAllButton. function RunAllButton_Callback(hObject, eventdata, handles) handles.K = round(str2double(get(handles.KEdit,'String'))); handles.K = max(1,handles.K); handles.d = round(str2double(get(handles.DimEdit,'String'))); handles.d = max(1,handles.d); handles.sigma = str2double(get(handles.SigmaEdit,'String')); handles.sigma = max(100*eps,abs(handles.sigma)); handles.alpha = str2double(get(handles.AlphaEdit,'String')); handles.alpha = abs(handles.alpha); PlotManifold(hObject,eventdata,handles,1); % Run MDS. try tic; D = L2_distance(handles.X',handles.X',1); handles.Y = mdsFast(D, handles.d); handles.runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,1); end; % Run PCA. try tic; handles.Y = pca(handles.X,handles.d); handles.runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,2); end; % Run ISOMAP. Uses same D as above. try tic; options.dims = handles.d; [Y, R] = Isomap(D, handles.K, options); handles.Y = Y.coords{1}'; handles.runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,3); end; % Run LLE. try tic; handles.Y = lle(handles.X',handles.K,handles.d)'; handles.runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,4); end; % Run HLLE. try tic; [Y, mse] = HLLE(handles.X',handles.K,handles.d); handles.Y = Y'; handles.runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,5); end; % Run Laplacian. try tic; [E,V] = leigs(handles.X, 'nn', handles.K, handles.d+1); handles.Y = E(:,1:handles.d); handles.runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,6); end; % Run Diffusion Map try tic; handles.Y = diffusionKernel(handles.X,handles.sigma,handles.alpha,handles.d); handles.runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,7); end; % Run LTSA, if possible. try tic; [T,NI] = LTSA (handles.X', handles.d, handles.K); handles.Y = T'; handles.runTime = toc; guidata(hObject, handles); PlotEmbedding(hObject,eventdata,handles,8); end; % Finished running all algorithms. updateString{1} = 'Ran all 8 algorithms.'; updateString{2} = 'Was it worth the wait?'; set(handles.UpdatesText,'String',updateString); % --- Executes on button press in ExampleButton. function ExampleButton_Callback(hObject, eventdata, handles) exampleValue = get(handles.ExampleMenu,'Value'); N = round(str2double(get(handles.PointsEdit,'String'))); % Number of points to use. N = max(1,N); ExParam = str2double(get(handles.ParamEdit,'String')); % Second parameter for example ExParam = max(0.0,ExParam); switch exampleValue case 1 % Swiss Roll tt = (3*pi/2)*(1+2*rand(1,N)); height = 21*rand(1,N); handles.X = [tt.*cos(tt); height; ExParam*tt.*sin(tt)]'; handles.ColorVector = tt'; updateString{1} = 'Swiss Roll example loaded.'; case 2 % Swiss Hole % Swiss Roll w/ hole example taken from Donoho & Grimes tt = (3*pi/2)*(1+2*rand(1,2*N)); height = 21*rand(1,2*N); kl = repmat(0,1,2*N); for ii = 1:2*N if ( (tt(ii) > 9)&(tt(ii) < 12)) if ((height(ii) > 9) & (height(ii) <14)) kl(ii) = 1; end; end; end; kkz = find(kl==0); tt = tt(kkz(1:N)); height = height(kkz(1:N)); handles.X = [tt.*cos(tt); height; ExParam*tt.*sin(tt)]'; handles.ColorVector = tt'; updateString{1} = 'Swiss Hole example loaded.'; case 3 % Corner Planes k = 1; xMax = floor(sqrt(N)); yMax = ceil(N/xMax); cornerPoint = floor(yMax/2); for x = 0:xMax for y = 0:yMax if y <= cornerPoint X(k,:) = [x,y,0]; ColorVector(k) = y; else X(k,:) = [x,cornerPoint+(y-cornerPoint)*cos(pi*ExParam/180),(y-cornerPoint)*sin(pi*ExParam/180)]; ColorVector(k) = y; end; k = k+1; end; end; handles.X = X; handles.ColorVector = ColorVector'; updateString{1} = 'Corner Planes example loaded.'; case 4 % Punctured Sphere by Saul & Roweis inc = 9/sqrt(N); %inc = 1/4; [xx,yy] = meshgrid(-5:inc:5); rr2 = xx(:).^2 + yy(:).^2; [tmp ii] = sort(rr2); Y = [xx(ii(1:N))'; yy(ii(1:N))']; a = 4./(4+sum(Y.^2)); handles.X = [a.*Y(1,:); a.*Y(2,:); ExParam*2*(1-a)]'; handles.ColorVector = handles.X(:,3); updateString{1} = 'Punctured Sphere example loaded.'; case 5 % Twin Peaks by Saul & Roweis inc = 1.5 / sqrt(N); % inc = 0.1; [xx2,yy2] = meshgrid(-1:inc:1); zz2 = sin(pi*xx2).*tanh(3*yy2); xy = 1-2*rand(2,N); handles.X = [xy; sin(pi*xy(1,:)).*tanh(3*xy(2,:))]'; handles.X(:,3) = ExParam * handles.X(:,3); handles.ColorVector = handles.X(:,3); updateString{1} = 'Twin Peaks example loaded.'; case 6 % 3D Clusters numClusters = ExParam; numClusters = max(1,numClusters); Centers = 10*rand(numClusters,3); D = L2_distance(Centers',Centers',1); minDistance = min(D(find(D>0))); k = 1; N2 = N - (numClusters-1)*9; for i = 1:numClusters for j = 1:ceil(N2/numClusters) X(k,1:3) = Centers(i,1:3)+(rand(1,3)-0.5)*minDistance/sqrt(12); ColorVector(k) = i; k = k + 1; end; % Connect clusters with straight line. if i < numClusters for t = 0.1:0.1:0.9 X(k,1:3) = Centers(i,1:3) + (Centers(i+1,1:3)-Centers(i,1:3))*t; ColorVector(k) = 0; k = k+1; end; end; end; handles.X = X; handles.ColorVector = ColorVector; updateString{1} = '3D Clusters example loaded.'; case 7 % Toroidal Helix by Coifman & Lafon noiseSigma=0.05; %noise parameter t = (1:N)'/N; t = t.^(ExParam)*2*pi; handles.X = [(2+cos(8*t)).*cos(t) (2+cos(8*t)).*sin(t) sin(8*t)]+noiseSigma*randn(N,3); handles.ColorVector = t; updateString{1} = 'Toroidal Helix example loaded.'; case 8 % Gaussian randomly sampled X = ExParam * randn(N,3); X(:,3) = 1 / (ExParam^2 * 2 * pi) * exp ( (-X(:,1).^2 - X(:,2).^2) / (2*ExParam^2) ); handles.X = X; handles.ColorVector = X(:,3); updateString{1} = 'Gaussian example loaded.'; case 9 % Occluded disks m = 20; % Image size m x m. Rd = 3; % Disk radius. Center = (m+1)/2; u0 = zeros(m,m); for i = 1:m for j = 1:m if (Center - i)^2 + (Center - j)^2 < ExParam^2 u0(i,j) = 1; end; end; end; for diskNum = 1:N DiskX(diskNum) = (m-1)*rand+1; DiskY(diskNum) = (m-1)*rand+1; u = u0; for i = 1:m for j = 1:m if (DiskY(diskNum) - i)^2 + (DiskX(diskNum) - j)^2 < Rd^2 u(i,j) = 1; end; end; end; X(diskNum,:) = reshape(u,1,m*m); end; % Since this is a special manifold, plot separately. axes(handles.maniAXES); t = 0:0.1:2*pi+0.1; plot(ExParam*cos(t)+Center,ExParam*sin(t)+Center); axis([0.5 m+0.5 0.5 m+0.5]); hold on; handles.ColorVector = (sqrt((DiskX-Center).^2+(DiskY-Center).^2))'; scatter(DiskX,DiskY,12,handles.ColorVector'); hold off; handles.X = X; updateString{1} = 'Occluded Disks example loaded.'; updateString{3} = 'Warning: Embedding may be slow.'; end; assignin ('base','maniX',handles.X); updateString{2} = 'Manifold data written to matrix "maniX"'; set(handles.UpdatesText,'String',updateString); handles.isExample = 1; guidata(hObject, handles); if exampleValue ~= 9 % Already plotted Occluded Disks example. PlotManifold(hObject,eventdata,handles,0); end; % --- Plot the input manifold. function PlotManifold (hObject, eventdata, handles, plotNumber) [m,n] = size(handles.X); if get(handles.ColorCheck,'Value') == 1 & handles.isExample == 0 handles.ColorVector = evalin ('base',get(handles.ColorEdit,'String')); Clength = length(handles.ColorVector); if Clength < m handles.ColorVector(Clength+1:m) = handles.ColorVector(Clength); elseif Clength > m handles.ColorVector = handles.ColorVector(1:m); end; end; guidata(hObject, handles); if plotNumber == 0 axes(handles.maniAXES); else figure; subplot(331); end; if n == 2 if get(handles.ColorCheck,'Value') == 1 | handles.isExample == 1 scatter(handles.X(:,1),handles.X(:,2),12,handles.ColorVector,'filled'); else scatter(handles.X(:,1),handles.X(:,2),12,'filled'); end; axis tight; elseif n == 3 if get(handles.ColorCheck,'Value') == 1 | handles.isExample == 1 scatter3(handles.X(:,1),handles.X(:,2),handles.X(:,3),12,handles.ColorVector,'filled'); else scatter3(handles.X(:,1),handles.X(:,2),handles.X(:,3),12,'filled'); end; axis tight; elseif n == 1 if get(handles.ColorCheck,'Value') == 1 | handles.isExample == 1 scatter(handles.X(:,1),ones(m,1),12,handles.ColorVector,'filled'); else scatter(handles.X(:,1),ones(m,1),12,'filled'); end; axis tight; else cla; axis([-1 1 -1 1]); text(-0.7,0,'Only plots 2D or 3D data'); axis off; end; % --- Plot the output embedding. function PlotEmbedding (hObject, eventdata, handles, plotNumber) [m,n] = size(handles.Y); if get(handles.ColorCheck,'Value') == 1 & handles.isExample == 0 handles.ColorVector = evalin ('base',get(handles.ColorEdit,'String')); Clength = length(handles.ColorVector); if Clength < m handles.ColorVector(Clength+1:m) = handles.ColorVector(Clength); elseif Clength > m handles.ColorVector = handles.ColorVector(1:m); end; end; guidata(hObject, handles); if plotNumber == 0 axes(handles.embedAXES); else subplot(3,3,plotNumber+1); end; if n == 2 if get(handles.ColorCheck,'Value') == 1 | handles.isExample == 1 scatter(handles.Y(:,1),handles.Y(:,2),12,handles.ColorVector,'filled'); else scatter(handles.Y(:,1),handles.Y(:,2),12,'filled'); end; axis tight; elseif n == 3 if get(handles.ColorCheck,'Value') == 1 | handles.isExample == 1 scatter3(handles.Y(:,1),handles.Y(:,2),handles.Y(:,3),12,handles.ColorVector,'filled'); else scatter3(handles.Y(:,1),handles.Y(:,2),handles.Y(:,3),12,'filled'); end; axis tight; elseif n == 1 if get(handles.ColorCheck,'Value') == 1 | handles.isExample == 1 scatter(handles.Y(:,1),ones(m,1),12,handles.ColorVector,'filled'); else scatter(handles.Y(:,1),ones(m,1),12,'filled'); end; axis tight; else cla; axis([-1 1 -1 1]); text(-0.7,0,'Only plots 2D or 3D data'); axis off; end; timeunits = 's'; if handles.runTime >= 60 handles.runTime = handles.runTime / 60; timeunits = 'm'; end; if handles.runTime >= 60 handles.runTime = handles.runTime / 60; timeunits = 'h'; end; switch plotNumber case 1 title(['MDS: ',num2str(handles.runTime),timeunits]); pause(0.01); case 2 title(['PCA: ',num2str(handles.runTime),timeunits]); pause(0.01); case 3 title(['ISOMAP: ',num2str(handles.runTime),timeunits]); pause(0.01); case 4 title(['LLE: ',num2str(handles.runTime),timeunits]); pause(0.01); case 5 title(['Hessian LLE: ',num2str(handles.runTime),timeunits]); pause(0.01); case 6 title(['Laplacian: ',num2str(handles.runTime),timeunits]); xlabel(['KNN = ',num2str(handles.K)]); pause(0.01); case 7 title(['Diffusion Map: ',num2str(handles.runTime),timeunits]); xlabel(['Alpha = ',num2str(handles.alpha)]); pause(0.01); case 8 title(['LTSA: ',num2str(handles.runTime),timeunits]); xlabel(['Sigma = ',num2str(handles.sigma)]); end; % --- LLE ALGORITHM (using K nearest neighbors) % Written by Sam Roweis & Lawrence Saul function [Y] = lle(X,K,d) warning off; [D,N] = size(X); % STEP1: COMPUTE PAIRWISE DISTANCES & FIND NEIGHBORS X2 = sum(X.^2,1); distance = repmat(X2,N,1)+repmat(X2',1,N)-2*X'*X; [sorted,index] = sort(distance); neighborhood = index(2:(1+K),:); % STEP2: SOLVE FOR RECONSTRUCTION WEIGHTS if(K>D) tol=1e-3; % regularlizer in case constrained fits are ill conditioned else tol=0; end W = zeros(K,N); for ii=1:N z = X(:,neighborhood(:,ii))-repmat(X(:,ii),1,K); % shift ith pt to origin C = z'*z; % local covariance C = C + eye(K,K)*tol*trace(C); % regularlization (K>D) W(:,ii) = C\ones(K,1); % solve Cw=1 W(:,ii) = W(:,ii)/sum(W(:,ii)); % enforce sum(w)=1 end; % STEP 3: COMPUTE EMBEDDING FROM EIGENVECTS OF COST MATRIX M=(I-W)'(I-W) M = sparse(1:N,1:N,ones(1,N),N,N,4*K*N); for ii=1:N w = W(:,ii); jj = neighborhood(:,ii); M(ii,jj) = M(ii,jj) - w'; M(jj,ii) = M(jj,ii) - w; M(jj,jj) = M(jj,jj) + w*w'; end; % CALCULATION OF EMBEDDING options.disp = 0; options.isreal = 1; options.issym = 1; [Y,eigenvals] = eigs(M,d+1,0,options); Y = Y(:,1:d)'*sqrt(N); % bottom evect is [1,1,1,1...] with eval 0 % --- ISOMAP Algorithm % Written by Tenenbaum, de Silva, and Langford (2000). function [Y, R] = Isomap(D, K, options); %%%%% Step 0: Initialization and Parameters %%%%% N = size(D,1); INF = 1000*max(max(D))*N; %% effectively infinite distance dims = options.dims; comp = 1; % Assume one component. Y.coords = cell(length(dims),1); R = zeros(1,length(dims)); %%%%% Step 1: Construct neighborhood graph %%%%% [tmp, ind] = sort(D); for i=1:N D(i,ind((2+K):end,i)) = INF; end; D = min(D,D'); %% Make sure distance matrix is symmetric %%%%% Step 2: Compute shortest paths %%%%% for k=1:N D = min(D,repmat(D(:,k),[1 N])+repmat(D(k,:),[N 1])); end %%%%% Remove outliers from graph %%%%% n_connect = sum(~(D==INF)); %% number of points each point connects to [tmp, firsts] = min(D==INF); %% first point each point connects to [comps, I, J] = unique(firsts); %% represent each connected component once size_comps = n_connect(comps); %% size of each connected component [tmp, comp_order] = sort(size_comps); %% sort connected components by size comps = comps(comp_order(end:-1:1)); size_comps = size_comps(comp_order(end:-1:1)); n_comps = length(comps); %% number of connected components if (comp>n_comps) comp=1; %% default: use largest component end Y.index = find(firsts==comps(comp)); D = D(Y.index, Y.index); N = length(Y.index); %%%%% Step 3: Construct low-dimensional embeddings (Classical MDS) %%%%% opt.disp = 0; [vec, val] = eigs(-.5*(D.^2 - sum(D.^2)'*ones(1,N)/N - ones(N,1)*sum(D.^2)/N + sum(sum(D.^2))/(N^2)), max(dims), 'LR', opt); h = real(diag(val)); [foo,sorth] = sort(h); sorth = sorth(end:-1:1); val = real(diag(val(sorth,sorth))); vec = vec(:,sorth); D = reshape(D,N^2,1); for di = 1:length(dims) if (dims(di)<=N) Y.coords{di} = real(vec(:,1:dims(di)).*(ones(N,1)*sqrt(val(1:dims(di)))'))'; r2 = 1-corrcoef(reshape(real(L2_distance(Y.coords{di}, Y.coords{di},0)),N^2,1),D).^2; R(di) = r2(2,1); end end clear D; % --- L2_distance function % Written by Roland Bunschoten, University of Amsterdam, 1999 function d = L2_distance(a,b,df) if (size(a,1) == 1) a = [a; zeros(1,size(a,2))]; b = [b; zeros(1,size(b,2))]; end aa=sum(a.*a); bb=sum(b.*b); ab=a'*b; d = sqrt(repmat(aa',[1 size(bb,2)]) + repmat(bb,[size(aa,2) 1]) - 2*ab); d = real(d); if (df==1) d = d.*(1-eye(size(d))); end % --- HLLE function % Written by David Donoho & Carrie Grimes, 2003. function [Y, mse] = HLLE(X,k,d) N = size(X,2); if max(size(k)) ==1 kvec = repmat(k,N,1); elseif max(size(k)) == N kvec=k; end; %Compute Nearest neighbors D1 = L2_distance(X,X,1); dim = size(X,1); nind = repmat(0, size(D1,1), size(D1,2)); dp = d*(d+1)/2; W = repmat(0,dp*N,N); if(mean(k)>d) tol=1e-3; % regularlizer in case constrained fits are ill conditioned else tol=0; end; for i=1:N tmp = D1(:,i); [ts, or] = sort(tmp); %take k nearest neighbors nind(or(2:kvec(i)+1),i) = 1; thisx = X(:,or(2:kvec(i)+1)); %center using the mean thisx = thisx - repmat(mean(thisx')',1,kvec(i)); %compute local coordinates [U,D,Vpr] = svd(thisx); V = Vpr(:,1:d); %Neighborhood diagnostics vals = diag(D); mse(i) = sum(vals(d+1:end)); %build Hessian estimator clear Yi; clear Pii; ct = 0; for mm=1:d startp = V(:,mm); for nn=1:length(mm:d) indles = mm:d; Yi(:,ct+nn) = startp.*(V(:,indles(nn))); end; ct = ct+length(mm:d); end; Yi = [repmat(1,kvec(i),1), V, Yi]; %orthogonalize linear and quadratic forms [Yt, Orig] = mgs(Yi); Pii = Yt(:,d+2:end)'; %double check weights sum to 1 for j=1:dp if sum(Pii(j,:)) >0.0001 tpp = Pii(j,:)./sum(Pii(j,:)); else tpp = Pii(j,:); end; %fill weight matrix W((i-1)*dp+j, or(2:kvec(i)+1)) = tpp; end; end; %%%%%%%%%%%%%%%%%%%%Compute eigenanalysis of W G=W'*W; G = sparse(G); options.disp = 0; options.isreal = 1; options.issym = 1; tol=0; [Yo,eigenvals] = eigs(G,d+1,tol,options); Y = Yo(:,1:d)'*sqrt(N); % bottom evect is [1,1,1,1...] with eval 0 %compute final coordinate alignment R = Y'*Y; R2 = R^(-1/2); Y = Y*R2; % --- leigs function for Laplacian eigenmap. % Written by Belkin & Niyogi, 2002. function [E,V] = leigs(DATA, TYPE, PARAM, NE) n = size(DATA,1); A = sparse(n,n); step = 100; for i1=1:step:n i2 = i1+step-1; if (i2> n) i2=n; end; XX= DATA(i1:i2,:); dt = L2_distance(XX',DATA',0); [Z,I] = sort ( dt,2); for i=i1:i2 for j=2:PARAM+1 A(i,I(i-i1+1,j))= Z(i-i1+1,j); A(I(i-i1+1,j),i)= Z(i-i1+1,j); end; end; end; W = A; [A_i, A_j, A_v] = find(A); % disassemble the sparse matrix for i = 1: size(A_i) W(A_i(i), A_j(i)) = 1; end; D = sum(W(:,:),2); L = spdiags(D,0,speye(size(W,1)))-W; opts.tol = 1e-9; opts.issym=1; opts.disp = 0; [E,V] = eigs(L,NE,'sm',opts); % --- diffusionKernel function % Written by R. Coifman & S. Lafon. function [Y] = diffusionKernel (X,sigmaK,alpha,d) D = L2_distance(X',X',1); K = exp(-(D/sigmaK).^2); p = sum(K); p = p(:); K1 = K./((p*p').^alpha); v = sqrt(sum(K1)); v = v(:); A = K1./(v*v'); if sigmaK >= 0.5 thre = 1e-7; M = max(max(A)); A = sparse(A.*double(A>thre*M)); [U,S,V] = svds(A,d+1); %Sparse version. U = U./(U(:,1)*ones(1,d+1)); else [U,S,V] = svd(A,0); %Full version. U = U./(U(:,1)*ones(1,size(U,1))); end; Y = U(:,2:d+1); % --- mgs function: Modified Gram-Schmidt % Used by HLLE function. function [Q, R] = mgs(A); [m, n] = size(A); % Assume m>=n. V = A; R = zeros(n,n); for i=1:n R(i,i) = norm(V(:,i)); V(:,i) = V(:,i)/R(i,i); if (i < n) for j = i+1:n R(i,j) = V(:,i)' * V(:,j); V(:,j) = V(:,j) - R(i,j) * V(:,i); end; end; end; Q = V; % --- function mdsFast for Multi-Dimensional Scaling % Written by Michael D. Lee. % Lee recommends metric=2, iterations=50, learnrate=0.05. function [points]=mdsFast(d,dim) [n, check] = size(d); iterations = 30; lr=0.05; % learnrate r=2; % metric % normalise distances to lie between 0 and 1 reshift=min(min(d)); d=d-reshift; rescale=max(max(d)); d=d/rescale; % calculate the variance of the distance matrix dbar=(sum(sum(d))-trace(d))/n/(n-1); temp=(d-dbar*ones(n)).^2; vard=.5*(sum(sum(temp))-trace(temp)); % initialize variables its=0; p=rand(n,dim)*.01-.005; dh=zeros(n); rinv=1/r; %PT kk=1:dim; %PT % main loop for the given number of iterations while (itsN a = sum(data.*data); dist2 = sqrt(repmat(a',[1 N]) + repmat(a,[N 1]) - 2*(data'*data)); for i=1:N % Determine ki nearest neighbors of x_j [dist_sort,J] = sort(dist2(:,i)); Ii = J(1:K(i)); NI{i} = Ii; end; else for i=1:N % Determine ki nearest neighbors of x_j x = data(:,i); ki = K(i); dist2 = sum((data-repmat(x,[1 N])).^2,1); [dist_sort,J] = sort(dist2); Ii = J(1:ki); NI{i} = Ii; end; end; else K = zeros(1,N); for i=1:N K(i) = length(NI{i}); end; end; % Step 1: local information BI = {}; Thera = {}; for i=1:N % Compute the d largest right singular eigenvectors of the centered matrix Ii = NI{i}; ki = K(i); Xi = data(:,Ii)-repmat(mean(data(:,Ii),2),[1,ki]); W = Xi'*Xi; W = (W+W')/2; [Vi,Si] = schur(W); [s,Ji] = sort(-diag(Si)); Vi = Vi(:,Ji(1:d)); % construct Gi Gi = [repmat(1/sqrt(ki),[ki,1]) Vi]; % compute the local orthogonal projection Bi = I-Gi*Gi' % that has the null space span([e,Theta_i^T]). BI{i} = eye(ki)-Gi*Gi'; end; B = speye(N); for i=1:N Ii = NI{i}; B(Ii,Ii) = B(Ii,Ii)+BI{i}; B(i,i) = B(i,i)-1; end; B = (B+B')/2; options.disp = 0; options.isreal = 1; options.issym = 1; [U,D] = eigs(B,d+2,0,options); lambda = diag(D); [lambda_s,J] = sort(abs(lambda)); U = U(:,J); lambda = lambda(J); T = U(:,2:d+1)'; % --- Creates and returns a handle to the GUI figure. function h1 = mani_LayoutFcn(policy) % policy - create a new figure or use a singleton. 'new' or 'reuse'. persistent hsingleton; if strcmpi(policy, 'reuse') & ishandle(hsingleton) h1 = hsingleton; return; end h1 = figure(... 'Units','characters',... 'Color',[0.925490196078431 0.913725490196078 0.847058823529412],... 'Colormap',[0 0 0.5625;0 0 0.625;0 0 0.6875;0 0 0.75;0 0 0.8125;0 0 0.875;0 0 0.9375;0 0 1;0 0.0625 1;0 0.125 1;0 0.1875 1;0 0.25 1;0 0.3125 1;0 0.375 1;0 0.4375 1;0 0.5 1;0 0.5625 1;0 0.625 1;0 0.6875 1;0 0.75 1;0 0.8125 1;0 0.875 1;0 0.9375 1;0 1 1;0.0625 1 1;0.125 1 0.9375;0.1875 1 0.875;0.25 1 0.8125;0.3125 1 0.75;0.375 1 0.6875;0.4375 1 0.625;0.5 1 0.5625;0.5625 1 0.5;0.625 1 0.4375;0.6875 1 0.375;0.75 1 0.3125;0.8125 1 0.25;0.875 1 0.1875;0.9375 1 0.125;1 1 0.0625;1 1 0;1 0.9375 0;1 0.875 0;1 0.8125 0;1 0.75 0;1 0.6875 0;1 0.625 0;1 0.5625 0;1 0.5 0;1 0.4375 0;1 0.375 0;1 0.3125 0;1 0.25 0;1 0.1875 0;1 0.125 0;1 0.0625 0;1 0 0;0.9375 0 0;0.875 0 0;0.8125 0 0;0.75 0 0;0.6875 0 0;0.625 0 0;0.5625 0 0],... 'IntegerHandle','off',... 'InvertHardcopy',get(0,'defaultfigureInvertHardcopy'),... 'MenuBar','none',... 'Name','mani',... 'NumberTitle','off',... 'PaperPosition',get(0,'defaultfigurePaperPosition'),... 'Position',[53.8 10.3846153846154 132.8 41.9230769230769],... 'Renderer',get(0,'defaultfigureRenderer'),... 'RendererMode','manual',... 'Resize','off',... 'HandleVisibility','callback',... 'Tag','figure1',... 'UserData',zeros(1,0)); setappdata(h1, 'GUIDEOptions', struct(... 'active_h', 1.500050e+002, ... 'taginfo', struct(... 'figure', 2, ... 'axes', 3, ... 'text', 22, ... 'listbox', 4, ... 'edit', 15, ... 'frame', 6, ... 'pushbutton', 17, ... 'popupmenu', 4, ... 'radiobutton', 3, ... 'checkbox', 2), ... 'override', 0, ... 'release', 13, ... 'resize', 'none', ... 'accessibility', 'callback', ... 'mfile', 1, ... 'callbacks', 1, ... 'singleton', 1, ... 'syscolorfig', 1, ... 'lastSavedFile', 'C:\matlab_sv13\manifold\mani.m')); h2 = axes(... 'Parent',h1,... 'Units','characters',... 'CameraPosition',[0.5 0.5 9.16025403784439],... 'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... 'Color',get(0,'defaultaxesColor'),... 'ColorOrder',get(0,'defaultaxesColorOrder'),... 'Position',[7 7.15384615384615 49.8 14.1538461538462],... 'XColor',get(0,'defaultaxesXColor'),... 'YColor',get(0,'defaultaxesYColor'),... 'ZColor',get(0,'defaultaxesZColor'),... 'Tag','embedAXES'); h3 = get(h2,'title'); set(h3,... 'Parent',h2,... 'Color',[0 0 0],... 'HorizontalAlignment','center',... 'Position',[0.5 1.03532608695652 1.00005459937205],... 'VerticalAlignment','bottom',... 'HandleVisibility','off'); h4 = get(h2,'xlabel'); set(h4,... 'Parent',h2,... 'Color',[0 0 0],... 'HorizontalAlignment','center',... 'Position',[0.495983935742972 -0.127717391304348 1.00005459937205],... 'VerticalAlignment','cap',... 'HandleVisibility','off'); h5 = get(h2,'ylabel'); set(h5,... 'Parent',h2,... 'Color',[0 0 0],... 'HorizontalAlignment','center',... 'Position',[-0.114457831325301 0.491847826086956 1.00005459937205],... 'Rotation',90,... 'VerticalAlignment','bottom',... 'HandleVisibility','off'); h6 = get(h2,'zlabel'); set(h6,... 'Parent',h2,... 'Color',[0 0 0],... 'HorizontalAlignment','right',... 'Position',[-0.142570281124498 2.44836956521739 1.00005459937205],... 'HandleVisibility','off',... 'Visible','off'); h7 = axes(... 'Parent',h1,... 'Units','characters',... 'CameraPosition',[0.5 0.5 9.16025403784439],... 'CameraPositionMode',get(0,'defaultaxesCameraPositionMode'),... 'Color',get(0,'defaultaxesColor'),... 'ColorOrder',get(0,'defaultaxesColorOrder'),... 'Position',[7 25.2307692307692 49.6 14.0769230769231],... 'XColor',get(0,'defaultaxesXColor'),... 'YColor',get(0,'defaultaxesYColor'),... 'ZColor',get(0,'defaultaxesZColor'),... 'Tag','maniAXES'); h8 = get(h7,'title'); set(h8,... 'Parent',h7,... 'Color',[0 0 0],... 'HorizontalAlignment','center',... 'Position',[0.497983870967742 1.03551912568306 1.00005459937205],... 'VerticalAlignment','bottom',... 'HandleVisibility','off'); h9 = get(h7,'xlabel'); set(h9,... 'Parent',h7,... 'Color',[0 0 0],... 'HorizontalAlignment','center',... 'Position',[0.497983870967742 -0.128415300546448 1.00005459937205],... 'VerticalAlignment','cap',... 'HandleVisibility','off'); h10 = get(h7,'ylabel'); set(h10,... 'Parent',h7,... 'Color',[0 0 0],... 'HorizontalAlignment','center',... 'Position',[-0.11491935483871 0.494535519125683 1.00005459937205],... 'Rotation',90,... 'VerticalAlignment','bottom',... 'HandleVisibility','off'); h11 = get(h7,'zlabel'); set(h11,... 'Parent',h7,... 'Color',[0 0 0],... 'HorizontalAlignment','right',... 'Position',[-0.143145161290323 1.1775956284153 1.00005459937205],... 'HandleVisibility','off',... 'Visible','off'); h12 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'FontSize',14,... 'ListboxTop',0,... 'Position',[22.4 21.3076923076923 20.4 2],... 'String','Embedding',... 'Style','text',... 'Tag','text2'); h13 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'FontSize',14,... 'ListboxTop',0,... 'Position',[16.2 39.3076923076923 30.8 2],... 'String','Original Manifold',... 'Style','text',... 'Tag','text1'); h14 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0 0],... 'ListboxTop',0,... 'Position',[62.6 24.2307692307692 65.4 16.6923076923077],... 'String',{ '' },... 'Style','frame',... 'Tag','frame1'); h15 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0 0],... 'FontSize',14,... 'ForegroundColor',[1 1 1],... 'ListboxTop',0,... 'Position',[65.4 37.9230769230769 17.6 2.15384615384615],... 'String','Manifold',... 'Style','text',... 'Tag','text3'); h16 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'ListboxTop',0,... 'Position',[66.8 36.2307692307692 15.4 1.53846153846154],... 'String','Matrix:',... 'Style','text',... 'Tag','text4'); h17 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'ListboxTop',0,... 'Position',[64.2 33.7692307692308 15.4 1.53846153846154],... 'String','File name:',... 'Style','text',... 'Tag','text6'); h18 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'ListboxTop',0,... 'Position',[64.6 27.5384615384615 15.4 1.53846153846154],... 'String','Examples:',... 'Style','text',... 'Tag','text7'); h19 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''MatrixEdit_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[79.8 36.2307692307692 22.4 1.69230769230769],... 'String','myMatrix',... 'Style','edit',... 'CreateFcn','mani(''MatrixEdit_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','MatrixEdit'); h20 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''FileEdit_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[79.8 33.3846153846154 22.4 2],... 'String','myfile.txt',... 'Style','edit',... 'CreateFcn','mani(''FileEdit_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','FileEdit'); h21 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''LoadMatrix_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[104.8 35.9230769230769 21.6 2.15384615384615],... 'String','Load Matrix',... 'Tag','LoadMatrix'); h22 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''LoadFile_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[104.8 33.1538461538462 21.8 2.23076923076923],... 'String','Load File',... 'Tag','LoadFile'); h23 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''ExampleButton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[104.8 27.1538461538462 21.8 2.38461538461538],... 'String','Load Example',... 'Tag','ExampleButton'); h24 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''ExampleMenu_Callback'',gcbo,[],guidata(gcbo))',... 'ListboxTop',0,... 'Position',[79.8 27.5384615384615 24 1.53846153846154],... 'String',{ 'Swiss Roll' 'Swiss Hole' 'Corner Planes' 'Punctured Sphere' 'Twin Peaks' '3D Clusters' 'Toroidal Helix' 'Gaussian' 'Occluded Disks' },... 'Style','popupmenu',... 'Value',1,... 'CreateFcn','mani(''ExampleMenu_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','ExampleMenu'); h25 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0.501960784313725 0],... 'ListboxTop',0,... 'Position',[62.8 13.1538461538462 66 10.1538461538462],... 'String',{ '' },... 'Style','frame',... 'Tag','frame2'); h26 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0.501960784313725 0],... 'FontSize',14,... 'ForegroundColor',[1 1 1],... 'ListboxTop',0,... 'Position',[65 20.6153846153846 23.4 2],... 'String','Parameters',... 'Style','text',... 'Tag','text8'); h27 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0.501960784313725 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'HorizontalAlignment','right',... 'ListboxTop',0,... 'Position',[68 18.5384615384615 31.8 1.69230769230769],... 'String','Target Dimension d =',... 'Style','text',... 'Tag','text9'); h28 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0.501960784313725 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'HorizontalAlignment','right',... 'ListboxTop',0,... 'Position',[65 16.3076923076923 34.8 1.53846153846154],... 'String','Nearest Neighbors K =',... 'Style','text',... 'Tag','text10'); h29 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''DimEdit_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[101 18.7692307692308 19 1.61538461538462],... 'String','2',... 'Style','edit',... 'CreateFcn','mani(''DimEdit_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','DimEdit'); h30 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''KEdit_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[101 16.3846153846154 19 1.61538461538462],... 'String','8',... 'Style','edit',... 'CreateFcn','mani(''KEdit_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','KEdit'); h31 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0.501960784313725 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'HorizontalAlignment','right',... 'ListboxTop',0,... 'Position',[64 14 13.2 1.61538461538462],... 'String','Sigma =',... 'Style','text',... 'Tag','text12'); h32 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0 0.627450980392157],... 'ListboxTop',0,... 'Position',[63.2 1.07692307692308 65.8 11.6153846153846],... 'String',{ '' },... 'Style','frame',... 'Tag','frame3'); h33 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0 0.627450980392157],... 'FontSize',14,... 'ForegroundColor',[1 1 1],... 'ListboxTop',0,... 'Position',[66 9.84615384615385 22.8 2],... 'String','Algorithms',... 'Style','text',... 'Tag','text13'); h34 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''PCAButton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[86.4 7.23076923076923 20.2 2.15384615384615],... 'String','PCA',... 'Tag','PCAButton'); h35 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''LLEButton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[65 4.46153846153846 20.2 2.15384615384615],... 'String','LLE',... 'Tag','LLEButton'); h36 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''MDSButton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[65 7.23076923076923 20.2 2.15384615384615],... 'String','MDS',... 'Tag','MDSButton'); h37 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''LaplacianButton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[107.6 4.46153846153846 20.2 2.15384615384615],... 'String','Laplacian',... 'Tag','LaplacianButton'); h38 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''ISOMAPButton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[107.6 7.23076923076923 20.2 2.15384615384615],... 'String','ISOMAP',... 'Tag','ISOMAPButton'); h39 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''HessianButton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[86.4 4.46153846153846 20.2 2.15384615384615],... 'String','Hessian LLE',... 'Tag','HessianButton'); h40 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'ListboxTop',0,... 'Position',[80 30.6153846153846 20.2 1.69230769230769],... 'String','Color Vector:',... 'Style','text',... 'Tag','text17'); h41 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''ColorEdit_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[100 30.8461538461538 26 1.61538461538462],... 'String','colorVector',... 'Style','edit',... 'CreateFcn','mani(''ColorEdit_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','ColorEdit'); h42 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0 0],... 'Callback','mani(''ColorCheck_Callback'',gcbo,[],guidata(gcbo))',... 'ListboxTop',0,... 'Position',[77 30.9230769230769 4 1.38461538461538],... 'String','',... 'Style','checkbox',... 'Tag','ColorCheck'); h43 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'HorizontalAlignment','right',... 'ListboxTop',0,... 'Position',[63.6 24.9230769230769 18.8 1.53846153846154],... 'String','# Points =',... 'Style','text',... 'Tag','text18'); h44 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0.501960784313725 0.501960784313725],... 'Callback','mani(''RunAllButton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[107.8 1.76923076923077 20 2.15384615384615],... 'String','Run All 8',... 'Tag','RunAllButton'); h45 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 0 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'HorizontalAlignment','right',... 'ListboxTop',0,... 'Position',[95.8 25 18.4 1.53846153846154],... 'String','Height =',... 'Style','text',... 'Tag','text19'); h46 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''PointsEdit_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[83.2 25 11.6 1.69230769230769],... 'String','800',... 'Style','edit',... 'CreateFcn','mani(''PointsEdit_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','PointsEdit'); h47 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''ParamEdit_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[115 25 11.6 1.69230769230769],... 'String','1.0',... 'Style','edit',... 'CreateFcn','mani(''ParamEdit_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','ParamEdit'); h48 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0 0],... 'ListboxTop',0,... 'Position',[2.6 1.07692307692308 57.4 4.30769230769231],... 'String',{ '' },... 'Style','frame',... 'Tag','frame5'); h49 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0 0],... 'FontSize',10,... 'ForegroundColor',[1 1 0.501960784313725],... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[3.8 1.38461538461538 54.2 3.69230769230769],... 'String','Updates',... 'Style','text',... 'Tag','UpdatesText'); h50 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[0 0.501960784313725 0],... 'FontSize',12,... 'ForegroundColor',[1 1 1],... 'HorizontalAlignment','right',... 'ListboxTop',0,... 'Position',[97.2 13.9230769230769 12 1.69230769230769],... 'String','Alpha =',... 'Style','text',... 'Tag','text21'); h51 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''DiffKernelButton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[65.2 1.76923076923077 20.2 2.15384615384615],... 'String','Diffusion Map',... 'Tag','DiffKernelButton'); h52 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''SigmaEdit_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[78 14 17.2 1.76923076923077],... 'String','10.0',... 'Style','edit',... 'CreateFcn','mani(''SigmaEdit_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','SigmaEdit'); h53 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'BackgroundColor',[1 1 1],... 'Callback','mani(''AlphaEdit_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'HorizontalAlignment','left',... 'ListboxTop',0,... 'Position',[109.8 14 17.2 1.76923076923077],... 'String','1.0',... 'Style','edit',... 'CreateFcn','mani(''AlphaEdit_CreateFcn'',gcbo,[],guidata(gcbo))',... 'Tag','AlphaEdit'); h54 = uicontrol(... 'Parent',h1,... 'Units','characters',... 'Callback','mani(''LTSAbutton_Callback'',gcbo,[],guidata(gcbo))',... 'FontSize',12,... 'ListboxTop',0,... 'Position',[86.6 1.76923076923077 20.2 2.15384615384615],... 'String','LTSA',... 'Tag','LTSAbutton'); hsingleton = h1; % --- Handles default GUIDE GUI creation and callback dispatch function varargout = gui_mainfcn(gui_State, varargin) % GUI_MAINFCN provides these command line APIs for dealing with GUIs % % mani, by itself, creates a new mani or raises the existing % singleton*. % % H = mani returns the handle to a new mani or the handle to % the existing singleton*. % % mani('CALLBACK',hObject,eventData,handles,...) calls the local % function named CALLBACK in mani.M with the given input arguments. % % mani('Property','Value',...) creates a new mani or raises the % existing singleton*. Starting from the left, property value pairs are % applied to the GUI before untitled_OpeningFunction gets called. An % unrecognized property name or invalid value makes property application % stop. All inputs are passed to untitled_OpeningFcn via varargin. % % *See GUI Options on GUIDE's Tools menu. Choose "GUI allows only one % instance to run (singleton)". % Copyright 1984-2002 The MathWorks, Inc. % $Revision: 1.4 $ $Date: 2002/05/31 21:44:31 $ gui_StateFields = {'gui_Name' 'gui_Singleton' 'gui_OpeningFcn' 'gui_OutputFcn' 'gui_LayoutFcn' 'gui_Callback'}; gui_Mfile = ''; for i=1:length(gui_StateFields) if ~isfield(gui_State, gui_StateFields{i}) error('Could not find field %s in the gui_State struct in GUI M-file %s', gui_StateFields{i}, gui_Mfile); elseif isequal(gui_StateFields{i}, 'gui_Name') gui_Mfile = [getfield(gui_State, gui_StateFields{i}), '.m']; end end numargin = length(varargin); if numargin == 0 % mani % create the GUI gui_Create = 1; elseif numargin > 3 & ischar(varargin{1}) & ishandle(varargin{2}) % mani('CALLBACK',hObject,eventData,handles,...) gui_Create = 0; else % mani(...) % create the GUI and hand varargin to the openingfcn gui_Create = 1; end if gui_Create == 0 varargin{1} = gui_State.gui_Callback; if nargout [varargout{1:nargout}] = feval(varargin{:}); else feval(varargin{:}); end else if gui_State.gui_Singleton gui_SingletonOpt = 'reuse'; else gui_SingletonOpt = 'new'; end % Open fig file with stored settings. Note: This executes all component % specific CreateFunctions with an empty HANDLES structure. % Do feval on layout code in m-file if it exists if ~isempty(gui_State.gui_LayoutFcn) gui_hFigure = feval(gui_State.gui_LayoutFcn, gui_SingletonOpt); else gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt); % If the figure has InGUIInitialization it was not completely created % on the last pass. Delete this handle and try again. if isappdata(gui_hFigure, 'InGUIInitialization') delete(gui_hFigure); gui_hFigure = local_openfig(gui_State.gui_Name, gui_SingletonOpt); end end % Set flag to indicate starting GUI initialization setappdata(gui_hFigure,'InGUIInitialization',1); % Fetch GUIDE Application options gui_Options = getappdata(gui_hFigure,'GUIDEOptions'); if ~isappdata(gui_hFigure,'GUIOnScreen') % Adjust background color if gui_Options.syscolorfig set(gui_hFigure,'Color', get(0,'DefaultUicontrolBackgroundColor')); end % Generate HANDLES structure and store with GUIDATA guidata(gui_hFigure, guihandles(gui_hFigure)); end % If user specified 'Visible','off' in p/v pairs, don't make the figure % visible. gui_MakeVisible = 1; for ind=1:2:length(varargin) if length(varargin) == ind break; end len1 = min(length('visible'),length(varargin{ind})); len2 = min(length('off'),length(varargin{ind+1})); if ischar(varargin{ind}) & ischar(varargin{ind+1}) & ... strncmpi(varargin{ind},'visible',len1) & len2 > 1 if strncmpi(varargin{ind+1},'off',len2) gui_MakeVisible = 0; elseif strncmpi(varargin{ind+1},'on',len2) gui_MakeVisible = 1; end end end % Check for figure param value pairs for index=1:2:length(varargin) if length(varargin) == index break; end try, set(gui_hFigure, varargin{index}, varargin{index+1}), catch, break, end end % If handle visibility is set to 'callback', turn it on until finished % with OpeningFcn gui_HandleVisibility = get(gui_hFigure,'HandleVisibility'); if strcmp(gui_HandleVisibility, 'callback') set(gui_hFigure,'HandleVisibility', 'on'); end feval(gui_State.gui_OpeningFcn, gui_hFigure, [], guidata(gui_hFigure), varargin{:}); if ishandle(gui_hFigure) % Update handle visibility set(gui_hFigure,'HandleVisibility', gui_HandleVisibility); % Make figure visible if gui_MakeVisible set(gui_hFigure, 'Visible', 'on') if gui_Options.singleton setappdata(gui_hFigure,'GUIOnScreen', 1); end end % Done with GUI initialization rmappdata(gui_hFigure,'InGUIInitialization'); end % If handle visibility is set to 'callback', turn it on until finished with % OutputFcn if ishandle(gui_hFigure) gui_HandleVisibility = get(gui_hFigure,'HandleVisibility'); if strcmp(gui_HandleVisibility, 'callback') set(gui_hFigure,'HandleVisibility', 'on'); end gui_Handles = guidata(gui_hFigure); else gui_Handles = []; end if nargout [varargout{1:nargout}] = feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles); else feval(gui_State.gui_OutputFcn, gui_hFigure, [], gui_Handles); end if ishandle(gui_hFigure) set(gui_hFigure,'HandleVisibility', gui_HandleVisibility); end end function gui_hFigure = local_openfig(name, singleton) if nargin('openfig') == 3 gui_hFigure = openfig(name, singleton, 'auto'); else % OPENFIG did not accept 3rd input argument until R13, % toggle default figure visible to prevent the figure % from showing up too soon. gui_OldDefaultVisible = get(0,'defaultFigureVisible'); set(0,'defaultFigureVisible','off'); gui_hFigure = openfig(name, singleton); set(0,'defaultFigureVisible',gui_OldDefaultVisible); end