-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpca.py
132 lines (72 loc) · 3.18 KB
/
pca.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
from scipy.linalg import eigh
import numpy as np
import matplotlib.pyplot as plt
n = 2414 ## number of images
d = 1024 ## number of features per image
def load_and_center_dataset(filename):
# TODO: add your code here
faceData = np.load(filename)
## then must center the data (subtract the mean of each column from each element in the column)
centeredFaceData = faceData - np.mean(faceData, axis = 0)
return centeredFaceData
def get_covariance(dataset):
# TODO: add your code here
datasetTranspose = np.transpose(dataset)
covarianceMatrix = np.dot(datasetTranspose, dataset) / (n - 1)
return covarianceMatrix
def get_eig(S, m):
# TODO: add your code here
eigenvaluesAndVectors = eigh(S, subset_by_index = [d - m, d - 1])
eigenVals = eigenvaluesAndVectors[0]
eigenVectors = eigenvaluesAndVectors[1]
## creating diagonal matrix of eigen vals
diagonalMatrix = np.diag(np.flip(eigenVals))
correctedEigenVectors = []
## flipping the rows of the eigen vectors in order to have the correct correspondance
for i in range(len(eigenVectors)):
row = eigenVectors[i]
reversedRow = np.flip(row)
correctedEigenVectors.append(reversedRow)
correctedEigenVectors = np.array(correctedEigenVectors)
return diagonalMatrix, correctedEigenVectors
def get_eig_perc(S, perc):
eigenvalsandVects = eigh(S)
sumEigenVals = sum(eigenvalsandVects[0])
## getting the number of eigenvals that meet the percentage threshold
numEigenVals = 0
for eigenval in eigenvalsandVects[0]:
if(eigenval / sumEigenVals > perc):
numEigenVals += 1
percValsAndVects = eigh(S, subset_by_index = [d - numEigenVals, d - 1])
eigenVals = np.flip(percValsAndVects[0])
## creating eigenmatrix of eigenvalues that meet the percent threshold
eigenVectors = percValsAndVects[1]
eigenMatrix = np.diag(eigenVals)
eigenVectMatrix = []
for i in range(len(eigenVectors)):
row = eigenVectors[i]
reversedRow = np.flip(row)
eigenVectMatrix.append(reversedRow)
return np.array(eigenMatrix), np.array(eigenVectMatrix)
def project_image(img, U):
Utrans = np.transpose(U)
alphas = []
for i in range(len(Utrans)):
alpha = np.dot(Utrans[i], img)
alphas.append(alpha)
projectedImage = [0] * d
for i in range(len(Utrans)):
singleProjectedComponent = alphas[i] * Utrans[i]
projectedImage += singleProjectedComponent
return np.array(projectedImage)
def display_image(orig, proj):
reshapedOrig = np.reshape(orig, (32, 32))
reshapedProj = np.reshape(proj, (32, 32))
figure, (ax1, ax2) = plt.subplots(1, 2)
ax1.set_title("Original")
ax2.set_title("Projection")
originalImage = ax1.imshow(np.transpose(reshapedOrig), aspect = 'equal')
projectedImage = ax2.imshow(np.transpose(reshapedProj), aspect = 'equal')
figure.colorbar(originalImage, ax = ax1)
figure.colorbar(projectedImage, ax = ax2)
plt.show()