回答編集履歴

5

typoの修正

2020/07/19 22:02

投稿

yymmt
yymmt

スコア1615

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

質問に答えていなかったため追記

2020/07/19 22:02

投稿

yymmt
yymmt

スコア1615

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の修正

2020/07/19 21:57

投稿

yymmt
yymmt

スコア1615

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

回転とも少し違う、どちらかと言えば投影のが近い

2020/07/19 17:41

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -1,4 +1,4 @@
1
- PCA.transform()は主成分(分散の大きな軸)を見つけて軸を回転した値を返します。回転された値に対してPCA.inverse_transform()を行うと、元の回転される前の値を返します。
1
+ PCA.transform()は主成分(分散の大きな軸)を見つけてそれを主とするような変換行います。変換された値に対してPCA.inverse_transform()を行うと、元の回転される前の値を返します。
2
2
 
3
3
 
4
4
 

1

正規化ではなく回転に修正

2020/07/19 17:40

投稿

yymmt
yymmt

スコア1615

test CHANGED
@@ -1,4 +1,4 @@
1
- PCA.transform()は主成分(分散の大きな軸)を見つけて正規化された値を返します。正規化された値に対してPCA.inverse_transform()を行うと、元の正規化される前の値を返します。
1
+ PCA.transform()は主成分(分散の大きな軸)を見つけて軸を回転した値を返します。回転された値に対してPCA.inverse_transform()を行うと、元の回転される前の値を返します。
2
2
 
3
3
 
4
4