回答編集履歴
5
typoの修正
test
CHANGED
@@ -150,7 +150,7 @@
|
|
150
150
|
|
151
151
|
```python
|
152
152
|
|
153
|
-
explained_variance_[:, np.newaxis] == (P, 1)
|
153
|
+
explained_variance_[:, np.newaxis].shape == (P, 1)
|
154
154
|
|
155
155
|
```
|
156
156
|
|
4
質問に答えていなかったため追記
test
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
#### PCA.inverse_transform()の動作
|
2
|
+
|
3
|
+
|
4
|
+
|
1
5
|
PCA.transform()は主成分(分散の大きな軸)を見つけてそれを主軸とするような変換を行います。変換された値に対してPCA.inverse_transform()を行うと、元の変換される前の値を返します。
|
2
6
|
|
3
7
|
|
@@ -91,3 +95,93 @@
|
|
91
95
|
|
92
96
|
|
93
97
|
![PCA.inverse_transform()の実験](98ed48234adbfa4ab26743d3bb802827.png)
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
#### 低次元から高次元へ戻る仕組み
|
102
|
+
|
103
|
+
|
104
|
+
|
105
|
+
簡単に言うと、N個のデータ、M個の特徴量に対してP次元のPCAを適用した場合
|
106
|
+
|
107
|
+
|
108
|
+
|
109
|
+
(N x P) = (N x M) (M x P) # (変換後) = (変換前) (変換行列)
|
110
|
+
|
111
|
+
|
112
|
+
|
113
|
+
となっています。変換行列(M x P)を覚えておいて、inverse_transform()する際には
|
114
|
+
|
115
|
+
|
116
|
+
|
117
|
+
(N x M) = (N x P) (P x M) # (変換前) = (変換後) (変換行列の転置行列)
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
を行っているだけです。
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
ソースコードの方を参照されているので詳しく説明します。入力データX0のデータ数をN, 特徴量の数をMとすると
|
126
|
+
|
127
|
+
```python
|
128
|
+
|
129
|
+
X0.shape == (N, M)
|
130
|
+
|
131
|
+
```
|
132
|
+
|
133
|
+
です。これにPCAの要素数をPとすると、pca.transform()後のX1は
|
134
|
+
|
135
|
+
```python
|
136
|
+
|
137
|
+
X1.shape == (N, P)
|
138
|
+
|
139
|
+
```
|
140
|
+
|
141
|
+
となります。このときPCAの内部ではfit()時に各々分散を計算して大きい順にP個保持しています。
|
142
|
+
|
143
|
+
```python
|
144
|
+
|
145
|
+
explained_variance_.shape == (P, ) # 1次元配列
|
146
|
+
|
147
|
+
```
|
148
|
+
|
149
|
+
np.newaxisは次元を1つ追加しますので
|
150
|
+
|
151
|
+
```python
|
152
|
+
|
153
|
+
explained_variance_[:, np.newaxis] == (P, 1)
|
154
|
+
|
155
|
+
```
|
156
|
+
|
157
|
+
と2次元配列になります。要素数P個は変わりません。
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
また主成分の係数`components_`は
|
162
|
+
|
163
|
+
```python
|
164
|
+
|
165
|
+
components_.shape == (P, M)
|
166
|
+
|
167
|
+
```
|
168
|
+
|
169
|
+
になっています。この2つを掛け算すると
|
170
|
+
|
171
|
+
```python
|
172
|
+
|
173
|
+
(explained_variance_[:, np.newaxis] * components_).shape == (P, M)
|
174
|
+
|
175
|
+
```
|
176
|
+
|
177
|
+
となります。これはP個の分散の値をcomponents_の各行に掛け算しています。
|
178
|
+
|
179
|
+
np.sqrt()は次元を変えませんので、最終的に
|
180
|
+
|
181
|
+
```
|
182
|
+
|
183
|
+
np.dot(X, np.sqrt(self.explained_variance_[:, np.newaxis])
|
184
|
+
|
185
|
+
```
|
186
|
+
|
187
|
+
を計算することができます。Xは次元が減ったX1.shape == (N, P)のことですので、内積は(N, P) . (P, M) となり、演算結果の行列は(N, M)となります。
|
3
typoの修正
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
PCA.transform()は主成分(分散の大きな軸)を見つけてそれを主軸とするような変換を行います。変換された値に対してPCA.inverse_transform()を行うと、元の
|
1
|
+
PCA.transform()は主成分(分散の大きな軸)を見つけてそれを主軸とするような変換を行います。変換された値に対してPCA.inverse_transform()を行うと、元の変換される前の値を返します。
|
2
2
|
|
3
3
|
|
4
4
|
|
2
回転とも少し違う、どちらかと言えば投影のが近い
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
PCA.transform()は主成分(分散の大きな軸)を見つけて軸を
|
1
|
+
PCA.transform()は主成分(分散の大きな軸)を見つけてそれを主軸とするような変換を行います。変換された値に対してPCA.inverse_transform()を行うと、元の回転される前の値を返します。
|
2
2
|
|
3
3
|
|
4
4
|
|
1
正規化ではなく回転に修正
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
PCA.transform()は主成分(分散の大きな軸)を見つけて
|
1
|
+
PCA.transform()は主成分(分散の大きな軸)を見つけて軸を回転した値を返します。回転された値に対してPCA.inverse_transform()を行うと、元の回転される前の値を返します。
|
2
2
|
|
3
3
|
|
4
4
|
|