我正在尝试使用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'])
KeyError:'X'
这很混乱,因为它在代码的早期。 当我使用网站原始输入文件时,它的输入是5000 x 1024矩阵,并且还包含1-255之间的整数,因此可以正常工作。原始输入也是一堆扁平化的图像,但是它们有更多的图像(5000张),每张都是32 x 32(正方形)。
我理解pandas.dataframe用于将输入网格化,但我不太确定(X ['X'])的含义。这是什么意思? 为什么要进行重塑,他们在重塑(-1,32,32)中使用-1?
谢谢
编辑: 当我使用网站矩阵文件并将所有X更改为A时,它给了我同样的错误。我一点也不理解,似乎只有在X命名为X的情况下它才有效。 为什么会这样呢?与sklearn.preprocessing有关吗?
EDIT2: 发现罪魁祸首! 当在Matlab中打开.mat文件时,它实际上包含具有特定名称的matlab变量。 matlab中的网站文件最初名为ex7faces.mat(您可以将其搜索并下载)。如果我们在Matlab中打开它,它将以变量“ X”打开。 这就是为什么将['X']更改为['A']无效的原因! 我自己的.mat文件在Matlab中包含“ M”变量,现在我可以解决键错误了。