import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 数据读取
data = pd.read_csv('data.csv')
list = data.values.tolist()
X = np.array(list)
# 特征归一化
X_demean = (X - np.mean(X))
# 归一化后得数据散点图
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.scatter(X_demean[:, 0], X_demean[:, 1], s=15)
# 计算协方差矩阵
sigma = (X_demean.T @ X_demean)/X_demean.shape[0]
# 奇异值分解
u, s, v = np.linalg.svd(sigma)
# 降维
u_reduced = u[:, :1]
z = np.dot(X_demean, u_reduced)
# 维度恢复
u_reduced = u[:, :1]
X_recover = np.dot(z, u_reduced.T)
# 维度恢复后的数据散点图
plt.subplot(1, 2, 2)
plt.scatter(X_recover[:, 0], X_recover[:, 1], s=15)
plt.show()
结果如下: