python - 在 python 中的 PCA 重建中查找 rmse 的问题
问题描述
我试图找到不同数量组件的原始样本Xdata
和重建样本之间的均方根误差。recon
但是,当我使用下面的代码时:
components = [2,6,10,20]
for n in components:
pca = PCA(n_components=n)
recon = pca.inverse_transform(pca.fit_transform(Xdata[0].reshape(1, -1)))
rmse = math.sqrt(mean_squared_error(Xdata[0].reshape(1, -1), recon))
print("RMSE: {} with {} components".format(rmse, n))
每个组件的 RMSE 总是为 0.0?
作为参考,这是Xdata[0]
成立的:
array([-8.47058824e-06, -6.12352941e-05, -3.18529412e-04, -1.09905882e-03, -2.64370588e-03, -4.39111765e-03, -8.70000000e-03, -2.35560000e-02, -6.03388235e-02, -1.52837471e-01, -3.48945353e-01, -4.86196588e-01, -5.51568706e-01, -5.38629706e-01, -5.34948000e-01, -5.70773824e-01, -5.45583000e-01, -4.30446353e-01, -2.76558000e-01, -1.10208882e-01, -4.35031765e-02, -2.09613529e-02, -1.25080588e-02, -9.00317647e-03, -5.04900000e-03, -2.75576471e-03, -1.03394118e-03, -1.78058824e-04, -7.53529412e-05, -2.54647059e-04])
解决方案
PCA 是一种类型降维,我引用wiki:
它通常用于降维,方法是将每个数据点仅投影到前几个主成分上,以获得低维数据,同时尽可能多地保留数据的变化。
对我来说,你的数据X[0]
只有一维。你还能减少多少?
如果是测试第一个条目的 rmse 的情况,您仍然需要将 pca 拟合到完整数据(以捕获方差),并且只在 1 个数据点上对 rmse 进行子集化(尽管它可能没有意义,因为对于n=1 它不是 rmse 而是残差的平方)
你可以在下面看到:
import numpy as np
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.metrics import mean_squared_error
iris = datasets.load_iris()
Xdata = iris.data
components = [2,3]
for n in components:
pca = PCA(n_components=n)
recon = pca.inverse_transform(pca.fit_transform(Xdata))
rmse = mean_squared_error(Xdata[0], recon[0],squared=False)
print("RMSE: {} with {} components".format(rmse, n))
输出:
RMSE: 0.014003180182090432 with 2 components
RMSE: 0.0011312185356586826 with 3 components
推荐阅读
- amazon-web-services - CloudFormation - 根据 vpc 标签值动态地将安全组分配给 vpc
- c# - 通过在 .NET Core 上运行的 Cloudinary C# 在生产中上传图像的问题
- amazon-web-services - Azure DevOps Pipeline:AWS CLI 任务,如何引用预定义变量
- php - 为什么服务器拒绝 php 中特定 url 路径上的 curl 客户端但 bash 中的 curl 没有
- regex - 正则表达式从空格分隔列表中获取第三个元素
- python - 我如何在循环中打印特定变量?
- vi - 在 vi 中选择文本的问题
- android - 添加了 android:exported 但仍然出现错误 需要针对 Android 12 及更高版本的应用程序才能为 android:exported 指定显式值
- android - 带有模拟测试的 NullPointerException
- javascript - 设置 Access-Control-Allow-Headers: *(如果有)的安全含义是什么?