上文中曾提到,Python 的 StandardScaler() 对数据进行标准化时用的是有偏估计,所以如果想得到与 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 的结果比较发现,两者仍存在符号的差异,这个问题似乎是没有办法解决的,因为 R 每次运行的时候结果都有可能不同。
R