美文网首页
用 python 实现 R 的 prcomp() 的结果

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

作者: 心惊梦醒 | 来源:发表于2025-02-04 15:30 被阅读0次

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

相关文章

网友评论

      本文标题:用 python 实现 R 的 prcomp() 的结果

      本文链接:https://www.haomeiwen.com/subject/copiujtx.html