icassocluster.m

来自「一个经典的ICA算法的程序包」· M 代码 · 共 240 行

M
240
字号
function sR=icassoCluster(sR,varargin)%function sR=icassoCluster(sR,['identifier1',value1,'identifier2',value2,...])%%PURPOSE %%To cluster the ICA estimates and to compute a relative clustering validity%index (R-index)%%EXAMPLE OF BASIC USAGE%% sR=icassoCluster(sR); % %where sR is an Icasso result structure. This applies hierarchical%clustering using group-average linkage agglomeration strategy and%stores the results back into workspace variable sR.%%INPUT %% sR (struct) Icasso result data structure%%Optional input arguments are given as argument identifier - value%pairs: 'identifier1', value1, 'identifier2', value2,... %(case insensitive)%% 'simfcn' (string) 'abscorr' (default) | (matrix) %   Indicates how to compute similarities S between estimates i,j%   'abscorr' S(i,j) is the absolute value of the linear%     correlation coefficient  %   (matrix) explicitly given similarity matrix S%     (elements should be 0...1)  % 'strategy' (string) 'AL' (default) | 'SL' | 'CL' %  Sets the clustering strategy: %  'AL' hierarchical group average linkage%  'SL' hierarchical single linkage (nearest neighbor)%  'CL' hierarchical complete linkage (furthest neighbor)% 'L' (integer) | (string) 'rdim' (default) %   computes a relative clustering validity index for 2...L%   clusters. Default string 'rdim' sets L same as the (reduced)%   data dimension  %'s2d' (string) (default is 'sim2dis') %  the name of function that is used to make the transformation%  from similarities between IC components to dissimilarities%  D. Default 'sim2dis' makes simply D=1-S;    %%OUTPUT%% sR (struct) updated Icasso result data structure %%The function updates the fields sR.cluster.* only.%%DETAILS%1. The function computes similarities between the%estimates. See Note 1 %2. stores the similarity matrix S into field sR.cluster.similarity%and the method into field sR.cluster.simfcn%2. transforms the similarities into dissimilarities (distances)%D. See Note 2. %3. applies the selected clustering strategy on dissimilarities. D%The results is a partition matrix P (of size MxM). See explanation%in function hcluster The function stores P in field%sR.cluster.partition (Stores also other outputs of function%hcluster into sR.cluster.dendrogram). %4. computes a relative clustering validity index (see function%rindex) for dissimilarities D and partitions P from 2 to L%clusters. If not explicitly given (or string 'rdim' is given, L%will be the (reduced data) dimension. Stores the result in field%sR.cluster.index.R.          %%NOTE 1%%By default, the similarities between estimates are computed as%linear correlation coefficients (using the demixing matrix rows and%dewhitening matrix; see function corrw). You can also explicitly%give any MxM similarity matrix as input. The similarities%should be between 0...1. (M is the total number of estimates.)%%NOTE 2%The clustering and clustering validity indices are computed for%dissimilarities. Therefore, the similarities must be transformed%into dissimilarities. By default, icassoCluster uses subfunction%sim2dis to do this; sim2dis performs simply D=1-S. If you wish to%make the transformation otherwise, you can set a different%function by using input identifier - valuepair%'s2d','myfunctionname'. icassoCluster then computes%dissimilarities by calling %   D=feval('myfunctionname',sR.cluster.similarity);  %A possible function is sqrtsim2dis %%SEE ALSO% hcluster% som_linkage% sqrtsim2dis% rindex% icassoDendrogram%COPYRIGHT NOTICE%This function is a part of Icasso software library%Copyright (C) 2003-2005 Johan Himberg%%This program is free software; you can redistribute it and/or%modify it under the terms of the GNU General Public License%as published by the Free Software Foundation; either version 2%of the License, or any later version.%%This program is distributed in the hope that it will be useful,%but WITHOUT ANY WARRANTY; without even the implied warranty of%MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the%GNU General Public License for more details.%%You should have received a copy of the GNU General Public License%along with this program; if not, write to the Free Software%Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.% ver 1.21 070305 johan% Init some variables% total number of estimatesM=icassoGet(sR,'M');%reduced data dimensionrdim=icassoGet(sR,'rdim');% Set default parametersdefault={'simfcn','abscorr','s2d','sim2dis','strategy','AL','L','rdim'};%% Check optional arguments and add defaultsclusterparameters=processvarargin(varargin,default);num_of_args=length(clusterparameters);%% check argumentsfor i=1:2:num_of_args;  switch lower(clusterparameters{i})       case 'simfcn'    simfcn=clusterparameters{i+1};        % Explicit similarity matrix?    if isnumeric(simfcn),      if size(simfcn,1)==M & size(simfcn,2)==M,        sR.cluster.similarity=simfcn;        sR.cluster.simfcn='<similarities given explicitly>';      else         error('Explicitly given similarity matrix has wrong size!');      end    else      % should be a string      switch lower(simfcn)       case 'abscorr'        ; % ok        sR.cluster.simfcn=lower(simfcn);       otherwise        error('''simfcn'' must be string ''abscorr'' or an MxM similarity matrix');      end    end   case 's2d'    s2dfcn=lower(clusterparameters{i+1});    if ~ischar(s2dfcn),      error('''s2d'' must be a string (name of a function)');    end    sR.cluster.s2d=s2dfcn;   case 'l'    L=clusterparameters{i+1};    if isnumeric(L),      % The user has specified max number for clusters            % Check L       if fix(L)~=L,        error('''L'' must be an integer.');      elseif L<2,        error('''L'' must be at least 2.');      elseif L>M,        error('''L'' cannot be more than the number of estimates.');      end    else      if ~strcmp(lower(L),'rdim'),        error('''L'' expects an integer value or ''rdim''.');      end      % set (reduced) data dimension      L=icassoGet(sR,'rdim');    end        if L>100,      warning(['R-index requested for more that 100 clusters: this can' ...               ' be heavy...']);    end       case 'strategy'    strategy=clusterparameters{i+1};    if ~ischar(strategy),      error('''strategy'' must be a string');    end        % we are case insensitive    strategy=upper(strategy);    sR.cluster.strategy=strategy;        switch sR.cluster.strategy     case {'AL','CL','SL'}      ; % hierarchical clustering     otherwise      error(['Strategy ' strategy ' not implemented.']);    end   otherwise    error(['Indentifier ' clusterparameters{i} ' not recognized.']);  endend%%%% Compute similarities %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%switch lower(sR.cluster.simfcn) case '<similarities given explicitly>'  ; % already handled case 'abscorr'  sR.cluster.similarity=abs(corrw(icassoGet(sR,'W'),icassoGet(sR,'dewhitemat')));  %just to make sure    sR.cluster.similarity(sR.cluster.similarity>1)=1;   sR.cluster.similarity(sR.cluster.similarity<0)=0;end%%%%% Convert to dissimilarities using .s2dD=feval(sR.cluster.s2d, sR.cluster.similarity);%%%% Make partition %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[sR.cluster.partition,sR.cluster.dendrogram.Z,sR.cluster.dendrogram.order]=...    hcluster(D,sR.cluster.strategy);%%%%% Compute cluster validity %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% init RsR.cluster.index.R=ones(M,1)*NaN;% computesR.cluster.index.R(1:L,1)=rindex(D,sR.cluster.partition(1:L,:));    

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?