Mercurial > hg > camir-aes2014
diff toolboxes/MIRtoolbox1.3.2/somtoolbox/som_autolabel.m @ 0:e9a9cd732c1e tip
first hg version after svn
author | wolffd |
---|---|
date | Tue, 10 Feb 2015 15:05:51 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/toolboxes/MIRtoolbox1.3.2/somtoolbox/som_autolabel.m Tue Feb 10 15:05:51 2015 +0000 @@ -0,0 +1,237 @@ +function [sTo] = som_autolabel(sTo, sFrom, mode, inds) + +%SOM_AUTOLABEL Automatical labeling, or clearing of labels. +% +% sTo = som_autolabel(sTo, sFrom, [mode], [inds]) +% +% sM = som_autolabel(sM,sD); +% sD = som_autolabel(sD,sM); +% sM = som_autolabel(sM,sD,'vote',[5]); +% +% Input and output arguments ([]'s are optional): +% sTo (struct) data or map struct to which the labels are put, +% the modified struct is returned +% sFrom (struct) data or map struct from which the labels are taken +% [mode] (string) labeling algorithm: 'add' (the default), 'freq' +% or 'vote' +% [inds] (vector) the column-indexes of the labels that are to be +% used in the operation (e.g. [2] would mean to use +% only the second column of labels array in sFrom) +% +% The modes: +% 'add': all labels from sFrom are added to sTo (even multiple +% copies of same) +% 'add1': only one instance of each label is kept +% 'freq': only one instance of each label is kept and '(#)', where +% # is the frequency of the label, is added to the end of +% the label. Labels are ordered according to frequency. +% 'vote': only the label with most instances is kept +% +% NOTE: The operations are only performed for the new labels. +% The old labels in sTo are left as they are. +% NOTE: all empty labels ('') are ignored. +% +% For more help, try 'type som_autolabel' or check out online documentation. +% See also SOM_LABEL, SOM_BMUS, SOM_SHOW_ADD, SOM_SHOW. + +%%%%%%%%%%%%% DETAILED DESCRIPTION %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% som_autolabel +% +% PURPOSE +% +% Automatically label to map/data structs based on given data/map. +% +% SYNTAX +% +% sTo = som_autolabel(sTo, sFrom) +% sTo = som_autolabel(sTo, sFrom, 'add') +% sTo = som_autolabel(sTo, sFrom, 'freq') +% sTo = som_autolabel(sTo, sFrom, 'vote') +% sTo = som_autolabel(..., inds) +% +% DESCRIPTION +% +% This function automatically labels given map/data struct based on an +% already labelled data/map struct. Basically, the BMU of each vector in the +% sFrom struct is found from among the vectors in sTo, and the vectors in +% sFrom are added to the corresponding vector in the sTo struct. The actual +% labels to add are selected based on the mode ('add', 'freq' or 'vote'). +% +% 'add' : all labels from sFrom are added to sTo - even if there would +% be multiple instances of the same label +% 'add1' : only one instance of each label is kept +% 'freq' : only one instance of each label is kept and '(#)', where +% # is the frequency of the label, is added to the end of +% the label. Labels are ordered according to frequency. +% 'vote' : only the label with most instances is added +% +% Note that these operations do not effect the old labels of sTo: they +% are left as they were. +% +% NOTE: empty labels ('') are ignored. +% +% REQUIRED INPUT ARGUMENTS +% +% sTo (struct) data or map struct to which the labels are put +% sFrom (struct) data or map struct from which the labels are taken +% +% OPTIONAL INPUT ARGUMENTS +% +% mode (string) The mode of operation: 'add' (default), +% 'add1', 'freq' or 'vote' +% inds (vector) The columns of the '.labels' field in sFrom to be +% used in operation +% +% OUTPUT ARGUMENTS +% +% sTo (struct) the given data/map struct with modified labels +% +% EXAMPLES +% +% To label a trained map based on (labelled) training data, just do +% +% sM = som_autolabel(sM,sD); +% +% This operation is sometimes called "calibration" in the literature. +% You can also do this the other way around: use a labelled map to +% label a data set: +% +% sD = som_autolabel(sD,sM); +% +% If you only want a single instance of each label, use the 'freq' mode: +% +% sM = som_autolabel(sM,sD,'freq'); +% +% If you already have labels in the struct, and want to perform 'freq' on +% them, do the following: +% +% sMtemp = som_label(sM,'clear','all'); % make a map struct with no labels +% sM = som_autolabel(sMtemp,sM,'freq'); % add labels to it +% +% The third mode 'vote' votes between the labels and only adds the one +% which is most frequent. If two labels are equally frequent, one or the +% other is chosen based on which appears first in the list. +% +% sM = som_autolabel(sM,sD,'vote'); +% +% The lat argument is useful if you have specific labels in each column +% of the '.labels' field. For example, the first column might be an +% identifier, the next a typecode and the last a year. In this case, you +% might want to label the map based only on the typecode: +% +% sM = som_autolabel(sM,sD,'vote',2); +% +% SEE ALSO +% +% som_label Give/remove labels from a map/data set. +% som_bmus Find BMUs from the map for the given set of data vectors. +% som_show Show map planes. +% som_show_add Add for example labels to the SOM_SHOW visualization. + +% Copyright (c) 1997-2000 by the SOM toolbox programming team. +% http://www.cis.hut.fi/projects/somtoolbox/ + +% Version 1.0beta juuso 101297 +% Version 2.0beta juuso 101199 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% check arguments + +error(nargchk(2, 4, nargin)); % check no. of input args is correct + +% sTo +todata = strcmp(sTo.type,'som_data'); + +% sFrom +[dummy m] = size(sFrom.labels); + +% mode +if nargin<3 | isempty(mode), mode = 'add'; end + +% inds +if nargin<4, inds = 1:m; end +inds = inds(find(inds>0 & inds<=m)); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% get a list of the labels to be added to each vector + +% calculate BMUs +if todata, bmus = som_bmus(sFrom,sTo,1); +else bmus = som_bmus(sTo,sFrom,1); end + +% for each vector in sTo, make a list of all new labels +Labels = cell(size(sTo.labels,1),1); +for d=1:length(bmus), + m = bmus(d); + if todata, t = d; f = m; else t = m; f = d; end + if ~isnan(m), + % add the labels + for j=1:length(inds), + if ~isempty(sFrom.labels{f,inds(j)}), + Labels{t}{length(Labels{t})+1} = sFrom.labels{f,inds(j)}; + end + end + end +end + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +%% insert the labels to sTo + + +if strcmp(mode,'add1') | strcmp(mode,'freq') | strcmp(mode,'vote'), + + % modify the Labels array apprpriately + + for i=1:length(Labels), + + % calculate frequency of each label in each node + new_labels = {}; + new_freq = []; + for j=1:length(Labels{i}), + if isempty(Labels{i}{j}), % ignore + elseif ~any(strcmp(Labels{i}{j},new_labels)), % a new one! + k = length(new_labels) + 1; + new_labels{k} = Labels{i}{j}; + new_freq(k) = sum(strcmp(new_labels{k},Labels{i})); + else, % an old one, ignore + end + end + + % based on frequency, select label(s) to be added + if length(new_labels) > 0, + if strcmp(mode,'add1'), + Labels{i} = new_labels; + else + + % sort labels according to frequency + [dummy order] = sort(1./(1+new_freq)); + new_labels = new_labels(order); + new_freq = new_freq(order); + + switch mode, + case 'freq', + % replace each label with 'label(#)' where # is the frequency + for j=1:length(new_labels), + labf = sprintf('%s(%d)',new_labels{j},new_freq(j)); + new_labels{j} = labf; + end + Labels{i} = new_labels; + case 'vote', + % place only the one with most votes + Labels{i} = {new_labels{1}}; + end + end + end + + end + +end + +sTo = som_label(sTo,'add',[1:length(Labels)]',Labels); + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + + + +