| Description of slscatter |
slscatter
PURPOSE 
SLSCATTER Compute the scatter matrix
SYNOPSIS 
function S = slscatter(X, type, varargin)
DESCRIPTION 
CROSS-REFERENCE INFORMATION 
This function calls:
- slmetric_pw SLMETRIC_PW Compute the metric between column vectors pairwisely
- slcov SLCOV Compute the covariance matrix
- slmean SLMEAN Compute the mean vector of samples
- slmeans SLMEANS Compute the mean vectors
- slpwscatter SLPWSCATTER Compute the pairwise scatter matrix
- raise_lackinput RAISE_LACKINPUT Raises an error indicating lack of input argument
- slnums2bounds SLNUMS2BOUNDS Compute the index-boundaries from section sizes
- slparseprops SLPARSEPROPS Parses input parameters
This function is called by:
- slkernelscatter SLKERNELSCATTER Compute the kernelized scatter matrix
- slkfd SLKFD Perform Kernelized Fisher Discriminant Analysis
- sldlda SLDLDA Performs Direct Linear Discriminant Analysis
- slfld SLFLD Performs Fisher Linear Discriminant Analysis
- slnlda SLNLDA Performs Nullspace-based Linear Discriminant Analysis
SUBFUNCTIONS 
- function w = get_weights_std(X, sweights, dwrule)
- function w = get_weights_pw(X, sweights, dwrule)
- function [curX, curw] = get_cur_class(X, sp, ep, opts, fhgetw)
- function w = get_class_weights(sweights, nums, sp, ep)
- function S = scatter_core_std(X, w)
- function S = scatter_core_pw(X, w)
- function w = invoke_dwrule(dwrule, dists)
SOURCE CODE 
0001 function S = slscatter(X, type, varargin)
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083 if nargin < 2
0084 raise_lackinput('slscatter', 2);
0085 end
0086
0087
0088
0089 if ndims(X) ~= 2
0090 error('sltoolbox:invaliddims', ...
0091 'The sample matrix X should be a 2D matrix');
0092 end
0093 [d, n] = size(X);
0094
0095
0096
0097 if ~ismember(type, ...
0098 {'Sw', 'Sb', 'St'})
0099 error('sltoolbox:invalidarg', ...
0100 'Invalid type of scatter matrix: %s', type);
0101 end
0102
0103
0104
0105 opts.method = 'std';
0106 opts.nums = [];
0107 opts.sweights = [];
0108 opts.dwrule = {};
0109
0110 opts = slparseprops(opts, varargin{:});
0111
0112 switch opts.method
0113 case 'std'
0114 fh_scatter_core = @scatter_core_std;
0115 fh_get_weights = @get_weights_std;
0116 case 'pw'
0117 fh_scatter_core = @scatter_core_pw;
0118 fh_get_weights = @get_weights_pw;
0119 otherwise
0120 error('sltoolbox:invalidarg', ...
0121 'Invalid method for scatter computing: %s', opts.method);
0122 end
0123
0124
0125 if isempty(opts.nums)
0126 k = 1;
0127 opts.nums = n;
0128 else
0129 k = length(opts.nums);
0130 if ~isequal(size(opts.nums), [1, k])
0131 error('sltoolbox:invalidarg', ...
0132 'nums should be an 1 x k row vector');
0133 end
0134 if sum(opts.nums) ~= n
0135 error('sltoolbox:sizmismatch', ...
0136 'The total number is consistent with that in X');
0137 end
0138 end
0139
0140 if ~isempty(opts.sweights)
0141 if ~isequal(size(opts.sweights), [1, n])
0142 error('sltoolbox:invalidarg', ...
0143 'sample weights should be an 1 x n row vector.');
0144 end
0145 end
0146
0147
0148
0149
0150 switch type
0151
0152
0153 case 'Sw'
0154 if k == 1
0155 w = fh_get_weights(X, opts.sweights, opts.dwrule);
0156 S = fh_scatter_core(X, w);
0157 else
0158 S = zeros(d, d);
0159 [sp, ep] = slnums2bounds(opts.nums);
0160 for i = 1 : k
0161 [curX, curw] = get_cur_class(X, sp(i), ep(i), opts, fh_get_weights);
0162 S = S + fh_scatter_core(curX, curw);
0163 end
0164 end
0165
0166
0167 case 'Sb'
0168 if k == 1
0169 S = zeros(d, d);
0170 else
0171 centers = slmeans(X, opts.sweights, opts.nums);
0172 [sp, ep] = slnums2bounds(opts.nums);
0173 sw = get_class_weights(opts.sweights, opts.nums, sp, ep);
0174 w = fh_get_weights(centers, sw, opts.dwrule);
0175 S = fh_scatter_core(centers, w);
0176 end
0177
0178
0179 case 'St'
0180 w = fh_get_weights(X, opts.sweights, opts.dwrule);
0181 S = fh_scatter_core(X, w);
0182
0183 end
0184
0185
0186
0187
0188
0189 function w = get_weights_std(X, sweights, dwrule)
0190
0191 if isempty(sweights)
0192 if isempty(dwrule)
0193 w = [];
0194 else
0195 mv = slmean(X, [], true);
0196 dists = slmetric_pw(mv, X, 'eucdist');
0197 w = invoke_dwrule(dwrule, dists);
0198 end
0199 else
0200 if isempty(dwrule)
0201 w = sweights;
0202 else
0203 mv = slmean(X, sweights, true);
0204 dists = slmetric_pw(mv, X, 'eucdist');
0205 w = invoke_dwrule(dwrule, dists) .* sweights;
0206 end
0207 end
0208
0209
0210 function w = get_weights_pw(X, sweights, dwrule)
0211
0212 if isempty(sweights)
0213 if isempty(dwrule)
0214 w = [];
0215 else
0216 dists = slmetric_pw(X, X, 'eucdist');
0217 w = invoke_dwrule(dwrule, dists);
0218 end
0219 else
0220 if isempty(dwrule)
0221 w = sweights' * sweights;
0222 else
0223 w = sweights' * sweights;
0224 dists = slmetric_pw(X, X, 'eucdist');
0225 w = invoke_dwrule(dwrule, dists) .* w;
0226 end
0227 end
0228
0229
0230
0231 function [curX, curw] = get_cur_class(X, sp, ep, opts, fhgetw)
0232
0233 curX = X(:, sp:ep);
0234 if isempty(opts.sweights)
0235 sw = [];
0236 else
0237 sw = opts.sweights(sp:ep);
0238 end
0239 curw = fhgetw(curX, sw, opts.dwrule);
0240
0241
0242
0243 function w = get_class_weights(sweights, nums, sp, ep)
0244
0245 if isempty(sweights)
0246 w = nums;
0247 else
0248 k = length(nums);
0249 w = zeros(1, k);
0250 for i = 1 : k
0251 w(i) = sum(sweights(sp(i):ep(i)));
0252 end
0253 end
0254
0255
0256
0257
0258
0259 function S = scatter_core_std(X, w)
0260
0261 if isempty(w)
0262 n = size(X, 2);
0263 S = slcov(X) * n;
0264 else
0265 tw = sum(w);
0266 S = slcov(X, w) * tw;
0267 end
0268
0269
0270 function S = scatter_core_pw(X, w)
0271
0272 S = slpwscatter(X, w);
0273
0274
0275
0276
0277 function w = invoke_dwrule(dwrule, dists)
0278
0279 if ~iscell(dwrule)
0280 w = feval(dwrule, dists);
0281 else
0282 if length(dwrule) == 1
0283 w = feval(dwrule{1}, dists);
0284 else
0285 w = feval(dwrule{1}, dists, dwrule{2:end});
0286 end
0287 end
0288
0289
Generated on Wed 20-Sep-2006 12:43:11 by m2html © 2003
|
|