吴恩达-机器学习课后题07-PCA-主成分分析法

1、预先知识学习

1、什么是PCA:
在这里插入图片描述
将数据从二维降至一维/从三维降至二维使得投影距离最小
找到一个更低维度的平面,对数据进行投影,使得投影距离最小
在这里插入图片描述
2、使用步骤:
在这里插入图片描述
3、U,S,V = np.linalg.svd (C)
此方法用于计算特征值与特征向量,其中

解释1、S返回的是特征值,U返回的是协方差矩阵。?不确定

解释2、总共有三个返回值u,s,v
u大小为(M,M),s大小为(M,N),v大小为(N,N)。
A = usv
其中s是对矩阵a的奇异值分解。s除了对角元素不为0,其他元素都为0,并且对角元素从大到小排列。s中有n个奇异值,一般排在后面的比较接近0,所以仅保留比较大的r个奇异值。

反正要降维,将成几维就在U中取前几就行

2、问题:

将一组二维数据降至一维

3、解题

1、导入数据

mat = sio.loadmat(path)
X = mat['X']
print(X.shape)
plt.scatter(X[:,0],X[:,1])
plt.show()

结果:
在这里插入图片描述

2、实现数据去均值化及计算协方差矩阵

X_demean = X - np.mean(X,axis=0)
C = X_demean.T@X_demean/len(X)#协方差矩阵
print(C)

3、进行奇异值分解(特征向量分解)
此处不需要求甚解,只需要知道怎么做即可

U,S,V = np.linalg.svd(C)
U1 = U[:,0]

对协方差矩阵C进行奇异值分解,然后需要几维度就从U中取前几列

4、降维

#降维
X_reduction = X_demean@U1

此时得到的X_reduction就是降维之后的坐标值,是一维的

5、画出降维之后的坐标轴
因为是按U1进行降维的,所以表示出U1即可
我们知道plot中传入的值是(x,y,c=‘color’)
所以需要两个点分别取其x和y就能表示出一条直线即坐标轴
我们去第一个点为(0,0),第二个点为(U1[:,0],U1[:,1])

plt.scatter(X_demean[:,0],X_demean[:,1])
plt.plot([0,U1[0]],[0,U1[1]],c='r')
plt.show()

结果:
在这里插入图片描述
6、画出另外一条坐标轴
因为将X_demean降维在了U[:,0]这个向量上,所以另外一个向量U[:,1]是另外一个维度:

X_reduction = X_demean@U1
plt.scatter(X_demean[:,0],X_demean[:,1])
plt.plot([0,U1[0]],[0,U1[1]],c='r')
plt.plot([0,U[0,1]],[0,U[1,1]],c='k')
plt.show()

结果:
在这里插入图片描述
我们看出,这两条直线并不像是垂直的,主要是因为我们这个坐标系显示的横纵不一样长,改变一下图像的大小

X_reduction = X_demean@U1
plt.figure(figsize=(7,7))
plt.scatter(X_demean[:,0],X_demean[:,1])
plt.plot([0,U1[0]],[0,U1[1]],c='r')
plt.plot([0,U[0,1]],[0,U[1,1]],c='k')
plt.show()

结果:

7、还原数据
(1)查看当前数据维度:

print(X_reduction.shape)

当前维度为(50,)我们将其还原成(50,1)然后乘以U1.reshape(50,2)就会变回(50,2)的维度
我们将数据还原成原来的

(2)还原:

X_restore =  X_reduction.reshape(50,1)@U1.reshape(1,2)+np.mean(X)
plt.figure(figsize=(7,7))
plt.scatter(X[:,0],X[:,1])
plt.scatter(X_restore[:,0],X_restore[:,1])
plt.plot([U1[0],-5*U1[0]],[U1[1],-5*U1[1]],c='r')
plt.show()

结果:
在这里插入图片描述
可以看出轴线与还原之后的数据之间差一个 均值

不加均值还原:
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值