import requests
import io
import numpy as np
response = requests.get('https://www.ic.unicamp.br/~wainer/cursos/1s2021/431/dados.npy')
data = np.load(io.BytesIO(response.content))
data.shape
import matplotlib.pyplot as plt
# reshape da matriz mantendo o numero
# de linhas da original e convertendo cada
# imagem para a dimensão 28x28
images = data.reshape(-1, 28, 28)
images.shape
# impressao dos 3 primeiros dígitos da matriz
f, axarr = plt.subplots(1,3)
axarr[0].imshow(images[0], cmap='gray')
axarr[1].imshow(images[1], cmap='gray')
axarr[2].imshow(images[2], cmap='gray')
plt.show()
from sklearn.preprocessing import StandardScaler
# StandardScaler eh uma funcao fornecida pelo Sklearn para
# padronizar dados, o parametro with_mean=True indica que os
# dados devem ser normalizados para media 0, enquanto o parametro
# with_std=False que nao eh necessario normalizar para variancia unitaria
data_normalized = StandardScaler(with_mean=True, with_std=False)
data_normalized.fit(data)
data_after_normalization = data_normalized.transform(data)
from numpy.linalg import svd
u_full, s_full, vh_full = np.linalg.svd(data_after_normalization, full_matrices=True)
print(f'Shape of unitary arrays: {u_full.shape}')
print(f'Shape of vector with the singular values: {s_full.shape}')
print(f'Shape of unitary arrays: {vh_full.shape}')
Shape of unitary arrays: (10500, 10500)
Shape of vector with the singular values: (784,)
Shape of unitary arrays: (784, 784)
np.diag(s_full[:4])
u_compact, s_compact, vh_compact = np.linalg.svd(data_after_normalization, full_matrices=False)
print(f'Shape of unitary arrays: {u_compact.shape}')
print(f'Shape of vector with the singular values: {s_compact.shape}')
print(f'Shape of unitary arrays: {vh_compact.shape}')
Shape of unitary arrays: (10500, 784)
Shape of vector with the singular values: (784,)
Shape of unitary arrays: (784, 784)
np.diag(s_compact[:4])
from sklearn.decomposition import TruncatedSVD
# para calcular a matriz projetada (com 100 componentes)
# usamos a funcao TruncatedSVD do sklearn
truncate_svd = TruncatedSVD(n_components=100)
truncate_svd.fit(data_after_normalization)
projected_matrix = truncate_svd.transform(data_after_normalization)
print(f'Dimensions for the projected matrix : {projected_matrix.shape}')
Dimensions for the projected matrix : (10500, 100)
# para calcular a matriz reconstruida (com 784 componentes)
# usamos as matrizes calculadas na etapa anterior e fizemos
# as multiplicacoes necessarias :
num_components = 784
reconstructed_matrix = np.matrix(u_full[:, :num_components]) * \
np.diag(s_full[:num_components]) * \
np.matrix(vh_full[:num_components, :])
reconstructed_matrix = np.array(reconstructed_matrix)
print(f'Dimensions for the reconstructed matrix : {reconstructed_matrix.shape}')
Dimensions for the reconstructed matrix : (10500, 784)
images_from_reconstructed = reconstructed_matrix.reshape(-1, 28, 28)
images_from_reconstructed.shape
mean_to_add = data_normalized.mean_.reshape(1,-1) * np.ones((10500, 784))
mean_to_add.shape
## somar os valores das médias, anteriormente subtraídos, à matriz reconstruída
images_from_reconstructed = mean_to_add.reshape(-1, 28, 28) + images_from_reconstructed
f, axarr = plt.subplots(3,2, figsize=(10,10))
axarr[0][0].title.set_text('Reconstruída')
axarr[0][1].title.set_text('Original')
axarr[0][0].imshow(images_from_reconstructed[0], cmap='gray')
axarr[0][1].imshow(images[0], cmap='gray')
axarr[1][0].imshow(images_from_reconstructed[1], cmap='gray')
axarr[1][1].imshow(images[1], cmap='gray')
axarr[2][0].imshow(images_from_reconstructed[2], cmap='gray')
axarr[2][1].imshow(images[2], cmap='gray')
plt.show()
images_eigen = vh_compact.reshape(-1, 28, 28)
images_eigen.shape
f, axarr = plt.subplots(1,3)
axarr[0].imshow(images_eigen[0], cmap='gray')
axarr[1].imshow(images_eigen[1], cmap='gray')
axarr[2].imshow(images_eigen[2], cmap='gray')
plt.show()
(s_full > 1).sum()
componentes_var = np.cumsum(np.power(s_compact,2) / np.sum(np.power(s_compact,2)))
plt.plot(componentes_var.tolist())
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance')
plt.show()
# como o array com a soma acumulada das
# variancias esta indexado em 0 eh preciso
# somar 1 um a posicao na qual encontramos
# o primeiro valor maior que 0.8 a fim de
# converter essa posicao no numero de features
np.argmax(componentes_var > 0.8) + 1
s_compact[:43]
# como o array com a soma acumulada das
# variancias esta indexado em 0 eh preciso
# somar 1 um a posicao na qual encontramos
# o primeiro valor maior que 0.8 a fim de
# converter essa posicao no numero de features
np.argmax(componentes_var > 0.95) + 1
s_compact[:151]
from sklearn.decomposition import PCA
pca = PCA().fit(data_after_normalization)
plt.plot(np.cumsum(pca.explained_variance_ratio_))
plt.xlabel('number of components')
plt.ylabel('cumulative explained variance')
plt.show()
x = np.cumsum(pca.explained_variance_ratio_)
# como o array com a soma acumulada das
# variancias esta indexado em 0 eh preciso
# somar 1 um a posicao na qual encontramos
# o primeiro valor maior que 0.8 a fim de
# converter essa posicao no numero de features
np.argmax(x > 0.8) + 1
# como o array com a soma acumulada das
# variancias esta indexado em 0 eh preciso
# somar 1 um a posicao na qual encontramos
# o primeiro valor maior que 0.8 a fim de
# converter essa posicao no numero de features
np.argmax(x > 0.95) + 1