用 python 實現(xiàn) R 的 prcomp() 的結果

上文中曾提到,Python 的 StandardScaler() 對數(shù)據(jù)進行標準化時用的是有偏估計,所以如果想得到與 R 的 prcomp() 相同的結果,只需要自定義一個無偏估計的標準化方法即可。

import numpy as np
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
import inspect

class CustomStandardScaler:
    def __init__(self):
        self.mean_ = None
        self.std_ = None

    def fit(self, X):
        self.mean_ = np.mean(X, axis=0)
        self.std_ = np.std(X, axis=0, ddof=1)
        return self

    def transform(self, X):
        return (X - self.mean_) / self.std_

    def fit_transform(self, X):
        self.fit(X)
        return self.transform(X)

file = 'input.data.txt'
data_frame = pd.read_csv(file, header=0, index_col=0, sep="\t")
data_tr = data_frame.iloc[0:35,]

#scaler = StandardScaler().fit(data_tr)
# tr_scaled = scaler.transform(data_tr)
scaler = CustomStandardScaler().fit(data_tr)
tr_scaled = scaler.transform(data_tr)

pca = PCA().fit(tr_scaled)
tr_pca = pca.transform(tr_scaled)

data_te = data_frame.iloc[35:60,]
te_scaled = scaler.transform(data_te)
te_pca = pca.transform(te_scaled)

上述代碼中,定義了一個無偏估計的標準化方法 CustomStandardScaler(),得到的訓練集的 PCA 結果如下:

python

與 R 的結果比較發(fā)現(xiàn),兩者仍存在符號的差異,這個問題似乎是沒有辦法解決的,因為 R 每次運行的時候結果都有可能不同。


R
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容