데이터 전처리를 통해 얻은 이미지들을 (이미지개수, 32, 32) 형태의 numpy array로 만들어주었다
이미지가 3차원이기 때문에 SVD를 쉽게 이용하기 위해 2차원으로 바꾸어주었다
(이미지개수, 1024)의 형태가 되었으므로 eigenface의 기저는 최대 1024개가 되었다
1
2
3
4
5
6
7
|
# subtract average value from original data
data_avg = np.average(data_orig,axis=0)
data = data_orig-data_avg
A = data.reshape(data_size,32*32)
U,s,V=np.linalg.svd(A, full_matrices=False)
plt.plot(s[:100])
|
cs |
해당 코드를 실행시켜보면
s가 0~40사이에서 급격히 감소하는 모습을 확인할 수 있다
eigenface를 직접 확인해보고 싶어서 V 배열을 아래와 같이 사용해보았다
1
2
3
4
5
6
|
def getEigenFaces(r,U,s,V):
plt.figure(figsize=(10,r/2))
for i in range(0,r):
plt.subplot(r/5, 5, i+1)
plt.imshow(V[i, :].reshape(32, 32), cmap = 'gray')
getEigenFaces(10,U,s,V)
|
cs |
s가 큰 열개의 eigenface인데 사람의 얼굴이 실제로 보여서 신기했다
이제 이 eigenvector들을 가지고 사진의 차원을 낮춰서 나타낼 수 있다
원래 사진은 픽셀별로 값이 있어야했지만 eigenvector에 어떤 값이 곱해질지만 안다면 원본 사진과 비슷하게 복원할 수 있다
'수치해석' 카테고리의 다른 글
PCA를 이용한 eigenface - test data로 확인해보기 (0) | 2021.12.05 |
---|---|
PCA를 이용한 eigenface - 데이터 전처리 (0) | 2021.12.05 |
System equations (0) | 2020.10.02 |
Finding roots (0) | 2020.10.02 |