วิธีแรก
คุณอาจลองวิธีนี้ใน Mathematica
มาสร้างข้อมูล bivariate กัน:
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]]
จุดสีเขียวนั้นอยู่เหนือขีด จำกัด และจุดสีแดงนั้นต่ำกว่าขีด จำกัด