⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdecca2.m

📁 一个很好的Matlab编制的数据降维处理软件
💻 M
字号:
function  [P, newY, L, newV, idx]= sdecca2(Y, snn, regularizer, relative)% doing semidefinitve embedding/MVU with output being parameterized by graph% laplacian's eigenfunctions.. %% the algorithm is same as conformal component analysis except that the scaling% factor there is set as 1%%% function [P, newY, Y] = CDR2(X, Y, NEIGHBORS)  implements the % CONFORMAL DIMENSIONALITY REDUCTION of data X. It finds a linear map% of Y -> L*Y such that X and L*Y is related by a conformal mapping.%% No tehtat  The algorithm use the formulation of only distances.%% Input:%   Y: matrix of d'xN, with each column is a point in R^d'%   NEIGHBORS: matrix of KxN, each column is a list of indices (between 1%   and N) to the nearest-neighbor of the corresponding column in X% Output:%   P: square of the linear map L, i.e., P = L'*L%   newY: transformed data points, i.e., newY = L*Y;%   Y: the linear map L itself,    i.e., L = L%% The algorithm finds L by solving a semidefinite programming problem. It% calls csdp() SDP solver by default and assumes that it is on the path.%% written by feisha@cis.upenn.edu%%% This file is part of the Matlab Toolbox for Dimensionality Reduction v0.4b.% The toolbox can be obtained from http://www.cs.unimaas.nl/l.vandermaaten% You are free to use, change, or redistribute this code in any way you% want for non-commercial purposes. However, it is appreciated if you % maintain the name of the original author.%% (C) Laurens van der Maaten% Maastricht University, 2007    % Collect the data    [erow, ecol, edist] = sparse_nn(snn);    irow = int32(erow);     icol = int32(ecol);    [A, B, g] = mexCCACollectData2(Y, irow, icol, edist, int32(relative));    BG = 2 * sum(B, 2);    Q = A ;    [V, E] = eig(Q + eye(size(Q)));    E = E - eye(size(Q));    E(E < 0) = 0;    if ~isreal(diag(E))        E = real(E);        V = real(V);        S = sqrt(E) * V';    else        S = sqrt(E) * V';    end    % Put the regularizer in there    BG = BG + regularizer * reshape(eye(size(Y, 1)), size(Y, 1) ^ 2, 1);        % Formulate the SDP problem    [AA, bb, cc] = formulateSDP(S, size(Y, 1), BG);    sizeSDP = size(Y, 1) ^ 2 + 1 + size(Y, 1);    pars.s = sizeSDP;    opts.printlevel = 1;    % Solve it using CSDP    [xx, yy] = csdp(AA, bb, cc, pars, opts);    % The negate of yy is our solution    yy = -yy;    idx = 0;    P = zeros(size(Y, 1));    for col=1:size(Y, 1)        for row = col:size(Y, 1)            idx = idx + 1;            P(row, col) = yy(idx);        end    end        % Convert P to a positive definite matrix    P = P + P' - diag(diag(P));    % Transform the original projection to the new projection    [V, E] = eig(P);    E(E < 0) = 0;    L = diag(sqrt(diag(E))) * V';    newY = L * Y;               % multiply with Laplacian    % Eigendecomposition of the new projection: doing PCA because the     % dimensionality of newY or Y is definitely less than the number of    % points    [newV, newE] = eig(newY * newY');    newE = diag(newE);    [dummy, idx] = sort(newE);    newY = newV' * newY;    newY = newY(idx(end:-1:1),:);return% Function that formulates the SDP problemfunction [A, b, c]=formulateSDP(S, D, bb)    [F0, FI, c] = localformulateSDP(S, D, bb);    [A, b, c] = sdpToSeDuMi(F0, FI, c);return% Function that formulates the SDP problemfunction [F0, FI, c] = localformulateSDP(S, D, b)    % Each FI that corresponds to the LMI for the quadratic cost function has    % precisely 2 * D^2 nonzero elements. But we need only D^2 storage for    tempFidx = zeros(D ^ 2, 3);    dimF = (D ^ 2 + 1) + D;    idx = 0;    for col=1:D        for row=col:D            idx = idx + 1;            lindx1 = sub2ind([D D], row, col);            lindx2 = sub2ind([D D], col, row);            tempFidx(:,1) = [1:D ^ 2]';            tempFidx(:,2) = D ^ 2 + 1;            if col == row                tempFidx(:,3) = S(:,lindx1) ;                FI{idx} = sparse([tempFidx(:,1); ...    % for cost function                    tempFidx(:,2); ...                  % symmetric                    row + D^2 + 1 ...                   % for P being p.s.d                    ], ...                    [tempFidx(:,2); ...                 % for cost function                    tempFidx(:,1); ...                  % symmetric                    row + D^2 + 1; ...                  % for P being p.s.d                    ],...                    [tempFidx(:,3); ...                 % for cost function                    tempFidx(:,3); ...                  % symmetric                    1;                                  % for P being p.s.d                    ], dimF, dimF);            else                tempFidx(:,3) = S(:, lindx1) + S(:,lindx2);                FI{idx} = sparse([tempFidx(:,1); ...    % for cost function                    tempFidx(:,2); ...                  % symmetric                    row + D^2 + 1; ...                  % for P being p.s.d                    col + D^2 + 1; ...                  % symmetric                    ], ...                                        [tempFidx(:,2); ...                 % for cost function                    tempFidx(:,1); ...                  % symmetric                    col + D^2 + 1; ...                  % for P being p.s.d                    row + D^2 + 1; ...                  % being symmetric                    ], ...                                        [tempFidx(:,3); ...                 % for cost function                    tempFidx(:,3); ...                  % symmetric                    1;                                  % for P being p.s.d                    1;                                  % symmetric                    ], dimF, dimF);            end        end    end    idx = idx + 1;        % For the F matrix corresponding to t    FI{idx} = sparse(D^2 + 1, D^2 + 1, 1, dimF, dimF);    % Now for F0    F0 = sparse(1:D^2, 1:D^2, ones(1, D^2), dimF, dimF);    % Now for c    b = reshape(-b, D, D);    b = b * 2 - diag(diag(b));    c = zeros(idx - 1,1);    kdx = 0;    for col=1:D        for row=col:D            kdx = kdx + 1;            c(kdx) = b(row, col);        end    end    c = [c; 1];return% Function that convertsthe canonical SDP dual formulation to SeDuMi formatfunction [A, b, c] = sdpToSeDuMi(F0, FI, cc)    % Check inputs    if nargin < 3        error('Cannot convert SDP formulation to SeDuMi formulation.');    end    [m, n] = size(F0);    if m ~= n        error('F0 matrix must be squared matrix.');    end    p = length(cc);    if p ~= length(FI)        error('FI matrix cellarray must have the same length as b.');    end    % Converting objective function of the canonical SDP    c = reshape(F0', n * n, 1);    % Converting equality constraints of the canonical SDP    zz = 0;    for idx=1:length(FI)        zz= zz + nnz(FI{idx});    end    A = spalloc(n * n, p, zz);    for idx=1:p        temp = reshape(FI{idx}, n * n, 1);        lst = find(temp ~= 0);        A(lst, idx) = temp(lst);    end    % We do not need to convert b    b = cc;return

⌨️ 快捷键说明

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