Le code JSL suivant peut être utilisé pour afficher une matrice de nuage de points après le clustering.
dt = Open("$SAMPLE_DATA/Big Class.jmp");
Normal Mixtures(
Y( :height, :weight ),
{Mixtures Tolerance( 0.00000001 ), Mixtures MaxIter( 300 ),
Mixtures N Starts( 30 ), Outlier Cluster( 0 ), Diagonal Variance( 0 ),
Number of Clusters( 2 ), Go( Scatterplot Matrix( Ellipse Alpha( 0.1 ) ) )},
SendToReport(
Dispatch( {"Normal Mixtures NCluster=2"}, "Correlations for Normal Mixtures",
OutlineBox,
{Close( 0 )}
),
Dispatch( {"Normal Mixtures NCluster=2", "Scatterplot Matrix"}, "101",
ScaleBox,
{Min( 59.68 ), Max( 179.498666666667 ), Inc( 20 ), Minor Ticks( 0 )}
)
)
);
J'ai besoin d'aide pour les deux questions suivantes :
(1) Comment puis-je définir l'Ellipse α à 0,4 dans le code JSL ?

(2) Je voudrais enregistrer les points inclus dans l'ellipse avec un α de 0,4, où les points à l'intérieur de l'ellipse rouge sont étiquetés comme 1, ceux à l'intérieur de l'ellipse verte sont étiquetés comme -1 et les points à l'extérieur des deux ellipses sont étiquetés comme 0. Cela est similaire à l'enregistrement de clusters dans une table, mais à la place, je souhaite enregistrer les points inclus dans les ellipses. Comment puis-je ajouter cette fonctionnalité au code JSL ?
Il semble que la plate-forme de mélanges normale utilise sa propre matrice de nuages de points, qui n'est pas si facile à consulter ou à manipuler. Vous pouvez enregistrer les clusters dans votre table, puis utiliser la matrice de nuages de points pour créer le graphique
Scatterplot Matrix(
Y(:height, :weight),
Group(:Cluster),
Matrix Format("Lower Triangular"),
Density Ellipses(1),
Ellipses Coverage(0.4),
Group By(:Cluster)
);
mais cela ne vous permettra pas d'obtenir les points. Pour l'obtenir, vous pouvez utiliser la plateforme Fit Y by X (utiliser le cluster comme colonne By).

C'est un endroit où je sais que vous pouvez sélectionner les points à l'intérieur des ellipses

Comme je ne suis pas vraiment sûr de ce que vous essayez de faire (essayez-vous simplement de sélectionner les points ou également d'avoir une sorte de rapport), vous trouverez ci-dessous un script qui fait beaucoup de choses
Names Default To Here(1);
dt = Open("$SAMPLE_DATA/Big Class.jmp");
nw = New Window("",
vlb = V List Box(
nm = dt << Normal Mixtures(
Y(:height, :weight),
{Mixtures Tolerance(0.00000001), Mixtures MaxIter(300), Mixtures N Starts(30),
Outlier Cluster(0), Diagonal Variance(0), Number of Clusters(2), Go()}
)
)
);
cols = Associative Array(dt << Get Column Names("String"));
nm << Save Clusters;
cluster_col = Associative Array(dt << Get Column Names("String"));
cluster_col << Remove(cols);
cluster_col = (cluster_col << get keys)[1];
vlb << Append(
sm = dt << Scatterplot Matrix(
Y(:height, :weight),
Group(:Cluster),
Matrix Format("Lower Triangular"),
Shaded Ellipses(1),
Ellipses Coverage(0.4),
Group By(Eval(cluster_col))
);
);
biv = dt << Bivariate(Y(:weight), X(:height), By(:Cluster), Invisible);
biv << Density Ellipse(0.4, {Select Points Inside});
new_col = dt << New Column("Ellipse", Numeric, Nominal, Formula(
If(Selected() & :Cluster == 1,
1
, Selected() & :Cluster == 2,
-1
,
0
)
));
dt << run formulas;
new_col << Delete Formula;
dt << clear select;
// Just for visualization purposes
gb = dt << Graph Builder(
Size(653, 491),
Show Control Panel(0),
Variables(
X(:height),
Y(:weight),
Overlay(:Cluster, Overlay Encoding("Style")),
Color(:Ellipse)
),
Elements(Points(X, Y, Legend(3)))
);
For(i = 1, i <= 2, i++,
ls = Report(biv[i])[FrameBox(1)] << Find Seg(LineSeg(1));
xs = ls << Get X Values;
ys = ls << Get y Values;
Eval(EvalExpr(
Report(gb)[FrameBox(1)] << Add Graphics Script(
Line(Expr(xs), Expr(ys));
)
));
);
//biv << close window;

