tag:blogger.com,1999:blog-7056990295646173627.post7203270956497988578..comments2022-12-03T16:26:38.645+00:00Comments on Learning Clojure: K-means : An Algorithm for Clustering DataJohn Lawrence Aspdenhttp://www.blogger.com/profile/02587130870181071109noreply@blogger.comBlogger1125tag:blogger.com,1999:blog-7056990295646173627.post-71233458238279296652015-10-30T09:59:03.290+00:002015-10-30T09:59:03.290+00:00Hello John,
Thank you for this post.
Your code po...Hello John, <br />Thank you for this post.<br />Your code ported to scala<br /><br />object KMeans {<br /> /**<br /> * K-means is a Clustering Algorithm.<br /> * <br /> * distance - how far one number is from another<br /> * average - an average of a group of points<br /> * max_iterations - max number of iterations <br /> * initial_means - start with some guesses about where the clusters are<br /> * data - cluster these points<br /> */<br /> def execute(distance : (Int, Int) => Int, <br /> average : (List[Int]) => Int ,<br /> max_iterations : Int,<br /> initial_means : List[Int],<br /> data : List[Int]) : List[Int] = {<br /> <br /> val closest = (point : Int, means : List[Int], dist : (Int, Int) => Int) <br /> => means.sortBy(x => dist(x, point)).head<br /> <br /> val point_groups = (means : List[Int], adata : List[Int], dist : (Int, Int) => Int) <br /> => adata.groupBy(x => closest(x, means, dist))<br /> <br /> val new_means = (ave : List[Int] => Int, point_groups : Map[Int, List[Int]], old_means : List[Int]) <br /> => for (om <- old_means if point_groups.contains(om)) yield ave(point_groups.get(om).get)<br /> <br /> val iterate_means = (data : List[Int], fn_dist : (Int, Int) => Int, fn_average : List[Int] => Int) <br /> => (means : List[Int]) => new_means(fn_average, point_groups(means, data, fn_dist), means)<br /> <br /> val iterate_means_fn = iterate_means(data, distance, average)<br /> <br /> val means = Stream.iterate(initial_means)(iterate_means_fn)<br /> means.zip(means.tail).takeWhile { case (t1, t2) => t1 != t2 }.take(max_iterations).last._2<br /> } <br />}<br /><br />object BootApp extends App {<br /> <br /> // execute clustering algorithm and print the result <br /> KMeans.execute(<br /> { case (a, b) => Math.abs(a-b) },<br /> { case l => l.sum / l.size }, <br /> 100, <br /> List[Int](0, 10), <br /> List(2, 3, 5, 6, 10, 11, 100, 101, 102)) foreach println<br />}<br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br />chernhttps://www.blogger.com/profile/02221462939463545182noreply@blogger.com