Skip to content

Commit 4c89ee7

Browse files
committed
modify code style
1 parent 26635aa commit 4c89ee7

9 files changed

Lines changed: 60 additions & 80 deletions

File tree

lib/learn_kit/knn.ex

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,7 @@ defmodule LearnKit.Knn do
2727
@spec new() :: %Knn{data_set: []}
2828

2929
def new do
30-
[]
31-
|> Knn.new
30+
Knn.new([])
3231
end
3332

3433
@doc """

lib/learn_kit/knn/classify.ex

Lines changed: 15 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

lib/learn_kit/math.ex

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,7 @@ defmodule LearnKit.Math do
6363

6464
def variance(list) when is_list(list) do
6565
list_mean = mean(list)
66-
list
67-
|> variance(list_mean)
66+
variance(list, list_mean)
6867
end
6968

7069
@doc """
@@ -81,7 +80,7 @@ defmodule LearnKit.Math do
8180
def variance(list, list_mean) when is_list(list) do
8281
list
8382
|> Enum.map(fn x -> :math.pow(list_mean - x, 2) end)
84-
|> mean
83+
|> mean()
8584
end
8685

8786
@doc """
@@ -102,8 +101,8 @@ defmodule LearnKit.Math do
102101

103102
def standard_deviation(list) when is_list(list) do
104103
list
105-
|> variance
106-
|> :math.sqrt
104+
|> variance()
105+
|> :math.sqrt()
107106
end
108107

109108
@doc """
@@ -118,8 +117,7 @@ defmodule LearnKit.Math do
118117
@spec standard_deviation_from_variance(number) :: number
119118

120119
def standard_deviation_from_variance(list_variance) do
121-
list_variance
122-
|> :math.sqrt
120+
:math.sqrt(list_variance)
123121
end
124122

125123
@doc """
@@ -157,8 +155,7 @@ defmodule LearnKit.Math do
157155
@spec scalar_multiply(integer, list) :: list
158156

159157
def scalar_multiply(multiplicator, list) when is_list(list) do
160-
list
161-
|> Enum.map(fn x -> x * multiplicator end)
158+
Enum.map(list, fn x -> x * multiplicator end)
162159
end
163160

164161
@doc """
@@ -229,8 +226,8 @@ defmodule LearnKit.Math do
229226
mean_y = mean(y)
230227

231228
divider = Enum.zip(x, y) |> Enum.reduce(0, fn {xi, yi}, acc -> acc + (xi - mean_x) * (yi - mean_y) end)
232-
denom_x = x |> Enum.reduce(0, fn xi, acc -> acc + :math.pow(xi - mean_x, 2) end)
233-
denom_y = y |> Enum.reduce(0, fn yi, acc -> acc + :math.pow(yi - mean_y, 2) end)
229+
denom_x = Enum.reduce(x, 0, fn xi, acc -> acc + :math.pow(xi - mean_x, 2) end)
230+
denom_y = Enum.reduce(y, 0, fn yi, acc -> acc + :math.pow(yi - mean_y, 2) end)
234231

235232
divider / :math.sqrt(denom_x * denom_y)
236233
end

lib/learn_kit/naive_bayes/gaussian.ex

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,7 @@ defmodule LearnKit.NaiveBayes.Gaussian do
3434
@spec new() :: %Gaussian{data_set: []}
3535

3636
def new do
37-
[]
38-
|> Gaussian.new
37+
Gaussian.new([])
3938
end
4039

