原文链接:(18条消息) 奇异值分解(SVD)几何意义_chuanye9781的博客-CSDN博客
代码:
import numpy as np
import matplotlib.pyplot as plt
if __name__ == "__main__":
# 生成原始数据
ori = np.array([np.arange(0, 10, dtype=float) for i in range(2)]) + np.random.rand(2, 10) - 0.5
# SVD
U, S, V = np.linalg.svd(ori)
# 重建原始数据,
N = 1 # 重建时保留特征根的个数,最大为2
ans = np.zeros((2, 10))
for i in range(N):
ans += S[i] * np.matmul(np.reshape(U[:, i], (2, 1)), np.reshape(V[i, :].T, (1, 10)))
# 绘图比较
plt.scatter(ans[0], ans[1], color='red')
plt.scatter(ori[0], ori[1], color='blue')
plt.plot([-1, 10], [-1, 10])
plt.show()
结果如下:
红色的点是只保留第一个特征值的结果,蓝色的点是原始数据,可以看见红色数据保留了大部分特征。