Python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
# 1、定义基础参数(贴合数学符号)
n = 200 # 样本数量(对应n个样本x_i,1≤i≤n)
d = 5 # 原始特征维度(x_i∈R^d)
l = 2 # 降维后目标维度(映射矩阵W为d×l)
random_state=42 # 随机种子,保证结果可复现

# 2、生成模拟数据集+标准化(保证各维度均值为0)
# 生成n个d维样本(模拟真实数据)
X,_ = make_blobs(n_samples=n,n_features=d,centers=3,random_state=random_state)
print(f"原始数据矩阵x维度:nxd={X.shape}")

# 标准化:确保每一维度特征均值为0(贴合“假定均值为零”前提)
X_mean=np.mean(X,axis=0) # 计算各维度均值
X_standard = X - X_mean # 中心化(均值归零)
print(f"标准化后数据均值(各维度):{np.round(np.mean(X_standard,axis=0),6)}") # 验证均值≈0

# 3、核心步骤:求解PCA映射矩阵W
# 步骤3.1:计算协方差矩阵(dxd),反映维度间的相关性
cov_matrix=np.cov(X_standard,rowvar=False) #rowvar=False:每行是样本,每列是特征
print(f"协方差矩阵维度:dxd={cov_matrix.shape}")

# 步骤3.2:求解协方差矩阵的特征值(λ)和特征向量(v)
eigenvalues,eigenvectors = np.linalg.eig(cov_matrix)
# 特征值λ:反映主成分的方差贡献;特征向量v:每一列是一个特征向量(v_j∈R^d)

# 步骤3.3:按特征值从大到小排序,选择前1个特征向量构建映射矩阵W(dx1)
sorted_idx =np.argsort(eigenvalues)[::-1] # 特征值降序索引
W =eigenvectors[:,sorted_idx[:l]] # 构建dxl的映射矩阵W
print(f"映射矩阵w维度:dxl={W.shape}")

# 4.数据降维:Y=X·W(标准化后数据映射)
# 所有样本降维:Y(nxl)=X_standard(nxd)·W(dx1)
Y = np.dot(X_standard,W)
print(f"降维后数据矩阵Y维度:nxl={Y.shape}")

# 单个样本映射验证:x_i(1×d)·W(dxl)→降维为l维向量
x_i=X_standard[0] # 取第一个样本x_1(1xd)
y_i=np.dot(x_i,W)# 单个样本降维
print(f"\n单个样本x_1降维验证:")
print(f"原始x_1维度:1xd={x_i.shape}→降维后y_1维度:1xl={y_i.shape}")
原始数据矩阵x维度:nxd=(200, 5)
标准化后数据均值(各维度):[ 0.  0.  0. -0. -0.]
协方差矩阵维度:dxd=(5, 5)
映射矩阵w维度:dxl=(5, 2)
降维后数据矩阵Y维度:nxl=(200, 2)
单个样本x_1降维验证:
原始x_1维度:1xd=(5,)→降维后y_1维度:1xl=(2,)