Copy // Group by Centroid
def k1(pnts:var[]..[],cnts:var[]..[])
{
//Labels
lbl1 = "A"..#(List.Count(cnts))..1;
//Distance to Centroids
dst1 = pnts<1>.DistanceTo(cnts<2>);
dst2 = List.SortByKey(lbl1,dst1<1>);
dst3 = List.FirstItem(dst2["sortedList"]<1>);
//Group by Closest to Centroid
pnt1 = List.GroupByKey(pnts,dst3)["groups"];
return pnt1;
};
// Centroid
def ctr (pnts:var[]..[])
{
return Point.ByCoordinates(Math.Average(pnts.X),
Math.Average(pnts.Y),Math.Average(pnts.Z));
};
// K Mean
def kMean (pnts:var[]..[],k:int)
{
pnt1 = k1(pnts,pnts[1..k]);
cnt1 = 1;
pnt2 = [];
pts1 = [Imperative]
{
while (cnt1 <= k)
{
ctr1 = ctr(pnt1);
pnt2 = k1(List.Flatten(pnt1,-1),ctr1);
cnt1 = cnt1 + 1;
pnt1 = pnt2;
}
return pnt2;
}
return pts1;
};