Я новичок в MATLAB, и я изо всех сил пытаюсь найти решение этого уравнения.
Где размеры матриц: {λ} = N×K, {Y} = N×D, {π} = 1×K и {µ} = D×K.
То, что я создал, больше похоже на чудовище, чем на эффективный код MATLAB, и это из-за серьезного недостатка навыков работы с MATLAB.
На самом деле, я решил решить это шаг за шагом, чтобы ознакомиться с тем, как работает MATLAB. Я получил крайне неэффективный код, который я даже не могу комбинировать. Даже окончательный результат неверен, так как я хочу создать матрицу NxK. Любое руководство будет высоко оценено.
%Dimensions:
nn = 10;
dd = 7;
kk = 5;
%Initial variables:
lambda0 = rand(nn,kk);
sigma = rand(1);
Y = rand(nn,dd);
mu = rand(dd,kk);
%Calculate pies:
First_part = log(pie(:)./(1.-pie(:))); % Kx1 vector
%Calculate Second part:
for n = 1:nn
for d = 1:dd
lambda_mu(d,:) = lambda0(n,:).*mu(d,:); %lambdamu is a DxK matrix
end
lambda_mu2(n,:) = sum(lambda_mu,2); %This is a NXD matrix
end
%Y-lambdamu2:
for n = 1:nn
YY(n,:) = Y(n,:)-lambda_mu2(n,:); % This is a NxD vector
end
%YY*mu:
Second = (YY*mu)./sigma^2; % NxK
%Third:
Third = (mu'*mu)./2*sigma^2; % KxK
%Final:
for n=1:nn
Final_part = transpose(First_part(:))+Second(n,:)-Third;
end
Обновление1: Хорошо, я должен себе пиво. Итак, я добился некоторого прогресса в создании матрицы {λ} = N×K, изменив свой код следующим образом:
Обновление[2]: Вы слишком много времени тратите на программирование и упускаете детали. Я исправил ошибку, так как установил {Y} = D×K вместо {Y} = D×N.
%Dimensions:
nn = 10;
dd = 7;
kk = 5;
%Initial variables:
lambda0 = rand(nn,kk);
sigma = rand(1);
Y = rand(dd,nn);
mu = rand(dd,kk);
pie = rand(1,kk);
sigma = rand(1);
%Calculate the equation.
for n = 1:nn
for k = 1:kk
lambda(n,k) = log(pie(k)/(1-pie(k))) + (transpose(Y(:,n)-...
(sum(lambda0(n,1:end ~= k).*mu(:,1:end ~= k),2)))*mu(:,k))/...
sigma^2 - transpose(mu(:,k))*mu(:,k)/2*sigma^2;
end
end
Но теперь проблема в том, что это происходит только до n=5, когда я пытаюсь выполнить цикл для n=6, например, я получаю это сообщение: "Индекс превышает размеры матрицы", так что практически я получаю только 5× 5 матрица. Ваши предложения?
PS: я даже пытался изменить лямбду с лямбда (n, k) на лямбда (k, n), но результат тот же.
First_part
естьlog
чего-то (следовательно, скалярного). Таким образом (изThird_part
) µ_i должно быть Kx1; и (изSecond_part
) y^(n) также является Kx1. - person Solstad   schedule 08.12.2016First_part
нужно умножить наones(1,kk)
. - person Solstad   schedule 08.12.2016ones(nn,kk)
нужно умножить наThird_part
и новый KxKFirst_part
. Таким образом, давая матрицы NxK для сложения/вычитания. - person Solstad   schedule 08.12.2016