1. 程式人生 > >Bobo老師機器學習筆記第七課-如何通過PCA實現高維資料向低維資料的轉換

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僅僅是通過高維空間來表達低維空間的資料。