在上一篇博客中我们总结如何求出前N个主成分, 这篇博客中我们主要讲述如何通过PCA实现高维数据向低维数据的转变。
高维数据向低维数据的转变的核心是重新建立新的坐标系,而这个坐标系就是前K个主成分构成矩阵。所以问题简化为如何通过高位矩阵和前K主成分矩阵,找出新坐标下的地位矩阵
首先假设数据X和前K个主成分我们已经求得如下:
转换公式其实很简单,如下:
从上图可以看到X乘以W的转置矩阵就会获取一个m*k的地位矩阵了。
此外如果知道低维数据,也可以通过坐标系W还原到原来的X(m)数据。不过此处要注意,还原后的数据虽然和愿数据维度不变,但是数据有一定的损失,下面我们通过编程来直观的看一下。
二、编码实现
基于上一篇博客的代码,增加如下代码:
def transform(self, X):
"""将给定的X,映射到各个主成分分量中"""
assert X.shape[1] == self.components_.shape[1]
return X.dot(self.components_.T)
def inverse_transform(self, X):
"""将给定的X,反向映射回原来的特征空间"""
assert X.shape[1] == self.components_.shape[0]
return X.dot(self.components_)
测试代码:
x = np.random.randint(1, 100, size=100)
X = np.empty((100, 2))
X[:, 0] = x
X[:, 1] = 0.75 * x + 3. + np.random.normal(1,10., size=len(x))
pca = PCA(n_components=1)
pca.fit(X)
w = pca.components_[0]
X_reduction = pca.transform(X)
print('X_reduction:', X_reduction.shape)
X_restore = pca.inverse_transform(X_reduction)
print('X_restore:', X_restore.shape)
plt.scatter(X[:, 0], X[:, 1], color='b', alpha=0.5, label='X')
plt.scatter(X_restore[:, 0], X_restore[:, 1], color='r', alpha=0.5, label='Restore X')
plt.plot([0, w[0] * 30], [0, w[1] * 30], color='g', label='W')
plt.legend()
plt.show()
测试代码把2维X降维到1维 X_reduction,映射的坐标是w方向, 然后又用w方向把X_reduction还原成X_restore。不过可以看出
restore_X和X相比存在数据损失。restore_X是2维数据,但看起来在一条直线上,因此可以为还原后的restore_X仅仅是通过高维空间来表达低维空间的数据。