Cách tiếp cận đầu tiên
Bạn có thể thử phương pháp này trong Mathematica.
Hãy tạo một số dữ liệu bivariate:
data = Table[RandomVariate[BinormalDistribution[{50, 50}, {5, 10}, .8]], {1000}];
Sau đó, chúng ta cần tải gói này:
Needs["MultivariateStatistics`"]
Và bây giờ:
ellPar=EllipsoidQuantile[data, {0.9}]
đưa ra một đầu ra xác định hình elip 90% độ tin cậy. Các giá trị bạn nhận được từ đầu ra này có định dạng sau:
{Ellipsoid[{x1, x2}, {r1, r2}, {{d1, d2}, {d3, d4}}]}
x1 và x2 chỉ định điểm tại đó hình elip ở giữa, r1 và r2 chỉ định bán kính bán trục và d1, d2, d3 và d4 chỉ định hướng căn chỉnh.
Bạn cũng có thể vẽ biểu đồ này:
Show[{ListPlot[data, PlotRange -> {{0, 100}, {0, 100}}, AspectRatio -> 1], Graphics[EllipsoidQuantile[data, 0.9]]}]
Dạng tham số chung của hình elip là:
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]}
Và bạn có thể vẽ nó theo cách này:
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}}]
Bạn có thể thực hiện kiểm tra dựa trên thông tin hình học thuần túy: nếu khoảng cách Euclide giữa tâm hình elip (ellPar [[1,1]]) và điểm dữ liệu của bạn lớn hơn khoảng cách giữa tâm hình elip và đường viền của hình elip (rõ ràng, cùng hướng với điểm của bạn), thì điểm dữ liệu đó nằm ngoài hình elip.
Cách tiếp cận thứ hai
Cách tiếp cận này dựa trên phân phối kernel trơn tru.
Đây là một số dữ liệu được phân phối theo cách tương tự với dữ liệu của bạn:
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];
Chúng tôi có được phân phối kernel trơn tru trên các giá trị dữ liệu này:
skd = SmoothKernelDistribution[data];
Chúng tôi có được kết quả số cho từng điểm dữ liệu:
eval = Table[{data[[i]], PDF[skd, data[[i]]]}, {i, Length[data]}];
Chúng tôi sửa một ngưỡng và chúng tôi chọn tất cả dữ liệu cao hơn ngưỡng này:
threshold = 1.2;
dataIn = Select[eval, #1[[2]] > threshold &][[All, 1]];
Ở đây chúng tôi nhận được dữ liệu nằm ngoài khu vực:
dataOut = Complement[data, dataIn];
Và bây giờ chúng ta có thể vẽ tất cả các dữ liệu:
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]]
Các điểm màu xanh lá cây là những điểm trên ngưỡng và các điểm màu đỏ là những điểm dưới ngưỡng.