general filters refactoring- mostly DRYing stuff up

This commit is contained in:
Ben Mabey 2010-10-29 16:57:20 -06:00
parent 497d65dffc
commit 51fc383c15
2 changed files with 52 additions and 60 deletions

View file

@ -24,6 +24,7 @@
;; automatically
(def *filtered-ds* (make-apply-filter :remove-attributes {:attributes [0]} *ds*))"
(:use [clj-ml data utils])
(:require [clojure.contrib [string :as str]])
(:import (weka.filters Filter)))
@ -35,80 +36,72 @@
"Creates the right parameters for a filter"
(fn [kind map] kind))
(defn- extract-attributes
"Transforms the :attributes value from m into the appropriate weka flag"
[m]
["-R" (str/join "," (map inc (:attributes m)))])
(defn- into-string-array
"Returns an array of type String, even if aseq is empty."
[aseq]
(into-array String aseq))
(defmethod make-filter-options :supervised-discretize
([kind map]
(let [cols (get map :attributes)
pre-cols (reduce #(str %1 "," (+ %2 1)) "" cols)
cols-val-a ["-R" (.substring pre-cols 1 (.length pre-cols))]
cols-val-b (check-options {:invert "-V"
:binary "-D"
:better-encoding "-E"
:kononenko "-K"}
map
cols-val-a)]
(into-array cols-val-b))))
([kind m]
(->> (extract-attributes m)
(check-options {:invert "-V"
:binary "-D"
:better-encoding "-E"
:kononenko "-K"}
m)
into-string-array)))
(defmethod make-filter-options :unsupervised-discretize
([kind map]
(let [cols (get map :attributes)
pre-cols (reduce #(str %1 "," (+ %2 1)) "" cols)
cols-val-a ["-R" (.substring pre-cols 1 (.length pre-cols))]
cols-val-b (check-options {:unset-class "-unset-class-temporarily"
([kind m]
(->> (extract-attributes m)
(check-options {:unset-class "-unset-class-temporarily"
:binary "-D"
:better-encoding "-E"
:equal-frequency "-F"
:optimize "-O"}
map
cols-val-a)
cols-val-c (check-option-values {:number-bins "-B"
:weight-bins "-M"}
map
cols-val-b)]
(into-array cols-val-c))))
m)
(check-option-values {:number-bins "-B"
:weight-bins "-M"}
m)
into-string-array)))
(defmethod make-filter-options :supervised-nominal-to-binary
([kind map]
(let [cols-val (check-options {:also-binary "-N"
:for-each-nominal "-A"}
map
[""])]
(into-array cols-val))))
([kind m]
(->>
(check-options {:also-binary "-N"
:for-each-nominal "-A"}
m)
into-string-array)))
(defmethod make-filter-options :unsupervised-nominal-to-binary
([kind map]
(let [cols (get map :attributes)
pre-cols (reduce #(str %1 "," (+ %2 1)) "" cols)
cols-val-a ["-R" (.substring pre-cols 1 (.length pre-cols))]
cols-val-b (check-options {:invert "-V"
:also-binary "-N"
:for-each-nominal "-A"}
map
cols-val-a)]
(into-array cols-val-b))))
([kind m]
(->> (extract-attributes m)
(check-options {:invert "-V"
:also-binary "-N"
:for-each-nominal "-A"}
m)
into-string-array)))
(defmethod make-filter-options :remove-attributes
([kind map]
(let [cols (get map :attributes)
pre-cols (reduce #(str %1 "," (+ %2 1)) "" cols)
cols-val-a ["-R" (.substring pre-cols 1 (.length pre-cols))]
cols-val-b (check-options {:invert "-V"}
map
cols-val-a)]
(into-array cols-val-b))))
([kind m]
(->> (extract-attributes m)
(check-options {:invert "-V"} m)
into-string-array)))
(defmethod make-filter-options :remove-useless-attributes
([kind map]
(->> map (check-option-values {:max-variance "-M"}) into-array)))
([kind m]
(->> m (check-option-values {:max-variance "-M"}) into-string-array)))
(defmethod make-filter-options :select-append-attributes
([kind map]
(let [cols (get map :attributes)
pre-cols (reduce #(str %1 "," (+ %2 1)) "" cols)
cols-val-a ["-R" (.substring pre-cols 1 (.length pre-cols))]
cols-val-b (check-options {:invert "-V"}
map
cols-val-a)]
(into-array cols-val-b))))
([kind m]
(->> (extract-attributes m)
(check-options {:invert "-V"} m)
into-string-array)))
(defmethod make-filter-options :project-attributes
([kind options]

View file

@ -31,9 +31,8 @@
(deftest make-filter-options-supervised-nominal-to-binary
(let [options (make-filter-options :supervised-nominal-to-binary {:also-binary true :for-each-nominal true})]
(are [index expected-flag] (is (= (aget options index) expected-flag))
0 ""
1 "-N"
2 "-A")))
0 "-N"
1 "-A")))
(deftest make-filter-options-unsupervised-nominal-to-binary
(let [options (make-filter-options :unsupervised-nominal-to-binary {:attributes [1,2] :also-binary true :for-each-nominal true :invert true})]