用 python 实现 R 的 prcomp() 的结果

上文中曾提到,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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容