Bobo老师机器学习笔记第七课-如何通过PCA实现高维数据向低维数据的转换

在上一篇博客中我们总结如何求出前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仅仅是通过高维空间来表达低维空间的数据。

猜你喜欢

转载自blog.csdn.net/sxb0841901116/article/details/83718066
今日推荐