findcluster.m

Package [view]: fuzzy.rar
Upload User: hnchenxi
Upload Date: 2008-11-02
Package Size: 1083k
Code Size: 18k
Category: AI-NN-PR
Development Platform: Matlab
  1. function findcluster(action);
  2. % FINDCLUSTER  Cluster interface.
  3. %   FINDCLUSTER lets you use two clustering algorithms interactively.
  4. %   It contains subtractive clustering and fuzzy c-means clustering.
  5. %   FINDCLUSTER is a GUI tool which implements fcm and subcluster
  6. %   along with all of their options on a user interface. Data is entered using 
  7. %   the Load Data button, and Save will save the cluster center.
  8. %   This tool works on multi-dimensional data sets, but only displays on two
  9. %   dimensions. Use the pulldown tabs under X-axis and Y-axis to select which 
  10. %   data dimension you want to view.                              
  11. %
  12. %    See also SUBCLUST, FCM.
  13. %   Kelly Liu, Feb. 97
  14. %   Copyright 1994-2002 The MathWorks, Inc. 
  15. %   $Revision: 1.15 $  $Date: 2002/04/02 21:25:15 $
  16. filename='';
  17. if nargin<1,
  18.     action='initialize';
  19. else
  20.    if ~strcmp(action(1), '#') 
  21.     filename=action;
  22.     action='initialize';
  23.    else
  24.     action=action(2:end);
  25.    end;
  26. end;
  27. switch action
  28.  case 'initialize',
  29.     figNumber=figure( ...
  30.          'Name','Clustering', ...
  31.          'NumberTitle','off');          %, ...
  32. %         'HandleVisibility','callback');
  33.    axHndl=axes( ...
  34.         'Units','normalized', ...
  35.         'Position',[0.10 0.25 0.65 0.7],...
  36.         'Tag', 'mainaxes');
  37.    set(get(axHndl, 'Xlabel'), 'String', 'X');
  38.    set(get(axHndl, 'Ylabel'), 'String', 'Y');
  39. %    rotate3d on;
  40.     %===================================    
  41.     right=0.75;
  42.     bottom=0.05;
  43.     labelHt=0.03;
  44.     spacing=0.005;
  45.     frmBorder=0.012;
  46.    %====================================
  47.     % Information for all buttons    
  48.     left=0.80;
  49.     btnWid=0.15;
  50.     top=.5;
  51.     %=========The Panel frame============
  52.     frmBorder=0.02;
  53.     yPos=0.05-frmBorder;
  54.     frmPos=[left-frmBorder yPos btnWid+2*frmBorder 0.9+2*frmBorder];
  55.     frmHandle=LocalBuildFrmTxt(frmPos, '', 'frame', '');
  56.     %=========The Slide frame=============
  57.     frmBorder=0.02;
  58.     btnHt=0.05;
  59.     yPos=top+.4;
  60.  
  61.     %=========The display dimesion============
  62.      btnPos=[.11 .095 .1 .05];
  63.      dimsHndl=LocalBuildUi(btnPos, 'text', '',...
  64.                            'X-axis', 'dimXLabel');
  65.      set(dimsHndl, 'BackGroundColor', [.8 .8 .8]);
  66.      btnPos=[.46 .095 .1 .05];
  67.      dimsHndl=LocalBuildUi(btnPos, 'text','',...
  68.                            'Y-axis', 'dimYLabel');
  69.      set(dimsHndl, 'BackGroundColor', [.8 .8 .8]);
  70. %     btnPos=[.5 .14 .1 .05];
  71. %     dimsHndl=LocalBuildUi(btnPos, 'text', '',...
  72. %                           'Z axes', 'dimZLabel');
  73. %     set(dimsHndl, 'BackGroundColor', [.7 .7 .7]);
  74.     
  75.      btnPos=[.2 .1 .15 .05];
  76.      dimsHndl=LocalBuildUi(btnPos, 'popupmenu', 'findcluster #dispdim', 'data_1', 'dimX');
  77.      btnPos=[.55 .1 .15 .05];
  78.      dimsHndl=LocalBuildUi(btnPos, 'popupmenu', 'findcluster #dispdim', 'data_1', 'dimY');
  79. %     btnPos=[.6 .14 .1 .05];
  80. %     dimsHndl=LocalBuildUi(btnPos, 'popup', 'findcluster #dispdim', 'x1', 'dimZ');
  81.      btnPos=[.1 .02 .65 .07];
  82.      dimsHndl=LocalBuildFrmTxt(btnPos, '', 'frame', '');
  83.      btnPos=[.11 .03 .63 .05];
  84.      dimsHndl=LocalBuildUi(btnPos, 'text', '', 'ready', 'status');
  85.      set(dimsHndl, 'BackgroundColor', [.8 .8 .8]);
  86.     %======The start button=============
  87.     delHndl=LocalBuildBtns( 'Pushbutton', 10,'Start', 'findcluster #start', 'start');
  88.     set(delHndl, 'Enable', 'off');
  89.     
  90.     %=======The Open button==============
  91.     addHndl=LocalBuildBtns( 'Pushbutton', 1, 'Load Data...', 'findcluster #open', 'open');
  92.     
  93.     %======The Method=============
  94.     btnPos=[left yPos-.05 btnWid btnHt];
  95.     dimDHndl=LocalBuildBtns('text', 2, 'Methods', '', 'methodlabel');
  96.     set(dimDHndl, 'BackgroundColor', [.5 .5 .5]);
  97.     delHndl=LocalBuildBtns( 'PopupMenu', 2.5, {'subtractiv', 'fcm'}, 'findcluster #method', 'method');
  98.     %=======The # of cluster/influence==============
  99.        
  100.     dimDHndl=LocalBuildBtns('text', 3.5, 'Cluster Num.', '', 'clstrNumlabel');
  101.     dimDHndl=LocalBuildBtns('text', 3.5, 'Influence Range', '', 'sbtrparam');
  102.    
  103.     addHndl=LocalBuildBtns( 'edit', 4., '2', 'findcluster #setclstrnum', 'setclstrnum');
  104.     saveHndl=LocalBuildBtns( 'edit', 4., '.5', 'findcluster #setparam', 'influence');
  105.     %=======The param button==============
  106.     dimDHndl=LocalBuildBtns('text', 5, 'Max Iteration#', '', 'clstrNumlabel');
  107.     dimDHndl=LocalBuildBtns('text', 5, 'Squash', '', 'sbtrparam');
  108.     saveHndl=LocalBuildBtns( 'edit', 5.5, '100', 'findcluster #setparam', 'maxitera');
  109.     saveHndl=LocalBuildBtns( 'edit', 5.5, '1.25', 'findcluster #setparam', 'squash');
  110.     dimDHndl=LocalBuildBtns('text', 6.5, 'Min. Improvement', '', 'clstrNumlabel');
  111.     dimDHndl=LocalBuildBtns('text', 6.5, 'Accept Ratio', '', 'sbtrparam');
  112.     saveHndl=LocalBuildBtns( 'edit', 7, '1e-5', 'findcluster #setparam', 'minimprove');
  113.     saveHndl=LocalBuildBtns( 'edit', 7, '.5', 'findcluster #setparam', 'accept');
  114.     dimDHndl=LocalBuildBtns('text', 8, 'Exponent', '', 'clstrNumlabel');
  115.     dimDHndl=LocalBuildBtns('text', 8, 'Reject Ratio', '', 'sbtrparam');
  116.     saveHndl=LocalBuildBtns( 'edit', 8.5, '2.0', 'findcluster #setparam', 'exponent');
  117.     saveHndl=LocalBuildBtns( 'edit', 8.5, '.15', 'findcluster #setparam', 'reject');
  118.     %=======The Save button==============
  119.     saveHndl=LocalBuildBtns( 'Pushbutton', 11, 'Save Center...', 'findcluster #save', 'save');
  120.     set(saveHndl, 'Enable', 'off');
  121.     %=======The clear button==============
  122.     Hndl=LocalBuildBtns( 'Pushbutton', 12, 'Clear Plot', 'cla', 'cla');
  123.         
  124.     %=======The Info button==============
  125.     infoHndl=LocalBuildBtns( 'Pushbutton', 0, 'Info', 'findcluster #info', 'info');
  126.     %=======The Close button=============
  127.     closeHndl=LocalBuildBtns( 'Pushbutton', 0, 'Close', 'close(gcf)', 'close');
  128.     TextHndl=uicontrol('Style', 'text', 'Unit', 'normal',...
  129.                       'Visible', 'off',...
  130.                       'Position', [0 0 .1 .020], 'Tag', 'strcparam');
  131.     % Now uncover the figure
  132.     param.dataDim=1;
  133.     param.dispList=[];
  134.     param.data=[];
  135.     param.center=[];
  136.     param.centerplotH=[];
  137.     param.inputparam={'.5', '1.25', '.5', '.15'};
  138.     LocalButtonControl;
  139.     set(figNumber, 'Userdata', param);
  140.     set(figNumber,'Visible','on');
  141.     if ~isempty(filename)
  142.        localloadfile(filename, param);
  143.     end
  144. %========display dimesions
  145. case 'dispdim',
  146.    cla
  147.    dimHndl=findobj(gcf, 'Type', 'uicontrol', 'Tag', 'dimX');
  148.    x=get(dimHndl, 'Value');
  149.    dimHndl=findobj(gcf, 'Type', 'uicontrol', 'Tag', 'dimY');
  150.    y=get(dimHndl, 'Value');
  151. %   dimHndl=findobj(gcf, 'Type', 'uicontrol', 'Tag', 'dimZ');
  152. %   z=get(dimHndl, 'Value');
  153.    dispList=[x, y];              %, z];
  154.    LocalPlotdata(dispList);
  155. %=======select subtractive or fcm======
  156. case 'method',
  157.    LocalButtonControl;
  158. %=======start clustering========
  159. case 'start',
  160.    param=get(gcbf, 'Userdata');
  161.    stopHndl=findobj(gcbf, 'Tag', 'start');
  162.    statusHndl=findobj(gcbf, 'Tag', 'status');
  163.    stopflag=get(stopHndl, 'String');
  164.    if strcmp(stopflag, 'Stop')
  165.      set(stopHndl, 'String', 'Start');
  166.    else
  167.      set(stopHndl, 'String', 'Stop');
  168.      medHndl=findobj(gcbf, 'Type', 'uicontrol', 'Tag', 'method');
  169.      n=get(medHndl, 'value');
  170.      %=========subtractive
  171.      if n==1
  172.       radiHndl=findobj(gcbf, 'Tag', 'influence');
  173.       squaHndl=findobj(gcbf, 'Tag', 'squash');
  174.       accpHndl=findobj(gcbf, 'Tag', 'accept');
  175.       rejeHndl=findobj(gcbf, 'Tag', 'reject');
  176.       inputparam=get(radiHndl, 'String');
  177.       radioList=str2double(inputparam);
  178.       if ~isempty(radioList)
  179.          if length(radioList) < size(param.data, 2)
  180.             radioList(end+1:size(param.data, 2))=radioList(end);
  181.          elseif length(radioList) > size(param.data, 2)
  182.             radioList(size(param.data, 2)+1, end) = [];
  183.          end
  184.       end     
  185.       squafactor=get(squaHndl, 'String');
  186.       acceptfact=get(accpHndl, 'String');
  187.       rejectfact=get(rejeHndl, 'String');
  188.       set(statusHndl, 'String', 'processing clustering...');
  189.       [center, sigmas]=subclust(param.data, radioList, [],...
  190.                                 [str2double(squafactor), str2double(acceptfact), str2double(rejectfact), 0]);
  191.       set(statusHndl, 'String', 'ready');
  192.    %=========fcm=============
  193.    else
  194.       paramHndl=findobj(gcbf, 'Tag', 'setclstrnum');
  195.       maxiHndl=findobj(gcbf, 'Tag', 'maxitera');
  196.       miniHndl=findobj(gcbf, 'Tag', 'minimprove');
  197.       expoHndl=findobj(gcbf, 'Tag', 'exponent');
  198.       options=[str2double(get(expoHndl, 'String')), str2double(get(maxiHndl, 'String')),...
  199.               str2double(get(miniHndl, 'String')), 0];
  200.       cluster_n=str2double(get(paramHndl, 'String'));
  201.       data_n = size(param.data, 1);
  202.       in_n = size(param.data, 2);
  203.       expo = options(1); % Exponent for U
  204.       max_iter = options(2); % Max. iteration
  205.       min_impro = options(3); % Min. improvement
  206.       display = options(4); % Display info or not
  207.       obj_fcn = zeros(max_iter, 1); % Array for objective function
  208.       U = initfcm(cluster_n, data_n); % Initial fuzzy partition
  209. if ~isempty(param.centerplotH)
  210. set(param.centerplotH, 'Xdata', [],...
  211.                                  'Ydata', [],...
  212.                                  'Zdata', []);      % Main loop
  213.  drawnow
  214. end
  215.       for i = 1:max_iter,
  216. [U, center, obj_fcn(i)] = stepfcm(param.data, U, cluster_n, expo);
  217.         if strcmp(get(stopHndl, 'String'), 'Start')
  218.             break;
  219.         end
  220.         set(statusHndl, 'String',...
  221.              ['Iteration count = ' num2str(i) ' obj. fcn = ' num2str(obj_fcn(i))]);
  222.         if isempty(param.centerplotH)
  223.           param.center=center;
  224.           set(gcbf, 'UserData', param);
  225.           findcluster #dispdim
  226.           param=get(gcbf, 'Userdata');
  227.         else
  228.           set(param.centerplotH, 'Xdata', center(:,param.dispList(1)),...
  229.                                  'Ydata', center(:,param.dispList(2)));         
  230. %                                 'Zdata', center(:,param.dispList(3)));
  231.           drawnow
  232.          
  233.         end
  234. % check termination condition
  235. if i > 1,
  236. if abs(obj_fcn(i) - obj_fcn(i-1)) < min_impro, break; end,
  237. end
  238.       end
  239. %============ 
  240. %%        maxU = max(U);
  241. %%        color=['c', 'g', 'b', 'r', 'm'];
  242. %%        for i = 1:cluster_n,
  243. %%            index = find(U(i, :) == maxU);
  244. %%            cluster = param.data(index', :);
  245. %%            if isempty(cluster), cluster = [nan nan]; end
  246. %            hold on
  247. %%            line('xdata', cluster(:, 1), ...
  248. %%                'ydata', cluster(:, 2),...                     % 'zdata', cluster(:, 3),...
  249. %%                'linestyle', 'none', 'color', color(mod(i, 5)+1),...
  250. %%                'marker', '*');
  251. %%        end
  252.         drawnow
  253. %=====================
  254.    end
  255.    set(stopHndl, 'String', 'Start');
  256.  
  257.    param.center=center;
  258.    if ~isempty(center)
  259.          saveHndl = findobj(gcf, 'Tag', 'save');
  260.          set(saveHndl, 'Enable', 'on');
  261.    end
  262.    set(gcbf, 'UserData', param);
  263.    findcluster #dispdim
  264.  end %if stopHndl
  265. case 'open',
  266. % open an existing file
  267.     param=get(gcbf,'UserData'); 
  268.     [fname, fpath]=uigetfile('*.dat'); 
  269.      
  270.     if isstr(fname)&isstr(fpath)
  271. %       cd(fpath(1:(length(fpath)-1)));
  272.        filename=[fpath fname];
  273.        localloadfile(filename, param);
  274.    end
  275. case 'save',
  276.     param= get(gcf, 'Userdata');
  277.     [fname, fpath]=uiputfile('*.dat', 'Save As'); 
  278.     center = param.center; 
  279.     if isstr(fname)&isstr(fpath)
  280.        save([fpath fname], 'center', '-ascii', '-double');
  281.     end
  282. case '#mousedownstr'
  283.    patchHndl=gco;
  284.    showStr=get(patchHndl, 'Tag');
  285.    showPosx = get(patchHndl, 'XData');
  286.    showPosy = get(patchHndl, 'YData');
  287.    textHndl=findobj(gcf, 'Tag', 'strcparam');
  288.    a=100;
  289.    set(textHndl,'String', 'test', 'Position', [showPosx(1) showPosy(1) .2 .080], 'Visible', 'on');
  290.    
  291. case 'info',
  292.     helpwin(mfilename)       
  293. end;    % if strcmp(action, ...
  294. % End of function makeshow
  295. %===================================
  296. function LocalButtonControl
  297.    medHndl=findobj(gcf, 'Tag', 'method');
  298.    clustnumHndl=findobj(gcf, 'Tag', 'setclstrnum');
  299.    infuHndl=findobj(gcf, 'Tag', 'influence');
  300.    squaHndl=findobj(gcf, 'Tag', 'squash');
  301.    accpHndl=findobj(gcf, 'Tag', 'accept');
  302.    rejcHndl=findobj(gcf, 'Tag', 'reject');
  303.    expoHndl=findobj(gcf, 'Tag', 'influence');
  304.    maxiHndl=findobj(gcf, 'Tag', 'squash');
  305.    miniHndl=findobj(gcf, 'Tag', 'accept');
  306.    numHndl=findobj(gcf,  'Tag', 'reject');
  307.    sbtrLabelHndl=findobj(gcf, 'Tag', 'sbtrparam');
  308.    n=get(medHndl, 'value');
  309.    
  310.    if n==1
  311.       set(sbtrLabelHndl, 'Visible', 'on');
  312.       set(infuHndl, 'Visible', 'on');
  313.       set(squaHndl, 'Visible', 'on');
  314.       set(accpHndl, 'Visible', 'on');
  315.       set(rejcHndl, 'Visible', 'on');
  316.       
  317.       set(clustnumHndl, 'Visible', 'off');
  318.    else
  319.       set(sbtrLabelHndl, 'Visible', 'off');
  320.       set(infuHndl, 'Visible', 'off');
  321.       set(squaHndl, 'Visible', 'off');
  322.       set(accpHndl, 'Visible', 'off');
  323.       set(rejcHndl, 'Visible', 'off');
  324.      
  325.       set(clustnumHndl, 'Visible', 'on');
  326.    end  
  327.    
  328.    
  329. %==================================================
  330. function uiHandle=LocalBuildUi(uiPos, uiStyle, uiCallback, promptStr, uiTag)
  331. % build editable text 
  332.     uiHandle=uicontrol( ...
  333.         'Style',uiStyle, ...
  334.         'HorizontalAlignment','left', ...
  335.         'Units','normalized', ...
  336.         'Max',20, ...
  337.         'BackgroundColor',[1 1 1], ...
  338.         'Position',uiPos, ...
  339.         'Callback',uiCallback, ... 
  340.         'Tag', uiTag, ...
  341.         'String',promptStr);
  342. %==================================================
  343. function frmHandle=LocalBuildFrmTxt(frmPos, txtStr, uiStyle, txtTag)
  344. % build frame and label
  345.       frmHandle=uicontrol( ...
  346.         'Style', uiStyle, ...
  347.         'Units','normalized', ...
  348.         'Position',frmPos, ...
  349.         'BackgroundColor',[0.50 0.50 0.50], ...
  350.         'ForegroundColor',[1 1 1], ...                  %generates an edge
  351.         'String', txtStr, ...
  352.         'Tag', txtTag);
  353. %==================================================
  354. function btHandle=LocalBuildBtns(thisstyle, btnNumber, labelStr, callbackStr, uiTag)
  355. % build buttons or check boxes so they easily aline on the right
  356. labelColor=[0.8 0.8 0.8];
  357. top=0.95;
  358. left=0.80;
  359. btnWid=0.15;
  360. btnHt=0.05;
  361. bottom=0.05;
  362. % Spacing between the button and the next command's label
  363. spacing=0.01;
  364. if strcmp(thisstyle, 'edit')
  365.   % btnHt =.05;
  366. end
  367.    
  368. yPos=top-(btnNumber-1)*(btnHt+spacing);
  369. if strcmp(labelStr, 'Close')==1
  370.    yPos= bottom;
  371. elseif strcmp(labelStr, 'Info')==1
  372.    yPos= bottom+btnHt+spacing; 
  373. else
  374.    yPos=top-(btnNumber-1)*(btnHt+spacing)-btnHt;
  375. end
  376. %button information
  377. btnPos=[left yPos btnWid btnHt];
  378. btHandle=uicontrol( ...
  379.    'Style',thisstyle, ...
  380.    'Units','normalized', ...
  381.    'Position',btnPos, ...
  382.    'String',labelStr, ...
  383.    'Tag', uiTag, ...
  384.    'Callback',callbackStr); 
  385. if strcmp(thisstyle, 'text')
  386.   set(btHandle, 'BackgroundColor', [.5 .5 .5], 'ForeGroundColor', [1 1 1]);
  387.    end
  388. function LocalPlotdata(dispList)
  389.      param=get(gcf, 'Userdata');
  390.      param.dispList = dispList;
  391.      axesHndl=findobj(gcf, 'Tag', 'mainaxes');
  392.      axes(axesHndl);
  393. %     cla     
  394.       data=param.data;
  395.       plotmarker = 'o';
  396.       plotcolor='red';
  397.  
  398.       center=param.center;
  399.       plotmarker1='.';
  400.       plotcolor1='black';
  401.       
  402.  
  403.    if param.dataDim > 1
  404.       ydim=2;
  405.    else
  406.       ydim=1;
  407.       end
  408.    
  409.       if ~isempty(data)
  410.          dataplotH = line(data(:, dispList(1)), data(:, dispList(2)),...        %data(:, dispList(3)),...
  411.             'color', plotcolor, ...
  412.             'LineStyle', 'none',...
  413.             'Marker', plotmarker,...
  414.             'clipping', 'off'); 
  415.       end
  416.       if ~isempty(center)
  417.          centerplotH = line(center(:, dispList(1)), center(:, dispList(2)),...       %center(:, dispList(3)),...
  418.             'color', plotcolor1, ...
  419.             'LineStyle', 'none', 'Marker', plotmarker1,...
  420.             'MarkerSize', 16,...
  421.             'ButtonDownFcn', 'findcluster #mousedownstr',...
  422.             'clipping', 'off', 'erase', 'none'); 
  423.          param.centerplotH=centerplotH;
  424.          set(gcbf, 'Userdata', param);
  425.       end
  426.       drawnow
  427. function localloadfile(filename, param)
  428.        load(filename);
  429.        slashindex=find(filename==filesep);
  430.        if ~isempty(slashindex)
  431.            strtindex=max(slashindex)+1;
  432.        else
  433.            strtindex=1;
  434.        end
  435.        dotIndex=find(filename=='.');
  436.        varname=filename(strtindex:dotIndex-1);
  437.        data=eval(varname);
  438.        
  439.        param.data=data;
  440.        param.dataDim = size(data, 2);
  441.        param.center=[];
  442.        if param.dataDim>1
  443.          dispList = [1 2];                                %[1 2 2];
  444.          dimHndlx=findobj(gcf, 'Tag', 'dimX');
  445.          dimHndly=findobj(gcf, 'Tag', 'dimY');
  446. %         dimHndlz=findobj(gcf, 'Tag', 'dimZ');
  447.          for i=1:param.dataDim
  448.           dispstr{i}=['data_' num2str(i)];
  449.          end
  450.          set(dimHndlx, 'String', dispstr);
  451.          set(dimHndly, 'String', dispstr);
  452. %         set(dimHndlz, 'String', dispstr);
  453. %         if param.dataDim > 2
  454. %          dispList(3)=3;
  455. %          set(dimHndlz, 'Value', 3);         
  456. %         end
  457.          set(dimHndly, 'Value', 2);
  458.        else
  459.          dispList = [1 1];                             %[1 1 1];
  460.        end
  461.        if ~isempty(data)
  462.          startHndl = findobj(gcf, 'Tag', 'start');
  463.          set(startHndl, 'Enable', 'on');
  464.        end
  465.        if isempty(param.center)
  466.          saveHndl = findobj(gcf, 'Tag', 'save');
  467.          set(saveHndl, 'Enable', 'off');
  468.        end
  469.        param.dispList = dispList;
  470.        set(gcf, 'Userdata', param);
  471.    
  472.        LocalPlotdata(dispList);