4140
@doc """
@@ -122,7 +121,7 @@ defmodule LearnKit.NaiveBayes.Gaussian do
122121
@spec predict_proba(%Gaussian{fit_data: fit_data}, feature) :: {:ok, predictions}
123122

124123
def predict_proba(%Gaussian{fit_data: fit_data}, feature) do
125-
result = fit_data |> classify_data(feature)
124+
result = classify_data(fit_data, feature)
126125
{:ok, result}
127126
end
128127

@@ -162,7 +161,7 @@ defmodule LearnKit.NaiveBayes.Gaussian do
162161
@spec score(%Gaussian{data_set: data_set, fit_data: fit_data}) :: {:ok, number}
163162

164163
def score(%Gaussian{data_set: data_set, fit_data: fit_data}) do
165-
result = fit_data |> calc_score(data_set)
164+
result = calc_score(fit_data, data_set)
166165
{:ok, result}
167166
end
168167
end

lib/learn_kit/naive_bayes/gaussian/classify.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ defmodule LearnKit.NaiveBayes.Gaussian.Classify do
77
# classify data
88
# returns data like [label1: 0.03592747361085857, label2: 0.00399309643713954]
99
defp classify_data(fit_data, feature) do
10-
labels_count = fit_data |> Keyword.keys |> length
10+
labels_count = fit_data |> Keyword.keys() |> length()
1111
fit_data
1212
|> Enum.map(fn {label, fit_results} ->
1313
{label, class_probability(labels_count, feature, fit_results)}

lib/learn_kit/naive_bayes/gaussian/fit.ex

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,21 @@ defmodule LearnKit.NaiveBayes.Gaussian.Fit do
88
defmacro __using__(_opts) do
99
quote do
1010
defp fit_data(data_set) do
11-
data_set
12-
|> Enum.map(fn {key, value} ->
11+
Enum.map(data_set, fn {key, value} ->
1312
{key, calc_features(value)}
1413
end)
1514
end
1615

1716
defp calc_features(features) do
1817
features
19-
|> Math.transpose
20-
|> Enum.map(fn feature ->
21-
mean = Math.mean(feature)
22-
variance = Math.variance(feature, mean)
18+
|> Math.transpose()
19+
|> calc_combination()
20+
end
21+
22+
defp calc_combination(combinations) do
23+
Enum.map(combinations, fn combination ->
24+
mean = Math.mean(combination)
25+
variance = Math.variance(combination, mean)
2326
standard_deviation = Math.standard_deviation_from_variance(variance)
2427
%{mean: mean, variance: variance, standard_deviation: standard_deviation}
2528
end)

lib/learn_kit/naive_bayes/gaussian/score.ex

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,16 @@ defmodule LearnKit.NaiveBayes.Gaussian.Score do
1111
defp calc_score(fit_data, data_set) do
1212
data_set
1313
|> Enum.map(fn {label, features} ->
14-
features
15-
|> check_features(fit_data, label)
14+
check_features(features, fit_data, label)
1615
end)
17-
|> List.flatten
18-
|> Math.mean
16+
|> List.flatten()
17+
|> Math.mean()
1918
|> Float.ceil(6)
2019
end
2120

2221
defp check_features(features, fit_data, label) do
23-
features
24-
|> Enum.map(fn feature ->
25-
feature
26-
|> check_feature(fit_data, label)
22+
Enum.map(features, fn feature ->
23+
check_feature(feature, fit_data, label)
2724
end)
2825
end
2926

lib/learn_kit/regression/linear.ex

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,10 @@ defmodule LearnKit.Regression.Linear do
8080
@spec fit(%Linear{factors: factors, results: results}) :: %Linear{factors: factors, results: results, coefficients: coefficients}
8181

8282
def fit(%Linear{factors: factors, results: results}, options \\ []) do
83-
coefficients = Keyword.merge([method: ""], options)
84-
|> define_method_for_fit
85-
|> fit_data(factors, results)
83+
coefficients =
84+
Keyword.merge([method: ""], options)
85+
|> define_method_for_fit()
86+
|> fit_data(factors, results)
8687
%Linear{factors: factors, results: results, coefficients: coefficients}
8788
end
8889

@@ -110,7 +111,7 @@ defmodule LearnKit.Regression.Linear do
110111
@spec predict(%Linear{coefficients: coefficients}, list) :: {:ok, list}
111112

112113
def predict(%Linear{coefficients: coefficients}, samples) do
113-
result = samples |> Enum.map(fn sample -> predict_sample(sample, coefficients) end)
114+
result = Enum.map(samples, fn sample -> predict_sample(sample, coefficients) end)
114115
{:ok, result}
115116
end
116117

lib/learn_kit/regression/linear/calculations.ex

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,7 @@ defmodule LearnKit.Regression.Linear.Calculations do
2929

3030
defp total_sum_of_squares(list) do
3131
mean_list = Math.mean(list)
32-
list
33-
|> Enum.reduce(0, fn x, acc -> acc + :math.pow(x - mean_list, 2) end)
32+
Enum.reduce(list, 0, fn x, acc -> acc + :math.pow(x - mean_list, 2) end)
3433
end
3534

3635
defp sum_of_squared_errors(coefficients, factors, results) do
@@ -45,7 +44,7 @@ defmodule LearnKit.Regression.Linear.Calculations do
4544
end
4645

4746
defp squared_error_gradient(coefficients, x, y) do
48-
error_variable = coefficients |> prediction_error(x, y)
47+
error_variable = prediction_error(coefficients, x, y)
4948
[
5049
-2 * error_variable,
5150
-2 * error_variable * x
@@ -64,22 +63,24 @@ defmodule LearnKit.Regression.Linear.Calculations do
6463
min_value,
6564
iterations_with_no_improvement,
6665
alpha
67-
] = data |> check_value(min_value, theta, min_theta, iterations_with_no_improvement, alpha)
68-
69-
theta = data
70-
|> Enum.shuffle
71-
|> Enum.reduce(theta, fn {xi, yi}, acc ->
72-
gradient_i = squared_error_gradient(acc, xi, yi)
73-
acc |> Math.vector_subtraction(alpha |> Math.scalar_multiply(gradient_i))
74-
end)
66+
] = check_value(data, min_value, theta, min_theta, iterations_with_no_improvement, alpha)
67+
68+
theta =
69+
data
70+
|> Enum.shuffle()
71+
|> Enum.reduce(theta, fn {xi, yi}, acc ->
72+
gradient_i = squared_error_gradient(acc, xi, yi)
73+
acc |> Math.vector_subtraction(alpha |> Math.scalar_multiply(gradient_i))
74+
end)
7575
gradient_descent_iteration(theta, alpha, min_theta, min_value, data, iterations_with_no_improvement)
7676
end
7777

7878
defp check_value(data, min_value, theta, min_theta, iterations_with_no_improvement, alpha) do
79-
value = data |> Enum.reduce(0, fn {xi, yi}, acc -> acc + squared_prediction_error(theta, xi, yi) end)
79+
value = Enum.reduce(data, 0, fn {xi, yi}, acc -> acc + squared_prediction_error(theta, xi, yi) end)
8080
cond do
8181
value < min_value ->
8282
[theta, value, 0, 0.0001]
83+
8384
true ->
8485
[min_theta, min_value, iterations_with_no_improvement + 1, alpha * 0.9]
8586
end

0 commit comments

Comments
 (0)