(ns code.learners.kmeans.k_means_classifier (:use (code.utils utils)) (:use (incanter core))) ;return nearest cluster (defn find-nearest-cluster [one clusters dist] (let [cluster-centroids (map #(centroid %) clusters) cluster-w-centroids (map #(vector %1 %2) cluster-centroids clusters) nearest-cluster-centroid (second (first (sort-by first (map #(vector (dist one %) %) cluster-centroids)))) nearest-cluster (second (first (filter #(= nearest-cluster-centroid (first %)) cluster-w-centroids)))] nearest-cluster)) ;classify one test (defn k-means-classifier [one clusters dist] (let [nearest-cluster (find-nearest-cluster one clusters dist)] (if (= (nrow nearest-cluster) 1) (last nearest-cluster) (let [kn (+ 1 (int (Math/sqrt (nrow nearest-cluster)))) k-nearest (map second (take kn (sort-by first (map #(vector (dist one %) %) nearest-cluster)))) klass (last (Transpose k-nearest)) classification (k-majority klass)] classification))))