
上次笔记,完成了第十七章Numpy关于几个常见的矩阵分解的知识,包括:Cholesky分解、特征值分解(EVD)、奇异值分解(SVD)。
今天的学习内容,做一下书本提供的练习题。
--
练习:

norms = [np.linalg.norm(col, ord=2) for col in cols] units = [col / norm for col, norm in zip(cols, norms)] G = X.T @ X的 (i,j)元素恰好是第 i列与第 j列的内积)inner_prods = np.zeros((4, 4))for i in range(4):for j in range(4):inner_prods[i, j] = np.dot(cols[i], cols[j])
angles_rad = np.zeros((4, 4))for i in range(4):for j in range(4):if norms[i] * norms[j] == 0:angles_rad[i, j] = 0 # 避免除以0(实际数据无此情况)else:angles_rad[i, j] = np.arccos(inner_prods[i, j] / (norms[i] * norms[j]))angles_deg = np.rad2deg(angles_rad)
# 第一种解法# 直接计算第2列(索引1)与第3列(索引2)的内积g_23 = np.dot(X[:, 1], X[:, 2])print("G的第2行第3列元素:", g_23)# 第二种解法:# 通过格拉姆矩阵计算# 无需手动遍历,直接用点积即可。G = X.T @ Xprint("通过G直接取值:", G[1, 2])
# 计算特征值分解eigvals, eigvecs = np.linalg.eig(G)
# 计算奇异值分解U, S, VT = np.linalg.svd(A)
import numpy as npfrom sklearn.datasets import load_irisimport matplotlib.pyplot as plt# 1. 加载鸢尾花数据iris = load_iris()X = iris.data # 形状: (150, 4)# 2. 计算格拉姆矩阵(图17.6(a))G = X.T @ Xprint("格拉姆矩阵 G 的形状:", G.shape)print("\n格拉姆矩阵 G 的前几行前几列:")print(G[:4, :4])# 3. 对格拉姆矩阵进行特征值分解(Q4要求)eigenvalues, eigenvectors = np.linalg.eig(G)print("\n格拉姆矩阵的特征值(未排序):")print(eigenvalues)print("\n特征值之和(等于G的迹):", np.sum(eigenvalues))# 4. 对X进行奇异值分解(Q5要求)U, S, VT = np.linalg.svd(X, full_matrices=False)print("\nX的奇异值 S:")print(S)print("\n奇异值的平方 S²:")print(S**2)# 5. 比较特征值和奇异值平方的关系print("\n" + "="*60)print("特征值与奇异值平方的比较:")for i in range(4):print(f"λ{i+1} = {eigenvalues[i]:.4f}, σ{i+1}² = {S[i]**
---
笔记写于:2026年4月21日22:58:30
结束于:2026年4月21日23:45:03
用时:约1小时
--