本文共 1469 字,大约阅读时间需要 4 分钟。
在上一篇博客中我们总结如何求出前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仅仅是通过高维空间来表达低维空间的数据。
要是你在西安,感兴趣一起学习AIOPS,欢迎加入QQ群 860794445
转载地址:http://lhkai.baihongyu.com/