首页 > 解决方案 > 在 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”变量,现在我可以解决关键错误。

标签: pythonpandasdataframereshapepca

解决方案


推荐阅读