python - 在 PCA 脚本上输入 .mat 文件的 Pandas DataFrame 错误
问题描述
我正在尝试使用 python 实现用于图像压缩的 PCA,但我在其中两行中遇到了问题
我正在使用一个涉及 sklearn.decomposition、sklearn.preprocessing、scipy.io 和其他一些基本包的脚本。我的输入是一个 3100 x 10944 矩阵(matrix.mat)。该矩阵由 3100 个图像(每个图像有 38 x 288 像素)构成,这些图像被展平为一个数组。它由 1-255 之间的整数组成。使用 MATLAB 将矩阵从 .csv 转换为 .mat。它没有标题。
以下代码由 dilloncamp.com ( http://dilloncamp.com/projects/pca.html ) 提供。
from sklearn.decomposition import PCA
from sklearn.preprocessing import normalize
import scipy.io as sio
import matplotlib.image as image
import pandas as pd
import matplotlib.pyplot as plt
#Image is stored in MATLAB dataset
X = sio.loadmat('matrix.mat')
X = pd.DataFrame(X['X'])
#Normalize data by subtracting mean and scaling
X_norm = normalize(X)
#Set pca to find principal components that explain 99%
#of the variation in the data
pca = PCA(.99)
#Run PCA on normalized image data
lower_dimension_data = pca.fit_transform(X_norm)
#Lower dimension data is 5000x353 instead of 5000x1024
lower_dimension_data.shape
#Project lower dimension data onto original features
approximation = pca.inverse_transform(lower_dimension_data)
#Approximation is 5000x1024
approximation.shape
#Reshape approximation and X_norm to 5000x32x32 to display images
approximation = approximation.reshape(-1,32,32)
X_norm = X_norm.reshape(-1,32,32)
for i in range(0,X_norm.shape[0]):
X_norm[i,] = X_norm[i,].T
approximation[i,] = approximation[i,].T
fig4, axarr = plt.subplots(1,2,figsize=(8,8))
axarr[0,0].imshow(X_norm[4999,],cmap='gray')
axarr[0,0].set_title('Original Image')
axarr[0,0].axis('off')
axarr[0,1].imshow(approximation[4999,],cmap='gray')
axarr[0,1].set_title('99% Variation')
axarr[0,1].axis('off')
我遇到这个错误:
X = pd.DataFrame(X['X'])
键错误:'X'
这很令人困惑,因为它位于代码的早期部分。当我使用网站原始输入文件时,输入是一个 5000 x 1024 矩阵并且还包含 1-255 之间的整数,它工作正常。原始输入也是一堆扁平化的图像,但它们有更多的图像,5000 个,每个是 32 x 32(正方形)。
我所理解的 pandas.dataframe 用于对我们的输入进行网格化,但我不太确定 (X['X']) 是什么意思。这是什么意思?为什么他们在 reshape(-1,32,32) 中使用 -1 进行重塑?
谢谢
编辑:当我使用网站矩阵文件并将所有 X 更改为 A 时,它给了我同样的错误。我完全不明白,它似乎只有在X被命名为X时才有效。为什么会这样?它与sklearn.preprocessing有关吗?
EDIT2:找到罪魁祸首!当我们在 Matlab 中打开时,.mat 文件实际上包含一个具有特定名称的 matlab 变量。matlab 中的网站文件最初命名为 ex7faces.mat(您可以 google 并下载它)。如果我们在 Matlab 中打开它,它将作为变量“X”打开。这就是为什么将 ['X'] 更改为 ['A'] 不起作用的原因!我自己的 .mat 文件在 Matlab 中包含“M”变量,现在我可以解决关键错误。
解决方案
推荐阅读
- javascript - 使用 Ramda 重构 if 语句
- facebook - 您如何在 Facebook 中验证用户拥有的子域?
- entity-framework-core - EF 核心。当 IDENTITY_INSERT 设置为 OFF 时,无法在表“Book”中插入标识列的显式值
- c# - 如何使用 C# 附加范围报告 4.1.0?
- sql - 对此 ERD 的一部分进行建模的不同方法
- ios - 为什么具有相同像素比的手机上 2 个元素的高度不同?
- ipa - 为什么 PAM 身份验证在重启后不再需要 OpenVPN 服务器上的 2FA?
- python - Python 脚本日志记录(else 语句不做任何事情)
- r - 格式化函数输出为数据框
- asp.net-core - 带有 Azure AD b2c 重定向 URL 的 Asp.Netcore Web 应用