Ошибка Pandas DataFrame при вводе файла .mat в сценарий PCA - PullRequest
2 голосов
/ 20 июня 2019

Я пытаюсь реализовать PCA для сжатия изображений с использованием python, но я сталкиваюсь с проблемой в двух строках

Я использую скрипт, который включает sklearn.decomposition, sklearn.preprocessing, scipy.io и некоторые другие базовые пакеты. Мой ввод - матрица 3100 x 10944 (matrix.mat). Матрица состоит из 3100 изображений (каждое имеет размер 38 х 288 пикселей), которые сведены в массив. Он состоит из целых чисел 1-255. Матрица преобразуется из .csv в .mat с помощью MATLAB. У него нет заголовка.

Следующий код любезно предоставлен 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 при изменении формы (-1,32,32)?

Спасибо

EDIT: Когда я использовал файл матрицы сайта и изменил все X на A, это выдает мне ту же ошибку. Я совсем не понимаю, кажется, это работает, только если X называется X. Почему это так? Это связано с sklearn.preprocessing ??

EDIT2: НАЙТИ КУЛЬПРИТ! Файл .mat на самом деле содержит переменную matlab с определенным именем, когда мы открываем ее в Matlab. Первоначально файл веб-сайта в matlab называется ex7faces.mat (вы можете загрузить его и зайти в Google). Если мы откроем его в Matlab, он будет открыт как переменная «X». Вот почему изменение ['X'] на ['A'] не работает !! Мой собственный файл .mat содержит переменную "M" в Matlab, теперь я могу получить сообщение об ошибке ключа.

...