pca 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/pca.rb +20 -6
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 437676549bb33931b4565d105e4a73d5acfc1f35
|
4
|
+
data.tar.gz: da5c93ae3bcee85fa79a7aab62dc14d6da729856
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bce79847afa2af0cba8305a5eeeccaae29ae651dd9c26a9cef9154971e0680225e61801e179b769dd893544bc4b145b0fea8456cc159984ad882690665a08b13
|
7
|
+
data.tar.gz: a5b103e1813788e5235c04b7cc90cbee3141d9ec49bfb342a2ba0a7e1019307464b1ea65914b1254b70f274d9021aeb0980b7933323f0f9bf6ec4e2e163b4f2f
|
data/lib/pca.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'gsl'
|
2
2
|
|
3
3
|
class PCA
|
4
|
-
attr_reader :components, :singular_values, :mean, :explained_variance, :explained_variance_ratio
|
4
|
+
attr_reader :components, :singular_values, :mean, :std, :explained_variance, :explained_variance_ratio
|
5
5
|
|
6
6
|
def initialize opts = {}
|
7
7
|
@n_components = opts[:components]
|
8
|
+
@scale_data = opts[:scale_data]
|
8
9
|
end
|
9
10
|
|
10
11
|
def fit x
|
@@ -14,7 +15,7 @@ class PCA
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def transform x
|
17
|
-
x = prepare_data x,
|
18
|
+
x = prepare_data x, use_saved_mean_and_std: true
|
18
19
|
_transform x
|
19
20
|
end
|
20
21
|
|
@@ -26,7 +27,8 @@ class PCA
|
|
26
27
|
|
27
28
|
def inverse_transform x
|
28
29
|
x = ensure_matrix x
|
29
|
-
out = x * @components
|
30
|
+
out = x * @components
|
31
|
+
out.size2.times {|col| out.col(col).mul! @std[col] } if @scale_data
|
30
32
|
out.size2.times {|col| out.col(col).add! @mean[col] }
|
31
33
|
out
|
32
34
|
end
|
@@ -34,22 +36,26 @@ class PCA
|
|
34
36
|
private
|
35
37
|
def prepare_data x, opts = {}
|
36
38
|
x = ensure_matrix x
|
37
|
-
@mean = calculate_mean(x) unless opts[:
|
39
|
+
@mean = calculate_mean(x) unless opts[:use_saved_mean_and_std]
|
38
40
|
mean_normalize x
|
41
|
+
if @scale_data
|
42
|
+
@std = calculate_std(x) unless opts[:use_saved_mean_and_std]
|
43
|
+
scale(x)
|
44
|
+
end
|
39
45
|
x
|
40
46
|
end
|
41
47
|
|
42
48
|
def _fit x
|
43
49
|
covariance_matrix = (x.transpose * x) / x.size1
|
44
50
|
u, v, s = covariance_matrix.SV_decomp
|
45
|
-
@components = slice_n
|
51
|
+
@components = slice_n(u).transpose
|
46
52
|
@singular_values = slice_n s
|
47
53
|
@explained_variance = @singular_values**2 / x.size1
|
48
54
|
@explained_variance_ratio = @explained_variance / @explained_variance.sum
|
49
55
|
end
|
50
56
|
|
51
57
|
def _transform x
|
52
|
-
x * @components
|
58
|
+
x * @components.transpose
|
53
59
|
end
|
54
60
|
|
55
61
|
def ensure_matrix x
|
@@ -71,6 +77,14 @@ class PCA
|
|
71
77
|
x.size2.times {|col| x.col(col).sub! @mean[col] }
|
72
78
|
end
|
73
79
|
|
80
|
+
def calculate_std x
|
81
|
+
x.size2.times.map {|col| x.col(col).sd }
|
82
|
+
end
|
83
|
+
|
84
|
+
def scale x
|
85
|
+
x.size2.times {|col| x.col(col).div! @std[col] }
|
86
|
+
end
|
87
|
+
|
74
88
|
def slice_n x
|
75
89
|
return x unless @n_components
|
76
90
|
case x
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pca
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Geoff Buesing
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-04-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rb-gsl
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
-
description: Principal Component Analysis
|
27
|
+
description: Principal Component Analysis (PCA). Uses GSL for calculations.
|
28
28
|
email: gbuesing@gmail.com
|
29
29
|
executables: []
|
30
30
|
extensions: []
|
@@ -54,6 +54,6 @@ rubyforge_project:
|
|
54
54
|
rubygems_version: 2.4.5
|
55
55
|
signing_key:
|
56
56
|
specification_version: 4
|
57
|
-
summary: Principal Component Analysis
|
57
|
+
summary: Principal Component Analysis (PCA)
|
58
58
|
test_files: []
|
59
59
|
has_rdoc:
|