(defn cnn1 [D distance] (let [initial-prototypes (map first (map shuffle (group-by D (- (ncol D) 1)))) classify? (fn [one prototypes] (let [klass (last (first (first (sort-by second (map #(vector % (distance one %)) prototypes)))))] (if (= (last one) klass) false true))) get-prototypes (fn [prototypes] (loop [d D result []] (if (empty? d) (matrix (apply concat (conj [(apply vector (remove #(= 'none %) result))] prototypes))) (recur (rest d) (conj result (if (classify? (first d) prototypes) (first d) 'none))))))] (loop [cur initial-prototypes prev []] (if (= (nrow prev) (nrow cur)) cur (recur (get-prototypes cur) cur))))) (defn cnn [D distance] (let [initial-prototypes (map first (group-by D (- (ncol D) 1))) classify? (fn [one prototypes] (let [klass (last (first (first (sort-by second (map #(vector % (distance one %)) prototypes)))))] (if (= (last one) klass) false true))) get-prototypes (fn [prototypes] (loop [d D result []] (if (empty? d) (matrix (apply concat (conj [(apply vector (remove #(= 'none %) result))] prototypes))) (recur (rest d) (conj result (if (classify? (first d) prototypes) (first d) 'none))))))] (loop [cur initial-prototypes prev []] (if (= (nrow prev) (nrow cur)) cur (recur (get-prototypes cur) cur)))))