吴恩达机器学习课后习题ex7-2 主成分分析PCA(python实现)

PCA主要应用于降维度、可视化,以此来加快学习算法的运行速度。

PCA实现

首先,你将用一个二维的样本集来实验,从而对PCA如何运行的有一个直观的感受,然后再在一个更大的由5000个人脸图像组成的数据集上实现PCA。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.io import loadmat
mat=loadmat('ex7data1.mat')
X=mat['X']
x=pd.DataFrame(mat['X'],columns=['x1','x2'])
fig,ax=plt.subplots(figsize=(12,8))
ax.scatter(x['x1'],x['x2'])
ax.set_xlabel('x1')
ax.set_ylabel('x2')
plt.show()

在这里插入图片描述
正式开始进行PCA,首先需要对数据集进行归一化和特征缩放。

X_norm=(x-x.mean(axis=0))/x.std(axis=0)

然后计算协方差矩阵,用奇异值分解得出U,U是一个具有与数据之间最小投射误差的方向向量构成的矩阵,将数据从n维降至k维,选取U[:,:k],最后计算新的特征向量z=X_norm*U,这里需要注意的是x应该是归一化之后的x,不然结果会出错!!!

def pca(x):
  x=np.matrix(x)
  sigma=(x.T*x)/len(x)
  U,S,V=np.linalg.svd(sigma)
  return U,S,V
def project_data(x,k,u):
  u_reduce=u[:,:k]
  return x*u_reduce
z=project_data(X_norm,U,1)

重建压缩数据
x=u_reduce*z

def recover_data(u,z,k):
  u_reduce=u[:,:k]
  return z*u_reduce.T
x_recover=recover_data(U,z,1)

画图观察数据映射结果

x_recover=np.array(x_recover)
plt.figure(figsize=(20,12))
plt.scatter(X_norm[:,0], X_norm[:,1], marker='o', facecolors='none', edgecolors='b')
plt.scatter(x_recover[:,0], x_recover[:,1], marker='o', facecolors='none', edgecolors='r')
for i in range(len(X_norm)):
  plt.plot([X_norm[i,0], x_recover[i,0]], [X_norm[i,1], x_recover[i,1]], 'k--')
plt.title('The normalized and projected data after PCA')

在这里插入图片描述

人脸数据集

face_mat=loadmat('ex7faces.mat')
X=face_mat['X']  #(5000,1024)

显示100张图像

def plot_100_image(x):
  idx=np.random.choice(5000,100)
  fig,ax=plt.subplots(ncols=10,nrows=10,figsize=(8,8))
  images=x[idx] #(100,1024)
  for i in range(10):
    for j in range(10):
      ax[i][j].imshow(images[i*10+j].reshape(32,32).T,cmap='gray_r')
      ax[i][j].set_xticks([])
      ax[i][j].set_yticks([])

在这里插入图片描述

#降低维度-1024-36
#首先归一化
means = X.mean(axis=0)
stds = X.std(axis=0)
X_norm = (X - means) / stds
X_norm 
U,S,V=pca(X_norm)
z=project_data(X_norm,U,36)
x_recover=recover_data(z,U,36)
plot_100_image(x_recover)

在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值