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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8a799e4a46726580878537ac459dfcf49da77b94
4
- data.tar.gz: abc37c0a3ad0669e60e1974ccacbbc5001b208bf
3
+ metadata.gz: 10d8348dcf762525f6cc0f449812b2b944791eec
4
+ data.tar.gz: 0ad86361b857ea380ae2bbe04a8fc326e901dcbc
5
5
  SHA512:
6
- metadata.gz: 292c257928957bcc13b6dcbab17084784808225f5c4f3a01cbaa21101e6c0d268fde3f2ea5693674fc0450121781ce4fda1c27c1a53cfdc32ee7c71a122b0d99
7
- data.tar.gz: 4f038e3a64712bbee9b6a157b360a83abf308f1dc72adda9ed68ffd25600ffca57b4d357a2890bf79427e4671a85f8b4548bf5703867105d8b160a365be1a565
6
+ metadata.gz: 27b664f2c2c73a79dcc8d4facc2bac62b024bf4aaaf0fca6a8e7c5b76837c2832325cb88e42d5e11f2808cd2537d5d1ac4fead75023752c9c009f7e4c4ef5634
7
+ data.tar.gz: 0b2f5b6685a1cd995bc25cf3081bbcb393f91a96de0165dcc10e44cbc8fa38cdd134a14149e692454a7d884adffecb190d852f5bfcff01209a18556da160334f
data/.travis.yml CHANGED
@@ -1,4 +1,8 @@
1
+ sudo: false
1
2
  language: ruby
2
3
  rvm:
3
- - 2.3.0
4
+ - "2.1"
5
+ - "2.2"
4
6
  before_install: gem install bundler -v 1.11.2
7
+ script:
8
+ bundle exec rake test
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
- data[0...column_size-1].insert(0, [1] * row_size)
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 = Matrix.columns(normalize_theta(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 = Matrix.columns(normalize_theta(theta))
63
+ matrix_theta = matrix_theta(theta)
64
+ x = normalize ? normalized_matrix_x : matrix_x
52
65
  num_iters.times do
53
- matrix_theta -= (matrix_x.transpose * ((matrix_x * matrix_theta) - matrix_y)) * (alpha / data.training_example_size)
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
@@ -1,3 +1,3 @@
1
1
  module Uranai
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
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.0
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