代码:
import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt
mat=sio.loadmat('ex7data1.mat')
print(mat.keys())
X=mat['X']#(50,2)
# 初始数据可视化
plt.scatter(X[:,0],X[:,1])
plt.show()
# 1.X去均值化
X_demean=X-np.mean(X,axis=0)
# 绘制去均值化后的数据分布
plt.figure()
plt.scatter(X_demean[:,0],X_demean[:,1])
plt.show()
# 2.计算协方差矩阵
C=X_demean.T@X_demean/len(X)
print(C)
# 3.计算特征值和特征向量
U,S,V=np.linalg.svd(C)
# 要将二维转化为一维,所有我们取第一个特征值的特征向量
U1=U[:,0]
# 4.实现降维
X_reduction=X_demean@U1
# 绘制降维的那条直线
plt.figure()
plt.scatter(X_demean[:,0],X_demean[:,1])
plt.plot([0,U1[0]],[0,U1[1]],c='r')
plt.show()
# 5.还原数据
X_restore=X_reduction.reshape(50,1)@U1.reshape(1,2)+np.mean(X,axis=0)
结果展示: