-
Notifications
You must be signed in to change notification settings - Fork 0
/
niave.clj
32 lines (27 loc) · 1.13 KB
/
niave.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
(ns josh.meanings.initializations.niave
"A random initialization strategy for k means which lacks theoretical
guarantees on solution quality for any individual run, but which will
complete in O(n + k*d) time and only takes O(k*d) space."
(:require
[clojure.tools.logging :as log]
[josh.meanings.persistence :as persist]
[josh.meanings.initializations.utils :refer [centroids->dataset uniform-sample]]
[josh.meanings.specs :as specs]
[clojure.spec.alpha :as s]
[clojure.test :refer [is]])
(:use
[josh.meanings.initializations.core]))
;; Specs used in this file
(def t-config :josh.meanings.specs/configuration)
(def t-dataset :josh.meanings.specs/dataset)
(s/fdef niave-initialization :args (s/cat :config t-config) :ret t-dataset)
(defn- niave-initialization [config]
{:pre [(is (s/valid? t-config config))] :post [(is (s/valid? t-dataset %))]}
(log/info "Performing classical (naive) k means initialization")
(centroids->dataset
config
(uniform-sample (persist/read-dataset-seq config :points) (:k config))))
(defmethod initialize-centroids
:niave
[k-means-state]
(niave-initialization k-means-state))