0

matlab で期待値最大化アルゴリズムを実装しています。アルゴリズムは 214096 x 2 データ行列で動作しており、確率の計算中に ( 214096 x 2 ) * (2 x 2) * ( 2 x 214096 ) 行列が乗算され、matlab でメモリ不足のエラーが発生します。この問題を解決する方法はありますか?

方程式

Matlab コード:

          enter image description here  D = size(X,2); % dimension
            N = size(X,1); % number of samples
            K = 4; % number of Gaussian Mixture components ( Also number of clusters )

            % Initialization
            p = [0.2, 0.3, 0.2, 0.3]; % arbitrary pi, probabilities of clusters, apriori probability of cluster
            [idx,mu] = kmeans(X,K); % initial means of the components, theta is mu and variance

            % compute the covariance of the components
            sigma = zeros(D,D,K);
            for k = 1:K
                tempmat = X(idx==k,:);
                sigma(:,:,k) = cov(tempmat);  % Sigma j
                sigma_det(k) = det(sigma(:,:,k));
            end

            % calculate x-mu
            for k=1: K
                            check=length( X(idx == k,1))
                            for  lidx = 1: length( X(idx == k,1))

                                cidx = find( idx == k) ;
                                Xmu(cidx(lidx),:) = X(cidx(lidx),:) - mu(k,:); %( x-mu ) calculation on cluster level
                            end
            end


            % compute P(Cj|x; theta(t)), and take log to simplified calculation

            %Eq 14.14 denominator 
            denom = 0;
            for k=1:K
                calc_sigma_1_2 = sigma_det(k)^(-1/2);
                calc_x_mu = Xmu(idx == k,:);
                calc_sigma_inv = inv(sigma(:,:,k)); 
                calc_x_mu_tran = calc_x_mu.';
                factor = calc_sigma_1_2 * exp (-1/2 * calc_x_mu * calc_sigma_inv * calc_x_mu_tran  ) * p(k);

                denom = denom + factor;
            end


            for k =1:K 
                calc_sigma_1_2 = sigma_det(k)^(-1/2);
                calc_x_mu = Xmu(idx == k,:);
                calc_sigma_inv = inv(sigma(:,:,k)); 
                calc_x_mu_tran = calc_x_mu.';
                factor = calc_sigma_1_2 * exp (-1/2 * calc_x_mu_tran * calc_sigma_inv * calc_x_mu ) * p(k);

                pdf(k) = factor/denom;
            end

            %%%% Equation 14.14 ends
4

1 に答える 1

0

単純にベクトルを行列に代入してベクトルベースの方程式を適用しようとしたようですが、これはどのように機能するかではありません

(x - mu).' * Inv(sigma) * (x-mu) 

(x-mu) のマハラノビスノルムであると想定されているため、行列 X の各行ごとにこの値を取得する必要があるため、

(X - mu).' * Inv(sigma) =: A <- this is ok, this results in N x d matrix

そして今、ドット積ではなく、(X - mu) で A の点ごとの乗算を行い、最後に 2 番目の軸 (列) で合計する必要があります。このようにしてN、それぞれが対応するマハラノビス ノルムを含む要素ベクトルになります。 Xから並びます。

于 2016-05-12T00:10:37.283 に答える