uranai 0.1.0 → 0.1.1
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/.travis.yml +5 -1
- data/README.md +7 -0
- data/lib/uranai/data.rb +16 -1
- data/lib/uranai/feature_normalizer.rb +58 -0
- data/lib/uranai/linear_regression.rb +17 -3
- data/lib/uranai/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 10d8348dcf762525f6cc0f449812b2b944791eec
|
4
|
+
data.tar.gz: 0ad86361b857ea380ae2bbe04a8fc326e901dcbc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27b664f2c2c73a79dcc8d4facc2bac62b024bf4aaaf0fca6a8e7c5b76837c2832325cb88e42d5e11f2808cd2537d5d1ac4fead75023752c9c009f7e4c4ef5634
|
7
|
+
data.tar.gz: 0b2f5b6685a1cd995bc25cf3081bbcb393f91a96de0165dcc10e44cbc8fa38cdd134a14149e692454a7d884adffecb190d852f5bfcff01209a18556da160334f
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -45,3 +45,10 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
45
45
|
## Contributing
|
46
46
|
|
47
47
|
Bug reports and pull requests are welcome on GitHub at https://github.com/teerawat1992/uranai.
|
48
|
+
|
49
|
+
## TODO
|
50
|
+
|
51
|
+
- [x] Linear Regression
|
52
|
+
- [ ] Logistic Regression
|
53
|
+
- [ ] Neural Networks
|
54
|
+
- [ ] Support Vector Machines (SVMs)
|
data/lib/uranai/data.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "csv"
|
2
|
+
require "uranai/feature_normalizer"
|
2
3
|
|
3
4
|
module Uranai
|
4
5
|
class Data
|
@@ -20,13 +21,23 @@ module Uranai
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def x
|
23
|
-
|
24
|
+
raw_x.insert(0, [1] * row_size)
|
25
|
+
end
|
26
|
+
|
27
|
+
def normalized_x
|
28
|
+
FeatureNormalizer.new(raw_x)
|
29
|
+
.normalize
|
30
|
+
.insert(0, [1] * row_size)
|
24
31
|
end
|
25
32
|
|
26
33
|
def matrix_x
|
27
34
|
Matrix.columns(x)
|
28
35
|
end
|
29
36
|
|
37
|
+
def normalized_matrix_x
|
38
|
+
Matrix.columns(normalized_x)
|
39
|
+
end
|
40
|
+
|
30
41
|
def y
|
31
42
|
[data[-1]]
|
32
43
|
end
|
@@ -38,5 +49,9 @@ module Uranai
|
|
38
49
|
private
|
39
50
|
|
40
51
|
attr_reader :data
|
52
|
+
|
53
|
+
def raw_x
|
54
|
+
data[0...column_size-1]
|
55
|
+
end
|
41
56
|
end
|
42
57
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require "matrix"
|
2
|
+
|
3
|
+
module Uranai
|
4
|
+
class FeatureNormalizer
|
5
|
+
def initialize(feature)
|
6
|
+
@feature = feature
|
7
|
+
end
|
8
|
+
|
9
|
+
def normalize
|
10
|
+
(matrix_feature - matrix_mean)
|
11
|
+
.transpose
|
12
|
+
.to_a
|
13
|
+
.zip(std_of_each_feature)
|
14
|
+
.map do |arr|
|
15
|
+
arr[0].map { |ele| ele / arr[1] }
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
attr_reader :feature
|
22
|
+
|
23
|
+
def matrix_feature
|
24
|
+
Matrix.columns(feature)
|
25
|
+
end
|
26
|
+
|
27
|
+
def matrix_mean
|
28
|
+
mean = Array([mean_of_each_feature]) * feature_size
|
29
|
+
Matrix.rows(mean)
|
30
|
+
end
|
31
|
+
|
32
|
+
def mean_of_each_feature
|
33
|
+
feature.map { |arr| mean(arr) }
|
34
|
+
end
|
35
|
+
|
36
|
+
def std_of_each_feature
|
37
|
+
feature.map { |arr| std(arr) }
|
38
|
+
end
|
39
|
+
|
40
|
+
def feature_size
|
41
|
+
feature[0].length
|
42
|
+
end
|
43
|
+
|
44
|
+
def mean(arr)
|
45
|
+
arr.reduce(:+) / arr.length.to_f
|
46
|
+
end
|
47
|
+
|
48
|
+
def variance(arr)
|
49
|
+
mean = mean(arr)
|
50
|
+
sum = arr.inject(0.0) { |acc,i| acc + (i - mean)**2 }
|
51
|
+
sum / (arr.length - 1)
|
52
|
+
end
|
53
|
+
|
54
|
+
def std(arr)
|
55
|
+
Math.sqrt(variance(arr))
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -9,7 +9,7 @@ module Uranai
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def compute_cost(theta: default_theta)
|
12
|
-
matrix_theta =
|
12
|
+
matrix_theta = matrix_theta(theta)
|
13
13
|
((matrix_x * matrix_theta) - matrix_y)
|
14
14
|
.map { |element| element ** 2 }
|
15
15
|
.inject(0.0) { |sum,i| sum + i }
|
@@ -42,15 +42,29 @@ module Uranai
|
|
42
42
|
data.matrix_x
|
43
43
|
end
|
44
44
|
|
45
|
+
def normalized_matrix_x
|
46
|
+
data.normalized_matrix_x
|
47
|
+
end
|
48
|
+
|
45
49
|
def matrix_y
|
46
50
|
data.matrix_y
|
47
51
|
end
|
48
52
|
|
53
|
+
def matrix_theta(theta)
|
54
|
+
Matrix.columns(normalize_theta(theta))
|
55
|
+
end
|
56
|
+
|
57
|
+
def training_example_size
|
58
|
+
data.training_example_size
|
59
|
+
end
|
60
|
+
|
49
61
|
# TODO: Add an option for normalizing feature data (x data)
|
50
62
|
def gradient_descent(alpha: 0.01, num_iters: 1500, theta: default_theta, normalize: false)
|
51
|
-
matrix_theta =
|
63
|
+
matrix_theta = matrix_theta(theta)
|
64
|
+
x = normalize ? normalized_matrix_x : matrix_x
|
52
65
|
num_iters.times do
|
53
|
-
matrix_theta -=
|
66
|
+
matrix_theta -=
|
67
|
+
(x.transpose * ((x * matrix_theta) - matrix_y)) * (alpha / training_example_size)
|
54
68
|
end
|
55
69
|
matrix_theta.to_a.flatten
|
56
70
|
end
|
data/lib/uranai/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: uranai
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Teerawat Lamanchart
|
@@ -70,6 +70,7 @@ files:
|
|
70
70
|
- bin/setup
|
71
71
|
- lib/uranai.rb
|
72
72
|
- lib/uranai/data.rb
|
73
|
+
- lib/uranai/feature_normalizer.rb
|
73
74
|
- lib/uranai/fitting_parameter.rb
|
74
75
|
- lib/uranai/linear_regression.rb
|
75
76
|
- lib/uranai/version.rb
|