上文中曾提到,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