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

📄 em_pca.m

📁 一个很好的Matlab编制的数据降维处理软件
💻 M
字号:
function [mappedX, mapping] = em_pca(X, no_dims, max_iter)%EMPCA Run an EM-based implementation of (probabilistic) PCA%%   [mappedX, mapping] = em_pca(X, no_dims)%% Performs probabilistic PCA on dataset X in order to reduce its% dimensionality to no_dims. The dimensionality reduction is performed by% means of an EM algorithm. The resulting low-dimensional counterpart of X% is returned in mappedX. Information on the applied mapping (allowing for,% e.g., out-of-sample extension) is returned in mapping.%%% 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    if ~exist('max_iter', 'var')        max_iter = 200;    end    % Initialize some variables    [n D] = size(X);                        % data dimensions    Ez = zeros(no_dims, n);                 % expectation of latent vars    Ezz = zeros(no_dims, no_dims, n);       % expectation of cov(z)    Q = Inf;                                % log-likelihood    mapping = struct;    % Randomly initialize W and sigma    W = rand(D, no_dims) * 2;               % factor loadings    sigma2 = rand(1) * 2;                   % variance ^ 2    % The covariance of the Gaussian is: C = W * W' + sigma2 * eye(D);        % Make data zero-mean (possible because data mean is ML estimate for mu)    mapping.mean = mean(X, 1);    X = X - repmat(mapping.mean, [size(X, 1) 1]);        % Compute data covariance and transpose data    S = cov(X);    X = X';        % Perform EM iterations    converged = 0;    iter = 0;    inW = W' * W;    while ~converged && iter <= max_iter                    % Update iteration number        iter = iter + 1;        if rem(iter, 5) == 0            fprintf('.');        end                % Perform E-step        invM = inv(inW + sigma2 * eye(no_dims));        for i=1:n            Ez(:,i)    = invM * W' * X(:,i);                     Ezz(:,:,i) = sigma2 * invM + Ez(:,i) * Ez(:,i)';        end                % Perform M-step (maximize mapping W)        Wp1 = zeros(D, no_dims);        Wp2 = zeros(no_dims, no_dims);        for i=1:n            Wp1 = Wp1 + X(:,i) * Ez(:,i)';            Wp2 = Wp2 + Ezz(:,:,i);        end        W = Wp1 * inv(Wp2);        inW = W' * W;                % Perform M-step (maximize discarded variance sigma)        normX = sum(X, 1);        sigma2 = 0;        for i=1:n            sigma2 = sigma2 + (normX(i).^2 - 2 * Ez(:,i)' * W' * X(:,i) + trace(Ezz(:,:,i) * inW));        end        sigma2 = (1 / (n * D)) * sigma2;                % Compute likelihood of new model        oldQ = Q;        if iter > 1            invC = ((1 / sigma2) * eye(D)) - ((1 / sigma2) * W * invM * W');            detC = det(sigma2 * eye(D)) * det(eye(no_dims) + W' * ((sigma2 .^ -1) * eye(D)) * W);            Q = (-n / 2) * (D * log(2 * pi) + log(detC) + trace(invC * S));        end                % Stop condition to detect convergence        if abs(oldQ - Q) < 1e-3            converged = 1;        end    end        % Compute mapped data    disp(' ');    mapping.M = (inv(inW) * W')';    mappedX = X' * mapping.M;        

⌨️ 快捷键说明

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