📄 mridge.m
字号:
function [B, S, h, peff] = mridge(Cxx, Cyy, Cxy, dof, options);%MRIDGE Multiple ridge regression with generalized cross-validation.%% [B, S, h, peff] = MRIDGE(Cxx, Cyy, Cxy, dof, OPTIONS) returns a% regularized estimate B = Mxx_h Cxy of the coefficient matrix in% the multivariate multiple regression model Y = X*B + noise(S). The% matrix Mxx_h is the regularized inverse of the covariance matrix% Cxx,%% Mxx_h = inv(Cxx + h^2 * I).%% The matrix Cxx is an estimate of the covariance matrix of the% independent variables X, Cyy is an estimate of the covariance% matrix of the dependent variables Y, and Cxy is an estimate of the% cross-covariance matrix of the independent variables X and the% dependent variables Y. The scalar dof is the number of degrees of% freedom that were available for the estimation of the covariance% matrices.%% The input structure OPTIONS contains optional parameters for the% algorithm:%% Field name Parameter Default%% OPTIONS.regpar Regularization parameter h. If regpar not set% is set, the scalar OPTIONS.regpar is% taken as the regularization parameter h. % If OPTIONS.regpar is not set (default), % the regularization parameter h is selected % as the minimizer of the generalized % cross-validation (GCV) function. The output% variable h then contains the selected % regularization parameter.% % OPTIONS.relvar_res Minimum relative variance of residuals. 5e-2% From the parameter OPTIONS.relvar_res, a% lower bound for the regularization parameter% is constructed, in order to prevent GCV from% erroneously choosing too small a % regularization parameter (see GCVRIDGE).%% The OPTIONS structure is also passed to GCVRIDGE.%% MRIDGE returns the ridge estimate B of the matrix of regression% coefficients. Also returned are an estimate S of the residual% covariance matrix, the regularization parameter h, and the scalar% peff, an estimate of the effective number of adjustable% parameters in B. % % MRIDGE computes the estimates of the coefficient matrix and of the% residual covariance matrix from the covariance matrices Cxx, Cyy,% and Cxy by solving the regularized normal equations. The normal% equations are solved via an eigendecomposition of the covariance% matrix Cxx. However, if the data matrices X and Y are directly% available, a method based on a direct factorization of the data% matrices will usually be more efficient and more accurate.%% See also: IRIDGE, GCVRIDGE. error(nargchk(4, 5, nargin)) % check number of input arguments px = size(Cxx, 1); py = size(Cyy, 1); if size(Cxx, 2) ~= px | size(Cyy, 2) ~= py | any(size(Cxy) ~= [px, py]) error('Incompatible sizes of covariance matrices.') end % ============== process options ======================== if nargin == 4 | isempty(options) options = []; fopts = []; else fopts = fieldnames(options); end if strmatch('regpar', fopts) h = options.regpar; h_given = 1; else h_given = 0; end if strmatch('relvar_res', fopts) relvar_res = options.relvar_res; else relvar_res = 5e-2; end % ================= end options ========================= if nargout > 1 S_out = 1; else S_out = 0; end % eigendecomposition of Cxx rmax = min(dof, px); % maximum possible rank of Cxx [V, d, r] = peigs(Cxx, rmax); % Fourier coefficients. (The following expression for the Fourier % coefficients is only correct if Cxx = X'*X and Cxy = X'*Y for % some, possibly scaled and augmented, data matrices X and Y; for % general Cxx and Cxy, all eigenvectors V of Cxx must be included, % not just those belonging to nonzero eigenvalues.) F = repmat(ones(r, 1)./sqrt(d), 1, px) .* V' * Cxy; % Part of residual covariance matrix that does not depend on the % regularization parameter h: if (dof > r) S0 = Cyy - F'*F; else S0 = sparse(py, py); end if ~h_given % approximate minimum squared residual trSmin = relvar_res * trace(Cyy); % find regularization parameter that minimizes the GCV object function h = gcvridge(F, d, trace(S0), dof, r, trSmin, options); end % get matrix of regression coefficients B = V * (repmat(sqrt(d)./(d + h^2), 1, py) .* F); if S_out % get estimate of covariance matrix of residuals S = S0 + F' * (repmat(h^4./(d + h^2).^2, 1, py) .* F); end if nargout == 4 % effective number of adjusted parameters: peff = trace(Mxx_h Cxx) peff = sum(d ./ (d + h^2)); end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -