linear-regression 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: be7ede767c9e42da21e84dfcde225962a65b33c4
4
- data.tar.gz: e4468fc7c026a3517f75626d6c3521e215e42307
3
+ metadata.gz: 60dea3f33c89cc9e8c6fa2d5c2a4a0f3672c58d5
4
+ data.tar.gz: 6b6d65500b239519bba094b02c6eb9b87aec00fb
5
5
  SHA512:
6
- metadata.gz: 46819763f4306dbd5734890dbbdcb2151aa0bd222c5dd32d0afd17f7544cab4d70f02e033ba377ca24ebae5695561e30658baadacb06f5d75c40471a30409dfb
7
- data.tar.gz: 22e14c6f10bb0c9581b80d4a082ddc6a8b199dc2c3b321c3ce11d0149b749a9c1cc4abe2a640081a24bffd404c046d8e56165152ae6bc6b0f89270339f213e8d
6
+ metadata.gz: 39e673708c0d3b295012b7d1ce43615213a71439addd55133ea884a3c8f8c713b4da5fb1ce628d3f155e964ccbac2ef0a5fcb1d6a5cf0ea6dc7e810eeb325d99
7
+ data.tar.gz: 2bc0bcc477a7ab3d859586c9aece09eb615af565864590e0ccfa1ad78820f926208180562df4158a2259f1e24af059862b35f6a278f8c34c70099826afb942e1
@@ -1,86 +1,3 @@
1
- module Regression
2
- class Linear
3
- # Expected value
4
- # http://en.wikipedia.org/wiki/Expected_value
5
- def ev(items)
6
- raise "Items must be an array" unless items.is_a?(Array)
7
-
8
- items.inject(0) {|sum, x| sum + x}.to_f / items.length
9
- end
10
-
11
- # Covariance
12
- # http://en.wikipedia.org/wiki/Covariance
13
- def cov(xs, ys)
14
- raise "Length xs and ys must be equal" unless xs.length == ys.length
15
-
16
- xys = (0..(xs.length-1)).map{|i| xs[i] * ys[i]}
17
- ev(xys) - ev(xs)*ev(ys)
18
- end
19
-
20
- # Another way to implement covariance
21
- def cov2(xs, ys)
22
- raise "Length xs and ys must be equal" unless xs.length == ys.length
23
-
24
- len = xs.length
25
- sum = 0
26
- ev_x = ev(xs)
27
- ev_y = ev(ys)
28
-
29
- 0.upto(len - 1) do |i|
30
- sum += (xs[i].to_f - ev_x) * (ys[i].to_f - ev_y)
31
- end
32
- sum / len
33
- end
34
-
35
-
36
- # Variance
37
- # http://en.wikipedia.org/wiki/Variance
38
- def var(items)
39
- raise "Items must be an array" unless items.is_a?(Array)
40
-
41
- ev(items.map{|i| i**2}) - ev(items)**2
42
- end
43
-
44
- # Standard Deviation
45
- # http://en.wikipedia.org/wiki/Standard_deviation
46
- def stdev(items)
47
- raise "Items must be an array" unless items.is_a?(Array)
48
-
49
- Math.sqrt(var(items))
50
- end
51
-
52
- # Pearson product-moment correlation coefficient
53
- # http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient
54
- def pcc(xs, ys)
55
- raise "Length xs and ys must be equal" unless xs.length == ys.length
56
-
57
- cov(xs, ys) / (stdev(xs).to_f * stdev(ys).to_f)
58
- end
59
-
60
- # Spearman's rank correlation coefficient
61
- # http://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient
62
- def scc(xs, ys)
63
- raise "Length xs and ys must be equal" unless xs.length == ys.length
64
-
65
- len = xs.length
66
- sum = 0.0
67
- (0..(len-1)).each do |i|
68
- sum += (xs[i] - ys[i]) ** 2
69
- end
70
-
71
- 1 - (6 * sum)/(len * (len - 1))
72
- end
73
-
74
- # y = kx + b
75
- def k(xs, ys)
76
- raise "Length xs and ys must be equal" unless xs.length == ys.length
77
-
78
- cov(xs, ys) / var(xs)
79
- end
80
-
81
- # y = kx + b
82
- def b(xs, ys)
83
- ev(ys) - k(xs, ys) * ev(xs)
84
- end
85
- end
86
- end
1
+ require 'linear-regression/base'
2
+ require 'linear-regression/correlation_coefficient'
3
+ require 'linear-regression/linear'
@@ -0,0 +1,46 @@
1
+ module Regression
2
+ class Base
3
+ # Expected value
4
+ # http://en.wikipedia.org/wiki/mean
5
+ def mean(values)
6
+ raise "values must be an array" unless values.is_a?(Array)
7
+
8
+ values.inject(0) {|sum, x| sum + x}.to_f / values.length
9
+ end
10
+
11
+ # Covariance
12
+ # http://en.wikipedia.org/wiki/Covariance
13
+ def covariance(xs, ys)
14
+ raise "Length xs and ys must be equal" unless xs.length == ys.length
15
+
16
+ xys = xs.zip(ys).map{|x,y| x * y }
17
+ mean(xys) - mean(xs) * mean(ys)
18
+ end
19
+
20
+ # Another way to implement covariance
21
+ def covariance2(xs, ys)
22
+ raise "Length xs and ys must be equal" unless xs.length == ys.length
23
+
24
+ ev_x, ev_y = mean(xs), mean(ys)
25
+ xs.zip(ys)
26
+ .map{|x,y| (x-ev_x) * (y-ev_y)}
27
+ .inject(0) {|sum, x| sum += x} / xs.length
28
+ end
29
+
30
+ # Variance
31
+ # http://en.wikipedia.org/wiki/Variance
32
+ def variance(values)
33
+ raise "Values must be an array" unless values.is_a?(Array)
34
+
35
+ mean(values.map{|i| i**2}) - mean(values)**2
36
+ end
37
+
38
+ # Standard Deviation
39
+ # http://en.wikipedia.org/wiki/Standard_deviation
40
+ def standard_deviation(values)
41
+ raise "Values must be an array" unless values.is_a?(Array)
42
+
43
+ Math.sqrt(variance(values))
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,34 @@
1
+ module Regression
2
+ class CorrelationCoefficient < Base
3
+ def initialize(xs, ys)
4
+ raise "Length xs and ys must be equal" unless xs.length == ys.length
5
+
6
+ @xs = xs
7
+ @ys = ys
8
+ end
9
+
10
+
11
+ # Pearson product-moment correlation coefficient
12
+ # http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient
13
+ def pearson
14
+ @pearson ||= covariance(@xs, @ys) / (standard_deviation(@xs).to_f * standard_deviation(@ys).to_f)
15
+ end
16
+
17
+ # Spearman's rank correlation coefficient
18
+ # http://en.wikipedia.org/wiki/Spearman%27s_rank_correlation_coefficient
19
+ def spearman
20
+ @spearman ||= calc_spearman
21
+ end
22
+
23
+ private
24
+ def calc_spearman
25
+ len, sum = xs.length, 0.0
26
+
27
+ sum = xs.zip(ys)
28
+ .map{|x, y| (x - y) ** 2}
29
+ .inject(0.0) {|sum, x| sum += x}
30
+
31
+ 1 - (6 * sum)/(len * (len - 1))
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,28 @@
1
+ module Regression
2
+ class Linear < Base
3
+ def initialize(xs, ys)
4
+ abort "Length xs and ys must be equal" unless xs.length == ys.length
5
+
6
+ @xs = xs
7
+ @ys = ys
8
+ end
9
+
10
+ def trend
11
+ @xs.map{|x| predict x}
12
+ end
13
+
14
+ def predict(x)
15
+ y = slope * x + intercept
16
+ end
17
+
18
+ # y = kx + b
19
+ def slope
20
+ @slope ||= covariance(@xs, @ys) / variance(@xs)
21
+ end
22
+
23
+ # y = kx + b
24
+ def intercept
25
+ @intercept ||= mean(@ys) - slope * mean(@xs)
26
+ end
27
+ end
28
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: linear-regression
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Vladimir Alekseichenko
@@ -17,6 +17,9 @@ extensions: []
17
17
  extra_rdoc_files: []
18
18
  files:
19
19
  - lib/linear-regression.rb
20
+ - lib/linear-regression/base.rb
21
+ - lib/linear-regression/correlation_coefficient.rb
22
+ - lib/linear-regression/linear.rb
20
23
  homepage: https://github.com/slon1024/linear-regression
21
24
  licenses:
22
25
  - MIT