前言
POD(本征正交分解),也称为PCA(主成分分析,是一种常用的数据降维方法,其具体的数学原理可以参考张洋老师的文章【PCA的数学原理-张洋】,本文基于具体算例,利用python实现POD方法。
POD算法步骤
假设有m条n维数据
1)将原始数据按列组成n行m列矩阵X
2)将X的每一行进行零均值化,即减去这一行的均值
3)求出协方差矩阵
4)求出协方差矩阵C的特征值即对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
6)即为降维到k维后的数据矩阵
python代码实现
import numpy as np
import scipy.io as io
def POD():
#加载数据
data = io.loadmat('./Data/POD_data')
POD_data = data['POD_data'].astype(np.float32)
X = np.transpose(POD_data)
#将X得每一行进行零均值化
X_mean = np.mean(X, axis=1, keepdims=True)
X = X - X_mean
#获取列数
m = X.shape[1]
#求出协方差矩阵
C = (1/m)*np.dot(X, X.T)
# 求矩阵的特征值和特征向量
C_lam, C_phi = np.linalg.eig(C)
# 对特征值进行排序,并返回排序后的索引
indices = np.argsort(C_lam)[::-1] # 从大到小排序
# 根据排序后的索引重新排列特征值和特征向量
C_lam = C_lam[indices]
C_phi = C_phi[:, indices] # 对所有列进行重新排列
k = 4
#取前k行组成P
P = np.transpose(C_phi[:, :k])
#求出降维后的数据Y
Y = np.dot(P, X)
return Y
在流体力学领域中,我们通常要求前k个模态所占能量的百分比大于99%,可以添加如下代码来计算前k个模态所占能量百分比:
#计算特征值的累积和
C_cumsum = np.cumsum(C_lam)
#计算前几个模态所占的能量百分比
C_per = C_cumsum[k-1]/C_cumsum[-1]