2017-06-06 2 views
0

Ich habe diese Normalverteilung 2D definiert alsMatlab Konturdaten für 2D normale kumulative Wahrscheinlichkeitsdichte

mu = [0 0]; 
Sigma = [1 0.5^0.5; 0.5^0.5 1]; 

Gibt es eine Möglichkeit, die Konturdaten zu erhalten, wenn die kumulative Wahrscheinlichkeit sagt 95%. Ich will nicht die Handlung, sondern den Wert der (x, y) Punkte, der 95% Kontur ergibt.

Es wäre sehr nett, wenn jemand helfen kann. Vielen Dank im Voraus

+0

Bitte konsultieren Sie das Duplikat. Schauen Sie sich Amro's Antwort an - besonders den EDIT-Abschnitt, der darüber spricht, wie man die Punkte entlang der 95% igen Fehlerellipse erzeugt. – rayryeng

+0

Ich konnte der Antwort nicht folgen. Das Ziel des Problems scheint anders zu sein. – user1612986

+1

Der Post erzeugt die Punkte einer Ellipse um die Daten. Es findet diese Punkte und zeichnet sie dann auf. Die Bearbeitung zeigt Ihnen auch, wie Sie dies für eine Fehlerellipse von 95% tun. Was Sie suchen, sind nur die Punkte, nicht das Plotten. Also alles bis auf die Handlung. Das Duplikat zeichnet dies für zwei Objekte auf, aber Sie haben nur eines. Die Linie, in der die Punkte erzeugt werden, lautet: 'e = bsxfun (@plus, VV * e, Mu ');'. "e" wird somit eine zweispaltige Matrix sein, wobei jede Spalte eine Koordinate ("x" oder "y") der Punkte entlang der Ellipse ist. – rayryeng

Antwort

1

Sie können einen numerischen Solver verwenden, um die Kontur zu finden wie folgt:

% plot the distribution 
figure; 
x = (-5:0.5:5)'; 
y = (-5:0.5:5)'; 
[X1,X2] = meshgrid(x',y'); 
X = [X1(:) X2(:)]; 
p = mvncdf(X,mu,Sigma); 
X3 = reshape(p,length(x),length(y)); 
surf(X1,X2,X3); 

x = (-5:0.1:5)'; % define the x samples at which the contour should be calculated 
y0 = zeros(size(x)); % initial guess 
y = fsolve(@(y) mvncdf([x y], mu, Sigma) - 0.95, y0); % solve your problem 
z = mvncdf([x y],mu,Sigma); % calculate the correspond cdf values 
hold on 
plot3(x(z>0.94), y(z>0.94), z(z>0.94), 'LineWidth', 5); % plot only the valid solutions, i.e. a solution does not exist for all sample points of x. 

enter image description here

Um eine bessere numerische Darstellung der gewünschten Kontur zu erhalten, können Sie den obigen Ansatz für ausgewählte y-Werte wiederholen. Ihre Linie wird also besser den gesamten Graphen ausfüllen.

Als Alternative kann man contour verwenden, um die Punkte auf der Kontur wie folgt zu berechnen:

figure 
[c, h] = contour(X1, X2, X3, [0.95 0.95]); 
c(3, :) = mvncdf(c',mu,Sigma); 

figure(1) 
plot3(c(1, :)', c(2, :)', c(3, :)', 'LineWidth', 5); 
xlim([-5 5]) 
ylim([-5 5]) 

enter image description here

Ein Nachteil dieses Ansatzes ist, dass Sie nicht die Kontrolle über das haben Sie Grobheit der abgetasteten Kontur. Zweitens verwendet diese Methode (Interpolation von) die 3D-CAD-Datei, die weniger genau ist als die mit fsolve berechneten Werte.

0

Würde dies helfen?

clear all 
close all 
mu = [0 0]; 
Sigma = [1 0.5^0.5; 0.5^0.5 1]; 
x1 = -3:.2:3; x2 = -3:.2:3; 
[X1,X2] = meshgrid(x1,x2); 
F = mvnpdf([X1(:) X2(:)],mu,Sigma); 
F = reshape(F,length(x2),length(x1)); 
subplot(1,3,1) 
surf(x1,x2,F); axis square 

X = [X1(:) X2(:)]; 
p = mvncdf(X,mu,Sigma); 
P = reshape(p,31,31); 
subplot(1,3,2) 
surf(X1,X2,P); axis square 

subplot(1,3,3) 
P(P<0.95) = NaN; 
surf(X1,X2,P); axis square 

enter image description here

oder mit der richtigen Achse enter image description here

ersetzen surfen mit Kontur enter image description here