# Design Script - Imperative kmeans

After the Dynamo teams persentation today on design script I got energized and dove back into Dynamo’s Imperative functions. I have had the goal for a few years to get Kmean to work in Design script with no luck. I got a bit closer today but still confused and not even sure if it is even possible.

Attached is the .dyn with the required function. How to inbed them into a while loop is the question?!?

Kmean (Python) explanation : CS221

Kmeans.dyn (54.0 KB)

2 Likes

@Vikram_Subbaiah?
Good persentation today, thanks for the inspration!

2 Likes

Great with your descriptions in dynamo .

Replication guides don’t work within Imperative blocks.
You could however create an associative function that does the needful and call it within the imperative block

2 Likes

See if this is adequate. Not complete though.

Kmeans-20210910-1.dyn (24.7 KB)

``````// 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;
};
``````
7 Likes

Thanks @Vikram_Subbaiah!! What version of Dynamo did you use?
I open your script using Dynamo 2.6.1 and got one large cluster. I’ll be taking a closer look this weekend.

Dose this function make the Centroids?

1 Like

Try this new look daily build
I’ve used a csv file (change attached txt extension to csv) instead of Remember
Kmeans-20210910-2.dyn (16.0 KB)
pnts.txt (218.9 KB)

Yes.

2 Likes

sexy

Looks fancy the new look… does it comes with next update for revit as well??

Ooh this is interesting. I was just looking at K Means for image segmentation…
Did you ever use it to group by color?
(Im researching ways to find all the ‘empty’ space in a view).