@@ -7,49 +7,43 @@ defmodule LearnKit.Preprocessing.Normalize do
77
88 defmacro __using__ ( _opts ) do
99 quote do
10- defp minimax_normalization ( features ) do
10+ defp normalization ( features , type ) do
1111 features_by_index = Math . transpose ( features )
12- list_of_params =
13- features_by_index
14- |> Enum . map ( fn list ->
15- {
16- Enum . min ( list ) ,
17- Enum . max ( list )
18- }
19- end )
12+ list_of_params = Enum . map ( features_by_index , fn list -> return_params ( list , type ) end )
2013 features_by_index
2114 |> Enum . with_index ( )
22- |> Enum . map ( fn { feature , index } ->
23- params_for_point = Enum . at ( list_of_params , index )
24- range = elem ( params_for_point , 1 ) - elem ( params_for_point , 0 )
25- feature
26- |> Enum . map ( fn point ->
27- ( point - elem ( params_for_point , 0 ) ) / range
28- end )
29- end )
15+ |> Enum . map ( fn { feature , index } -> transform_feature ( feature , Enum . at ( list_of_params , index ) , type ) end )
3016 |> Math . transpose ( )
3117 end
3218
33- defp z_normalization ( features ) do
34- features_by_index = Math . transpose ( features )
35- list_of_params =
36- features_by_index
37- |> Enum . map ( fn list ->
38- {
39- Math . mean ( list ) ,
40- Math . standard_deviation ( list )
41- }
42- end )
43- features_by_index
44- |> Enum . with_index ( )
45- |> Enum . map ( fn { feature , index } ->
46- params_for_point = Enum . at ( list_of_params , index )
47- feature
48- |> Enum . map ( fn point ->
49- ( point - elem ( params_for_point , 0 ) ) / elem ( params_for_point , 1 )
50- end )
51- end )
52- |> Math . transpose ( )
19+ defp return_params ( list , "minimax" ) do
20+ {
21+ Enum . min ( list ) ,
22+ Enum . max ( list )
23+ }
24+ end
25+
26+ defp return_params ( list , "z_normalization" ) do
27+ {
28+ Math . mean ( list ) ,
29+ Math . standard_deviation ( list )
30+ }
31+ end
32+
33+ defp transform_feature ( feature , params_for_point , type ) do
34+ divider = define_divider ( params_for_point , type )
35+ case divider do
36+ 0 -> feature
37+ _ -> Enum . map ( feature , fn point -> ( point - elem ( params_for_point , 0 ) ) / divider end )
38+ end
39+ end
40+
41+ defp define_divider ( params_for_point , "minimax" ) do
42+ elem ( params_for_point , 1 ) - elem ( params_for_point , 0 )
43+ end
44+
45+ defp define_divider ( params_for_point , "z_normalization" ) do
46+ elem ( params_for_point , 1 )
5347 end
5448 end
5549 end
0 commit comments