【数学建模】常用算法-主成分分析PCA的Python实现

1前言

本文主要讲解主成分分析析法(PCA)的python实现,后续会跟进实例分析

2 原理-代码实现

2.1 实现步骤

主成分分析PCA是一种应用广泛的和降维方法,对其实现做以下归纳在这里插入图片描述

2.2 代码实现

导入包

import numpy as np
  • 定义计算协方差矩阵函数
    X为输入的数据,m为样本数据的条数,也就是X的行数。
    对X进行标准化,方法为:减去均值除以方差,这部分的原理不懂的可以百度一下。
    标准化之后的数据就是均值为0,方差为1的标准正态分布。
# 计算协方差矩阵
def calc_cov(X):
    m = X.shape[0] # 样本的数量,行数
    # 数据标准化
    X = (X - np.mean(X, axis=0)) / np.var(X, axis=0) # 标准化之后均值为0,方差为1
    return 1 / m * np.matmul(X.T, X) # matmul为两个矩阵的乘积
  • 定义PCA的流程
    首先计算输入数据X的协方差,然后计算其特征值记为:eigenvalues,计算其特征向量记为:eigenvectors
    计算特征值和特征向量用的是 np.linalg.eig()函数,使用起来十分方便
    然后接下来就是计算出矩阵P,用Y=XP计算出降维后的数据Y
def pca(X, n_components):
    # 计算协方差矩阵
    cov_matrix = calc_cov(X)
    # 计算协方差矩阵的特征值和对应特征向量
    eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # eigenvalues特征值,eigenvectors特征向量
    # 对特征值排序
    idx = eigenvalues.argsort()[::-1]
    # 取最大的前n_component组
    eigenvectors = eigenvectors[:, idx]
    eigenvectors = eigenvectors[:, :n_components]
    # Y=XP转换
    return np.matmul(X, eigenvectors)

2.3鸢尾花数据集例子

导入数据

from sklearn import datasets
import matplotlib.pyplot as plt
# 导入鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target

查看数据的形状,其结果为(150, 4)

X.shape
# (150, 4)

计算协方差矩阵

cov_matrix = calc_cov(X) # 计算特征值
cov_matrix

在这里插入图片描述
可以看到协方差矩阵为4*4的矩阵,然后我们计算该矩阵的特征值和特征向量

eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # eigenvalues特征值,eigenvectors特征向量

在这里插入图片描述
然后计算我们需要的P,这里我们保留3个主成分

idx = eigenvalues.argsort()[::-1]
# 取最大的前n_component组
eigenvectors = eigenvectors[:, idx]
eigenvectors = eigenvectors[:, :3]

得到了一个4行3列的矩阵
在这里插入图片描述
然后利用P求得降维后的数据

# Y=PX转换
np.matmul(X, eigenvectors)

降维后的数据为(150, 4)*(4, 3)=(150, 3)
也就是150条,3列的数据,数据由原来的4维降低到了3维
在这里插入图片描述

3 基于Sklearn的实现

# 导入sklearn降维模块
from sklearn import decomposition
# 创建pca模型实例,主成分个数为3个
pca = decomposition.PCA(n_components=3) # 写我们需要几个主成分
# 模型拟合
pca.fit(X)
# 拟合模型并将模型应用于数据X
X_trans = pca.transform(X)

# 颜色列表
colors = ['navy', 'turquoise', 'darkorange']
# 绘制不同类别
for c, i, target_name in zip(colors, [0,1,2], iris.target_names):
    plt.scatter(X_trans[y == i, 0], X_trans[y == i, 1], 
            color=c, lw=2, label=target_name)
# 添加图例
plt.legend()
plt.show()

在这里插入图片描述

  • 2
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
动态主成分分析(Dynamic Principal Component Analysis,DPCA)是一种在时间序列数据中提取动态特征的方法,它可以将时间序列数据映射到低维空间中,从而揭示出数据的基本结构和动态变化规律。下面是Python实现DPCA的示例代码: 首先,我们需要导入所需的库: ```python import numpy as np from sklearn.decomposition import PCA ``` 接下来,我们定义一个函数`DPCA`,它实现了DPCA算法的核心部分: ```python def DPCA(X, L, K): """ 动态主成分分析(Dynamic PCA)算法 :param X: 输入数据矩阵,每一行为一个时间步的数据 :param L: 保留的主成分个数 :param K: 时间窗口大小 :return: 投影矩阵P,重构矩阵T """ N, D = X.shape P = np.zeros((D, L)) T = np.zeros((N, L)) pca = PCA(n_components=L) for i in range(0, N-K+1): X_k = X[i:i+K, :] Z_k = pca.fit_transform(X_k) P_k = pca.components_.T T_k = np.dot(X_k, P_k) P = P + P_k T[i:i+K, :] = T[i:i+K, :] + T_k P = P / (N-K+1) T = T / np.sqrt(N-K+1) return P, T ``` 其中,`X`是输入数据矩阵,每一行为一个时间步的数据;`L`是保留的主成分个数;`K`是时间窗口大小。函数返回投影矩阵`P`和重构矩阵`T`。 接下来,我们生成一个随机时间序列数据,并对其进行DPCA分析: ```python # 生成随机时间序列数据 N = 1000 D = 10 X = np.random.randn(N, D) # 执行动态主成分分析 L = 3 K = 10 P, T = DPCA(X, L, K) # 输出结果 print("投影矩阵:") print(P) print("重构矩阵:") print(T) ``` 运行以上代码,即可得到投影矩阵和重构矩阵的结果。需要注意的是,DPCA算法是一种基于时间窗口的方法,因此在实际应用中需要根据具体问题选择合适的时间窗口大小。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一川风絮千片雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值