📄 gmm_covariance_intersect.m
字号:
function [gr, alpha] = gmm_covariance_intersect(g1, g2, alpha)
% Conservative approx: Generalised covariance intersect
% TODO: confirm this algorithms correctness. Does it make sense???
% Is there a measure of compactness that we can use to quantify how
% conservative this is? say, entropy?
%
if nargin == 3
gr = gmm_covariance_intersect_alpha(g1, g2, alpha);
else
alpha = fminbnd(@optimise_alpha, 0, 1, [], g1,g2);
gr = gmm_covariance_intersect_alpha(g1, g2, alpha);
end
%
%
function gr = gmm_covariance_intersect_alpha(g1, g2, alpha)
D = size(g1.x, 1);
M = size(g1.x, 2);
N = size(g2.x, 2);
R = M*N;
gr.w = zeros(1, R);
gr.x = zeros(D, R);
gr.P = zeros(D, D, R);
k = 1;
for i=1:M
for j=1:N
[gr.x(:,k), gr.P(:,:,k), w] = covariance_intersect_weight(g1.x(:,i),g1.P(:,:,i), g2.x(:,j),g2.P(:,:,j), alpha);
gr.w(k) = g1.w(i) * g2.w(j) * w;
k = k+1;
end
end
%
%
function [x,P,w] = covariance_intersect_weight(x1,P1, x2,P2, alpha)
[x,P] = covariance_intersect(x1,P1, x2,P2, alpha);
w = weight_update(x1,P1, x2,P2, alpha);
%
%
function w = weight_update(x1,P1, x2,P2, a)
if a==0 | a==1, w = eps; return, end
v = x1-x2;
S = P1/a + P2/(1-a);
%S = P1 + P2;
w = gauss_evaluate(v, S);
%
%
function w = optimise_alpha(alpha, g1,g2)
% Optimise alpha according to various measures. I am not yet sure which is
% the "right" one. For now, entropy and normalised determinant seem most promising.
gr = gmm_covariance_intersect_alpha(g1, g2, alpha);
gr = gmm_normalise(gr);
switch 1
case 1 % Unscented entropy approximation
w = gmm_entropy(gr);
case 2 % Monte Carlo entropy approximation
w = gmm_entropy(gr, 100000);
case 3 % Sum of weighted determinants
w = 0;
for i=1:length(gr.w)
w = w + det(gr.P(:,:,i))*gr.w(i);
end
case 4 % Sum of normalised determinants
w = 0;
for i=1:length(gr.w)
w = w + det(gr.P(:,:,i))/gr.w(i);
end
otherwise
error('Invalid switch selection')
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -