基于python实现POD(本征正交分解)

前言

POD(本征正交分解),也称为PCA(主成分分析,是一种常用的数据降维方法,其具体的数学原理可以参考张洋老师的文章【PCA的数学原理-张洋】,本文基于具体算例,利用python实现POD方法。

POD算法步骤

假设有m条n维数据

1)将原始数据按列组成n行m列矩阵X

2)将X的每一行进行零均值化,即减去这一行的均值

3)求出协方差矩阵$C=\frac{1}{m}XX^\mathsf{T}$

4)求出协方差矩阵C的特征值即对应的特征向量

5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P

6)$Y=PX$即为降维到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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值