ruby_linear_regression 0.0.2 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/ruby_linear_regression.rb +32 -1
- metadata +7 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cfebab034391389c2a317a1ab52e38657c7fa02b
|
4
|
+
data.tar.gz: 2846a47266a55f14e0c9ee42a61d36a9c40ac882
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88db7a42087da42fcc74cfd8363625269aace47110e7383a2b78add3756ee7599b648331186e583502d506eaa698f2e67006cda949217bbb19ba01dfe748dc7b
|
7
|
+
data.tar.gz: cbd925a7eb8f9a1f721c80c37ededd062f9ec885f353ab1425101ec481c268c534efa35958b7692321c3b96fc82dbd506b7093590ff7d987b6b3e5b9c6ac35aa
|
@@ -26,7 +26,7 @@ class RubyLinearRegression
|
|
26
26
|
@x = Matrix.rows( x_data )
|
27
27
|
@y = Matrix.rows( y_data.collect { |e| [e] } )
|
28
28
|
|
29
|
-
@theta = Matrix
|
29
|
+
@theta = Matrix.zero(@x.column_count, 1)
|
30
30
|
end
|
31
31
|
|
32
32
|
# Compute the mean squared cost / error function
|
@@ -52,6 +52,26 @@ class RubyLinearRegression
|
|
52
52
|
return @theta
|
53
53
|
end
|
54
54
|
|
55
|
+
# Calculate optimal theta using gradient descent
|
56
|
+
# Arguments:
|
57
|
+
# alpha: Learning rate
|
58
|
+
# iterations: Number of iterations to run gradient descent
|
59
|
+
# verbose: If true will output cost after each iteration, can be used to find optimal learning rate (alpha) and iteration
|
60
|
+
def train_gradient_descent( alpha = 0.01, iterations = 500, verbose = false )
|
61
|
+
|
62
|
+
0.upto( iterations ) do |i|
|
63
|
+
@temp_theta = Array.new(@theta.row_size)
|
64
|
+
0.upto(@theta.row_size-1) do |row|
|
65
|
+
@temp_theta[row] = @theta[row,0] - alpha * compute_gradient(row)
|
66
|
+
end
|
67
|
+
|
68
|
+
@theta = Matrix.columns([@temp_theta])
|
69
|
+
|
70
|
+
puts "Cost after #{i} iterations = #{compute_cost}" if verbose
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
55
75
|
# Makes a prediction based on your trained model.
|
56
76
|
# train_normal_equation must be called prior to making a prediction.
|
57
77
|
#
|
@@ -102,4 +122,15 @@ class RubyLinearRegression
|
|
102
122
|
|
103
123
|
end
|
104
124
|
|
125
|
+
# Compute the mean squared cost / error function
|
126
|
+
def compute_gradient( parameter )
|
127
|
+
|
128
|
+
# First use matrix multiplication and vector subtracton to find errors
|
129
|
+
gradients = ((@x * @theta) - @y).transpose * @x.column(parameter)
|
130
|
+
|
131
|
+
# Mean the grandient
|
132
|
+
mean = gradients.inject{ |sum, e| sum + e } / gradients.size
|
133
|
+
|
134
|
+
return mean
|
135
|
+
end
|
105
136
|
end
|
metadata
CHANGED
@@ -1,19 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_linear_regression
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Soren Blond Daugaard
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-13 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: "An implementation of a linear regression machine learning algorithm
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
in Ruby.\n This algorithm uses Ruby's Matrix implementation and the
|
15
|
+
normal equation to train the data to the best fit.\n The algorithm
|
16
|
+
works with one independent variable or as a multivariate linear regression with
|
17
|
+
multiple variables to predict a dependent variable. "
|
17
18
|
email: sbd@ineptum.dk
|
18
19
|
executables: []
|
19
20
|
extensions: []
|
@@ -40,7 +41,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
40
41
|
version: '0'
|
41
42
|
requirements: []
|
42
43
|
rubyforge_project:
|
43
|
-
rubygems_version: 2.6.
|
44
|
+
rubygems_version: 2.6.12
|
44
45
|
signing_key:
|
45
46
|
specification_version: 4
|
46
47
|
summary: Linear regression implemented in Ruby.
|