Перший підхід
Ви можете спробувати такий підхід у Mathematica.
Давайте генеруємо деякі двовимірні дані:
data = Table[RandomVariate[BinormalDistribution[{50, 50}, {5, 10}, .8]], {1000}];
Тоді нам потрібно завантажити цей пакет:
Needs["MultivariateStatistics`"]
І зараз:
ellPar=EllipsoidQuantile[data, {0.9}]
дає вихід, який визначає 90% впевненого еліпса. Значення, отримані з цього виводу, мають такий формат:
{Ellipsoid[{x1, x2}, {r1, r2}, {{d1, d2}, {d3, d4}}]}
x1 і x2 задають точку, в якій еліпс у центрі, r1 і r2 задають радіуси напіввісі, а d1, d2, d3 і d4 задають напрямок вирівнювання.
Ви також можете побудувати це:
Show[{ListPlot[data, PlotRange -> {{0, 100}, {0, 100}}, AspectRatio -> 1], Graphics[EllipsoidQuantile[data, 0.9]]}]
Загальною параметричною формою еліпса є:
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]}
І ви можете побудувати це таким чином:
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}}]
Ви можете здійснити перевірку на основі чистої геометричної інформації: якщо евклідова відстань між центром еліпса (ellPar [[1,1]]) та вашою точкою даних більша за відстань між центром еліпса та межею еліпса (очевидно, в тому ж напрямку, в якому знаходиться ваша точка), то ця точка даних знаходиться поза еліпсом.
Другий підхід
Цей підхід заснований на плавному розподілі ядра.
Це деякі дані, що поширюються аналогічно вашим даним:
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];
Ми отримуємо плавне розподіл ядра за цими значеннями даних:
skd = SmoothKernelDistribution[data];
Ми отримуємо числовий результат для кожної точки даних:
eval = Table[{data[[i]], PDF[skd, data[[i]]]}, {i, Length[data]}];
Ми встановлюємо поріг і вибираємо всі дані, що перевищують цей поріг:
threshold = 1.2;
dataIn = Select[eval, #1[[2]] > threshold &][[All, 1]];
Тут ми отримуємо дані, які потрапляють за межі регіону:
dataOut = Complement[data, dataIn];
А тепер ми можемо побудувати всі дані:
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]]
Зелені кольорові точки - це ті, що перевищують поріг, а точки червоного кольору - ті, що знаходяться нижче порогу.