@@ -8,11 +8,21 @@ defmodule LearnKit.Regression.Linear.Calculations do
88 defmacro __using__ ( _opts ) do
99 quote do
1010 defp do_fit ( method , factors , results ) when method == "gradient descent" do
11- gradient_descent_iteration ( [ :rand . uniform , :rand . uniform ] , 0.0001 , nil , 1000000 , Enum . zip ( factors , results ) , 0 )
11+ gradient_descent_iteration (
12+ [ :rand . uniform ( ) , :rand . uniform ( ) ] ,
13+ 0.0001 ,
14+ nil ,
15+ 1_000_000 ,
16+ Enum . zip ( factors , results ) ,
17+ 0
18+ )
1219 end
1320
1421 defp do_fit ( _ , factors , results ) do
15- beta = Math . correlation ( factors , results ) * Math . standard_deviation ( results ) / Math . standard_deviation ( factors )
22+ beta =
23+ Math . correlation ( factors , results ) * Math . standard_deviation ( results ) /
24+ Math . standard_deviation ( factors )
25+
1626 alpha = Math . mean ( results ) - beta * Math . mean ( factors )
1727 [ alpha , beta ]
1828 end
@@ -24,7 +34,8 @@ defmodule LearnKit.Regression.Linear.Calculations do
2434 defp calculate_score ( [ ] , _ , _ ) , do: raise ( "There was no fit for model" )
2535
2636 defp calculate_score ( coefficients , factors , results ) do
27- 1.0 - sum_of_squared_errors ( coefficients , factors , results ) / total_sum_of_squares ( results )
37+ 1.0 -
38+ sum_of_squared_errors ( coefficients , factors , results ) / total_sum_of_squares ( results )
2839 end
2940
3041 defp total_sum_of_squares ( list ) do
@@ -34,7 +45,9 @@ defmodule LearnKit.Regression.Linear.Calculations do
3445
3546 defp sum_of_squared_errors ( coefficients , factors , results ) do
3647 Enum . zip ( factors , results )
37- |> Enum . reduce ( 0 , fn { xi , yi } , acc -> acc + squared_prediction_error ( coefficients , xi , yi ) end )
48+ |> Enum . reduce ( 0 , fn { xi , yi } , acc ->
49+ acc + squared_prediction_error ( coefficients , xi , yi )
50+ end )
3851 end
3952
4053 defp squared_prediction_error ( coefficients , x , y ) do
@@ -45,6 +58,7 @@ defmodule LearnKit.Regression.Linear.Calculations do
4558
4659 defp squared_error_gradient ( coefficients , x , y ) do
4760 error_variable = prediction_error ( coefficients , x , y )
61+
4862 [
4963 - 2 * error_variable ,
5064 - 2 * error_variable * x
@@ -55,9 +69,18 @@ defmodule LearnKit.Regression.Linear.Calculations do
5569 y - predict_sample ( x , coefficients )
5670 end
5771
58- defp gradient_descent_iteration ( _ , _ , min_theta , _ , _ , iterations_with_no_improvement ) when iterations_with_no_improvement >= 100 , do: min_theta
59-
60- defp gradient_descent_iteration ( theta , alpha , min_theta , min_value , data , iterations_with_no_improvement ) do
72+ defp gradient_descent_iteration ( _ , _ , min_theta , _ , _ , iterations_with_no_improvement )
73+ when iterations_with_no_improvement >= 100 ,
74+ do: min_theta
75+
76+ defp gradient_descent_iteration (
77+ theta ,
78+ alpha ,
79+ min_theta ,
80+ min_value ,
81+ data ,
82+ iterations_with_no_improvement
83+ ) do
6184 [
6285 min_theta ,
6386 min_value ,
@@ -72,11 +95,23 @@ defmodule LearnKit.Regression.Linear.Calculations do
7295 gradient_i = squared_error_gradient ( acc , xi , yi )
7396 acc |> Math . vector_subtraction ( alpha |> Math . scalar_multiply ( gradient_i ) )
7497 end )
75- gradient_descent_iteration ( theta , alpha , min_theta , min_value , data , iterations_with_no_improvement )
98+
99+ gradient_descent_iteration (
100+ theta ,
101+ alpha ,
102+ min_theta ,
103+ min_value ,
104+ data ,
105+ iterations_with_no_improvement
106+ )
76107 end
77108
78109 defp check_value ( data , min_value , theta , min_theta , iterations_with_no_improvement , alpha ) do
79- value = Enum . reduce ( data , 0 , fn { xi , yi } , acc -> acc + squared_prediction_error ( theta , xi , yi ) end )
110+ value =
111+ Enum . reduce ( data , 0 , fn { xi , yi } , acc ->
112+ acc + squared_prediction_error ( theta , xi , yi )
113+ end )
114+
80115 cond do
81116 value < min_value ->
82117 [ theta , value , 0 , 0.0001 ]
0 commit comments