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

📄 out_of_sample.m

📁 一个很好的Matlab编制的数据降维处理软件
💻 M
字号:
function t_point = out_of_sample(point, mapping)%TRANSFORM_SAMPLE_EST Performs out-of-sample extension of new datapoints%%   t_points = out_of_sample(points, mapping)%% Performs out-of-sample extension of the new datapoints in points. The % information necessary for the out-of-sample extension is contained in % mapping (this struct can be obtained from COMPUTE_MAPPING).% The function returns the coordinates of the transformed points in t_points.%%% 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    welcome;    % Handle PRTools dataset    if strcmp(class(point), 'dataset')        prtools = 1;        ppoint = point;        point = point.data;    else         prtools = 0;    end    switch mapping.name                % Linear mappings        case {'PCA', 'LDA', 'LPP', 'NPE', 'LLTSA', 'SPCA', 'PPCA', 'FA'}            t_point = (point - repmat(mapping.mean, [size(point, 1) 1])) * mapping.M;                    % Kernel PCA mapping        case 'KernelPCA'            % Compute and center kernel matrix            K = gram(mapping.X, point, mapping.kernel, mapping.param1, mapping.param2);            J = repmat(mapping.column_sums', [1 size(K, 2)]);            K = K - repmat(sum(K, 1), [size(K, 1) 1]) - J + repmat(mapping.total_sum, [size(K, 1) size(K, 2)]);                        % Compute transformed points            t_point = mapping.invsqrtL * mapping.V' * K;            t_point = t_point';                                      % Neural network mapping (with biases)        case 'AutoEncoderEA'            % Make zero-mean, unit variance            point = point -  repmat(mapping.mean, [size(point, 1) 1]);            point = point ./ repmat(mapping.var,  [size(point, 1) 1]);                        % Run through autoencoder            point   = [point                                      ones(size(point, 1), 1)];             w1probs = [1 ./ (1 + exp(-point   * mapping.w1))      ones(size(point, 1), 1)];            w2probs = [1 ./ (1 + exp(-w1probs * mapping.w2))      ones(size(point, 1), 1)];            w3probs = [1 ./ (1 + exp(-w2probs * mapping.w3))      ones(size(point, 1), 1)];            t_point = w3probs * mapping.w4;                    case 'Autoencoder'            point = point -  mapping.min;            point = point ./ mapping.max;            t_point = run_through_network(mapping.network, point);                    case {'Isomap', 'LandmarkIsomap'}            % Precomputations for speed            if strcmp(mapping.name, 'Isomap')                invVal = inv(diag(mapping.val));                [val, index] = sort(mapping.val, 'descend');                mapping.landmarks = 1:size(mapping.X, 1);            else                val = mapping.beta .^ (1 / 2);                [val, index] = sort(real(diag(val)), 'descend');            end            val = val(1:mapping.no_dims);            meanD1 = mean(mapping.DD .^ 2, 1);            meanD2 = mean(mean(mapping.DD .^ 2));                        % Process all points (notice that in this implementation             % out-of-sample points are not used as landmark points)            points = point;            t_point = repmat(0, [size(point, 1) mapping.no_dims]);            for i=1:size(points, 1)                                % Compute distance of new sample to training points                point = points(i,:);                tD = L2_distance(point', mapping.X');                [tmp, ind] = sort(tD);                 tD(ind(mapping.k + 2:end)) = 0;                tD = sparse(tD);                tD = dijkstra([0 tD; tD' mapping.D], 1);                tD = tD(mapping.landmarks + 1) .^ 2;                % Compute point embedding                subB = -.5 * (tD - repmat(mean(tD, 2), [1 size(tD, 2)]) - meanD1 - meanD2);                if strcmp(mapping.name, 'LandmarkIsomap')                    vec = subB * mapping.alpha * mapping.invVal;                    vec = vec(:,index(1:mapping.no_dims));                else                    vec = subB * mapping.vec * invVal;                    vec = vec(:,index(1:mapping.no_dims));                end                t_point(i,:) = real(vec .* sqrt(val)');            end                    case 'LLE'            % Initialize some variables            n = size(mapping.X, 1);            t_point = repmat(0, [size(point, 1) numel(mapping.val)]);                        % Compute local Gram matrix            D = (L2_distance(point', mapping.X') .^ 2);            [foo, ind] = sort(D, 2, 'ascend');            for i=1:size(point, 1)                % Compute local Gram matrix                C = (repmat(point(i,:), [mapping.k 1]) - mapping.X(ind(i, 2:mapping.k + 1),:)) * ...                    (repmat(point(i,:), [mapping.k 1]) - mapping.X(ind(i, 2:mapping.k + 1),:))';                % Compute reconstruction weights                invC = inv(C);                W = sum(invC, 2) ./ sum(sum(invC));                % Compute kernel matrix                K = repmat(0, [n 1]);                K(ind(i, 2:mapping.k + 1)) = W;                % Compute embedded point                t_point(i,:) = sum(mapping.vec .* repmat(K, [1 size(mapping.vec, 2)]), 1);            end                case 'Laplacian'                     % Initialize some other variables            n = size(mapping.X, 1);                                         % Compute embeddings            t_point = repmat(0, [size(point, 1) numel(mapping.val)]);            for i=1:size(point, 1)                % Compute Gaussian kernel between test point and training points                K = (L2_distance(point(i,:)', mapping.X') .^ 2)';                [foo, ind] = sort(K, 'ascend');                            K(ind(mapping.k+1:end)) = 0;                K(K ~= 0) = exp(-K(K ~= 0) / (2 * mapping.sigma ^ 2));                % Normalize kernel                K = (1 ./ n) .* (K ./ sqrt(mean(K) .* mean(mapping.K, 2)));                % Compute embedded point                t_point(i,:) = sum(mapping.vec .* repmat(K, [1 size(mapping.vec, 2)]), 1);            end                    case 'LandmarkMVU'            % Initialize some variables            n = size(point, 1);                        % Compute pairwise distances            X = L2_distance(point', mapping.X);             neighbors = zeros(mapping.k2, n);                        % Compute reconstruction weights            tol = 1e-7;            Pia = sparse([], [], [], mapping.no_landmarks, n);            for i=1:n                                % Identify nearest neighbors in distance matrix                dist = L2_distance(X(:,i), mapping.D);                [dist, ind] = sort(dist, 'ascend');                neighbors(:,i) = ind(2:mapping.k2 + 1);                                % Compute reconstruction weights                z = mapping.D(:,neighbors(:,i)) - repmat(X(:,i), 1, mapping.k2);                C = z' * z;                C = C + tol * trace(C) * eye(mapping.k2) / mapping.k2;                invC = inv(C);                Pia(neighbors(:,i), i) = sum(invC)' / sum(sum(invC));            end            % Fill sparse LLE weight matrix            M = speye(n) + sparse([], [], [], n, n, n * mapping.k2 .^ 2);            for i=1:n                j = neighbors(:,i);                w = Pia(j, i);                M(i, j) = M(i, j) - w';                M(j, i) = M(j, i) - w;                M(j, j) = M(j, j) + w * w';            end            % Invert LLE weight matrix            Pia = -M(mapping.no_landmarks + 1:end, mapping.no_landmarks + 1:end) \ ...                   M(mapping.no_landmarks + 1:end, 1:mapping.no_landmarks);            Pia = [eye(mapping.no_landmarks); Pia];                        % Apply mapping on the data            t_point = mapping.Y * Pia';            t_point = t_point(1:mapping.no_dims,:)';                    case 'FastMVU'                        if ~mapping.finetune                % Initialize some other variables                n = size(mapping.X, 1);                   % Start with out-of-sample extension for Laplacian Eigenmaps                Y = repmat(0, [size(point, 1) size(mapping.vec, 2)]);                for i=1:size(point, 1)                    % Compute adjecency matrix between test point and training points                    K = L2_distance(point(i,:)', mapping.X(mapping.conn_comp,:)')' .^ 2;                    [foo, ind] = sort(K, 'ascend');                    K(ind(mapping.k + 1:end)) = 0;                    K(ind(1:mapping.k)) = 1;                    % Normalize kernel                    K = (1 ./ n) .* (K ./ sqrt(mean(K) .* mean(mapping.D, 2)));                    % Compute estimated eigenvectors of graph Laplacian                    Y(i,:) = sum(mapping.vec .* repmat(K, [1 size(mapping.vec, 2)]), 1);                end                % Out-of sample extension to obtain initial solutions                newY = mapping.L * Y';                newY = mapping.newV' * newY;                newY = newY(mapping.idx(end:-1:1),:)';                % Apply the PCA mapping                t_point = out_of_sample(newY, mapping.pca_map);            else                error('Out-of-sample extension for FastMVU is only available when finetuning was disabled.');            end                                            otherwise            error(['A proper out-of-sample extension for ' mapping.name ' is not available in the toolbox. You might consider using OUT_OF_SAMPLE_EST instead.']);    end        % Handle PRTools dataset    if prtools == 1        ppoint.data = t_point;        t_point = ppoint;    end    

⌨️ 快捷键说明

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