(ns code.learners.kmeans.k_means_model (:use (code.utils utils folds)) (:use (incanter core))) (def CLUSTERS []) (defn Membership [centroids one dist] (let [distances (loop [cent centroids results (transient [])] (if (empty? cent) (persistent! results) (recur (rest cent) (conj! results (vector (first cent) (dist (first cent) one)))))) closest-centroid (first (first (sort-by second distances)))] [one closest-centroid])) (defn MakeClusters [centroids dataset dist] (let [members (loop [data dataset results (transient [])] (if (empty? data) (persistent! results) (recur (rest data) (conj! results (Membership centroids (first data) dist)))))] (loop [cent centroids results (transient [])] (if (empty? cent) (apply vector (remove #(= nil %) (persistent! results))) (recur (rest cent) (conj! results (matrix (map first (apply vector (filter #(= (first cent) (second %)) members)))))))))) (defn k-means [centroids dataset dist] (loop [C centroids] (let [clusters (MakeClusters centroids dataset dist) new-centroids (map centroid clusters)] (if (= new-centroids C) clusters (recur new-centroids))))) (defn k-means-model [k D dist] (let [clusters (k-means (take k D) D dist)] clusters))