1、题目
题目:使用PCA的方法,对图像进行降维处理
2、解题
1、导入数据
mat = sio.loadmat(path)
print(mat.keys())
X = mat['X']
2、显示数据内容
利用前面手写数字识别时定义的显示图片的方法,显示前100张图片
def plot_100_image():
fig,ax = plt.subplots(ncols=10,nrows=10,figsize=(10,10))
for i in range(10):
for j in range(10):
ax[i,j].imshow(X[10*i+j].reshape(32,32).T,cmap='Greys_r')
ax[i,j].set_xticks([])
ax[i,j].set_yticks([])
plt.show()
plot_100_image()
结果:
3、求均值
means = np.mean(X,axis=0)
X_demean = X-means
C = X_demean.T@X_demean
U,S,V = np.linalg.svd(C)
使用svd奇异值分解的方法进行分解
4、降维:
U1 = U[:,:36]
X_reduction = X_demean@U1
print(X_reduction.shape)
print(U1.shape)
4、对降维之后的图像进行6*6显示
def plot_100_image(images):
fig,ax = plt.subplots(ncols=10,nrows=10,figsize=(10,10))
for i in range(10):
for j in range(10):
ax[i,j].imshow(images[10*i+j].reshape(36,36).T,cmap='Greys_r')
ax[i,j].set_xticks([])
ax[i,j].set_yticks([])
plt.show()
不忍直视
参考上一节,要转换成二维的才能显示在二维坐标上,此处是要转制成1024,才能使用plot显示到32*32出来
5、进行重构
X_recover = X_reduction@U1.T+means #参考上一节,要转换成二维的才能显示在二维坐标上,此处是要转制成1024,才能使用plot显示出来
plot_100_image(X_recover)
此处理解:
求出来的U是10241024的方阵,取前36列与X_demean进行@使得X进行降维,成了500036,反之,要使其恢复成50001024,需要500036@26*1024,即X_reduction@U1.T 然后还需要加上均值恢复
题外话,尝试了一下没有恢复均值的情况,挺好笑的😺,完全错位