Erste Ansatz
Sie können diesen Ansatz in Mathematica ausprobieren.
Lassen Sie uns einige bivariate Daten generieren:
data = Table[RandomVariate[BinormalDistribution[{50, 50}, {5, 10}, .8]], {1000}];
Dann müssen wir dieses Paket laden:
Needs["MultivariateStatistics`"]
Und nun:
ellPar=EllipsoidQuantile[data, {0.9}]
gibt eine Ausgabe aus, die eine 90% -Konfidenzellipse definiert. Die Werte, die Sie von dieser Ausgabe erhalten, haben das folgende Format:
{Ellipsoid[{x1, x2}, {r1, r2}, {{d1, d2}, {d3, d4}}]}
x1 und x2 geben den Punkt an, an dem die Ellipse zentriert ist, r1 und r2 die Halbachsenradien und d1, d2, d3 und d4 die Ausrichtungsrichtung.
Sie können dies auch zeichnen:
Show[{ListPlot[data, PlotRange -> {{0, 100}, {0, 100}}, AspectRatio -> 1], Graphics[EllipsoidQuantile[data, 0.9]]}]
Die allgemeine parametrische Form der Ellipse lautet:
ell[t_, xc_, yc_, a_, b_, angle_] := {xc + a Cos[t] Cos[angle] - b Sin[t] Sin[angle],
yc + a Cos[t] Sin[angle] + b Sin[t] Cos[angle]}
Und Sie können es so zeichnen:
ParametricPlot[
ell[t, ellPar[[1, 1, 1]], ellPar[[1, 1, 2]], ellPar[[1, 2, 1]], ellPar[[1, 2, 2]],
ArcTan[ellPar[[1, 3, 1, 2]]/ellPar[[1, 3, 1, 1]]]], {t, 0, 2 \[Pi]},
PlotRange -> {{0, 100}, {0, 100}}]
Sie können eine Überprüfung basierend auf reinen geometrischen Informationen durchführen: Wenn der euklidische Abstand zwischen dem Mittelpunkt der Ellipse (ellPar [[1,1]]) und Ihrem Datenpunkt größer ist als der Abstand zwischen dem Mittelpunkt der Ellipse und dem Rand von die Ellipse (offensichtlich in der gleichen Richtung, in der sich Ihr Punkt befindet), dann befindet sich dieser Datenpunkt außerhalb der Ellipse.
Zweiter Ansatz
Dieser Ansatz basiert auf der reibungslosen Kernelverteilung.
Dies sind einige Daten, die auf ähnliche Weise wie Ihre Daten verteilt werden:
data1 = RandomVariate[BinormalDistribution[{.3, .7}, {.2, .3}, .8], 500];
data2 = RandomVariate[BinormalDistribution[{.6, .3}, {.4, .15}, .8], 500];
data = Partition[Flatten[Join[{data1, data2}]], 2];
Wir erhalten eine reibungslose Kernelverteilung für diese Datenwerte:
skd = SmoothKernelDistribution[data];
Wir erhalten für jeden Datenpunkt ein numerisches Ergebnis:
eval = Table[{data[[i]], PDF[skd, data[[i]]]}, {i, Length[data]}];
Wir legen einen Schwellenwert fest und wählen alle Daten aus, die höher als dieser Schwellenwert sind:
threshold = 1.2;
dataIn = Select[eval, #1[[2]] > threshold &][[All, 1]];
Hier erhalten wir die Daten, die außerhalb der Region liegen:
dataOut = Complement[data, dataIn];
Und jetzt können wir alle Daten zeichnen:
Show[ContourPlot[Evaluate@PDF[skd, {x, y}], {x, 0, 1}, {y, 0, 1}, PlotRange -> {{0, 1}, {0, 1}}, PlotPoints -> 50],
ListPlot[dataIn, PlotStyle -> Darker[Green]],
ListPlot[dataOut, PlotStyle -> Red]]
Die grün gefärbten Punkte befinden sich oberhalb des Schwellenwerts und die rot gefärbten Punkte befinden sich unterhalb des Schwellenwerts.