@@ -9,11 +9,11 @@ defmodule LearnKit.Knn.Classify do
99 quote do
1010 defp prediction ( data_set , options ) do
1111 calc_distances_for_features ( data_set , options )
12- |> sort_distances
12+ |> sort_distances ( )
1313 |> select_closest_features ( options )
1414 |> calc_feature_weights ( options )
15- |> define_weight_of_labels
16- |> sort_result
15+ |> accumulate_weight_of_labels ( [ ] )
16+ |> sort_result ( )
1717 end
1818
1919 # select algorithm for prediction
@@ -25,45 +25,35 @@ defmodule LearnKit.Knn.Classify do
2525 end
2626
2727 defp sort_distances ( features ) do
28- features
29- |> Enum . sort ( & ( elem ( & 1 , 0 ) <= elem ( & 2 , 0 ) ) )
28+ Enum . sort ( features , & ( elem ( & 1 , 0 ) <= elem ( & 2 , 0 ) ) )
3029 end
3130
3231 defp select_closest_features ( features , options ) do
33- features
34- |> Enum . take ( Keyword . get ( options , :k ) )
32+ Enum . take ( features , Keyword . get ( options , :k ) )
3533 end
3634
3735 defp calc_feature_weights ( features , options ) do
38- features
39- |> Enum . map ( fn feature ->
40- feature
41- |> Tuple . append ( calc_feature_weight ( Keyword . get ( options , :weight ) , elem ( feature , 0 ) ) )
36+ Enum . map ( features , fn feature ->
37+ Tuple . append ( feature , calc_feature_weight ( Keyword . get ( options , :weight ) , elem ( feature , 0 ) ) )
4238 end )
4339 end
4440
45- defp define_weight_of_labels ( features ) do
46- features
47- |> accumulate_weight_of_labels ( [ ] )
48- end
49-
5041 defp sort_result ( features ) do
5142 features
5243 |> Enum . sort ( & ( elem ( & 1 , 1 ) >= elem ( & 2 , 1 ) ) )
53- |> List . first
44+ |> List . first ( )
5445 end
5546
5647 # brute algorithm for prediction
5748 defp brute_algorithm ( data_set , options ) do
5849 data_set
59- |> Keyword . keys
50+ |> Keyword . keys ( )
6051 |> handle_features_in_label ( data_set , Keyword . get ( options , :feature ) )
61- |> List . flatten
52+ |> List . flatten ( )
6253 end
6354
6455 defp handle_features_in_label ( keys , data_set , current_feature ) do
65- keys
66- |> Enum . map ( fn key ->
56+ Enum . map ( keys , fn key ->
6757 data_set
6858 |> Keyword . get ( key )
6959 |> filter_features_by_size ( current_feature )
@@ -72,25 +62,19 @@ defmodule LearnKit.Knn.Classify do
7262 end
7363
7464 defp filter_features_by_size ( features , current_feature ) do
75- features
76- |> Enum . filter ( fn feature ->
65+ Enum . filter ( features , fn feature ->
7766 length ( feature ) == length ( current_feature )
7867 end )
7968 end
8069
8170 defp calc_distances_in_label ( features , current_feature , key ) do
82- features
83- |> Enum . reduce ( [ ] , fn feature , acc ->
84- distance = feature |> calc_distance_between_features ( current_feature )
71+ Enum . reduce ( features , [ ] , fn feature , acc ->
72+ distance = calc_distance_between_points ( 0 , feature , current_feature , 0 , length ( feature ) - 1 )
8573 if distance == 0 , do: raise "Feature exists in train data set with label #{ key } "
8674 acc = [ { distance , key } | acc ]
8775 end )
8876 end
8977
90- defp calc_distance_between_features ( feature_from_data_set , feature ) do
91- calc_distance_between_points ( 0 , feature_from_data_set , feature , 0 , length ( feature_from_data_set ) - 1 )
92- end
93-
9478 defp calc_distance_between_points ( acc , feature_from_data_set , feature , current_index , size ) when current_index <= size do
9579 Enum . at ( feature_from_data_set , current_index ) - Enum . at ( feature , current_index )
9680 |> :math . pow ( 2 )
@@ -99,8 +83,7 @@ defmodule LearnKit.Knn.Classify do
9983 end
10084
10185 defp calc_distance_between_points ( acc , _ , _ , _ , _ ) do
102- acc
103- |> :math . sqrt
86+ :math . sqrt ( acc )
10487 end
10588
10689 defp calc_feature_weight ( weight , distance ) do
0 commit comments