典型相关分析(Canonical Correlation Analysis,CCA)原理及Python、MATLAB实现

简介: 典型相关分析(Canonical Correlation Analysis,CCA)原理及Python、MATLAB实现

随着对CCA的深入研究,是时候对CCA进行一下总结了。

本菜鸡主要研究方向为故障诊断,故会带着从应用角度进行理解。

image.png

典型相关分析

基本原理

从字面意义上理解CCA,我们可以知道,简单说来就是对不同变量之间做相关分析。较为专业的说就是,一种度量两组变量之间相关程度的多元统计方法。


关于相似性度量距离问题,在这里有一篇Blog可以参考参考。


首先,从基本的入手。


当我们需要对两个变量X , Y 进行相关关系分析时,则常常会用到相关系数来反映。学过概率统计的小伙伴应该都知道的吧。还是解释一下。


相关系数:是一种用以反映变量之间相关关系密切程度的统计指标。相关系数是按积差方法计算,同样以两变量与各自平均值的离差为基础,通过两个离差相乘来反映两变量之间相关程度;着重研究线性的单相关系数。

image.png

image.png

复习了一下大学本科概率统计知识,那么,如果我们需要分析的对象是两组或者多组向量,又该怎么做呢?

CCA的数学表达

image.png

image.png

我们会得到一个这样的矩阵:

image.png

这样的话,我们把每个变量的相关系数都求了出来,不知道会不会和我一样觉得这样很繁琐呢。如果我们能找到两组变量之间的各自的线性组合,那么我们就只分析讨论线性组合之间的相关分析。


典型相关系数:是先对原来各组变量进行主成分分析,得到新的线性关系的综合指标,再通过综合指标之间的线性相关系数来研究原各组变量间相关关系。


现在我们利用主成分分析(PCA)的思想,可以把多个变量与多个变量之间的相关转化成两个变量之间的相关。

image.png

image.png

image.png

image.png

image.png

典型相关分析最朴素的思想:首先分别在每组变量中找出第一对典型变量,使其具有最大相关性,然后在每组变量中找出第二对典型变量,使其分别与本组内的第一对典型变量不相关,第二对本身具有次大的相关性。如此下去,直到进行到K步,两组变量的相关系被提取完为止,可以得到K组变量。

So

image.png

image.png

image.png

image.png

image.png

image.png

image.png

典型相关系数及变量的求法

image.png

(一起来复习高数–拉格朗日乘数法)


前提条件,我们有个计算公式,约束条件也有了,故这是一个求解条件极值题呀!!!


列出我们的拉格朗日函数:

image.png

image.png

image.png

也就是

image.png

image.png

image.png

image.png

image.png

image.png

我们由式

image.png

可得

image.png

image.png

image.png

image.png

image.png

image.png

典型相关分析应用

基于 CCA 的故障检测方法

对于CCA应用在故障检测中,基于 CCA 的故障检测方法可以视为基于 PCA 和基于 PLS 故障检测方法的一种扩展。


基本思想:是利用典型相关关系构建一个残差发生器, 通过对残差信号的评价做出故障检测的相应决策。该方法中提出了 4 个统计量, 将输入空间分为两个部分, 即与输出空间相关的子空间和与输出空间不相关的子空间;同理,将输出空间分为两个部分, 即与输入空间相关的子空间和与输入空间不相关的子空间。

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

结合 CCA 方法, 可得:

image.png

image.png

但是在实际系统中, 测量变量难免受到噪声影响, 两者之间的相关性可表示为:

image.png

image.png

image.png

image.png

image.png

image.png

同理, 还可以得到另一残差向量

image.png

其协方差矩阵

image.png

由式(9)(11) 可以看出, 残差 r1和 r2的协方差相同。 对于故障检测, 可构造如下两个统计量:

image.png

image.png

image.png

同理, 为了检测发生在输入空间且与输出不相关的那部分故障, 可构造另一统计量

image.png

image.png

image.png

Python代码

## 通过sklearn工具包内置的CCA实现
import numpy as np
from sklearn.cross_decomposition import CCA
from icecream import ic   # ic用于显示,类似于print
A = [[3, 4, 5, 6, 7] for i in range(2000)] 
B = [[8, 9, 10, 11, 12] for i in range(2000)] 
# 注意在A、B中的数为输入变量及输出变量参数
# 建模
cca = CCA(n_components=1)  # 若想计算第二主成分对应的相关系数,则令cca = CCA(n_components=2)
# 训练数据
cca.fit(X, Y)
# 降维操作
X_train_r, Y_train_r = cca.transform(X, Y)
#输出相关系数
ic(np.corrcoef(X_train_r[:, 0], Y_train_r[:, 0])[0, 1])  #如果想计算第二主成分对应的相关系数 print(np.corrcoef(X_train_r[:, 1], Y_train_r[:, 1])[0, 1])

另有一个包含可视化CCA的Python代码在 这里

Matlab代码

function[ccaEigvector1, ccaEigvector2] = CCA(data1, data2)
dataLen1 = size(data1, 2);
dataLen2 = size(data2, 2);
% Construct the scatter of each view and the scatter between them
data = [data1 data2];
covariance = cov(data);
% Sxx = covariance(1 : dataLen1, 1 : dataLen1) + eye(dataLen1) * 10^(-7);
Sxx = covariance(1 : dataLen1, 1 : dataLen1);
% Syy = covariance(dataLen1 + 1 : size(covariance, 2), dataLen1 + 1 : size(covariance, 2)) ...
% + eye(dataLen2) * 10^(-7);
Syy = covariance(dataLen1 + 1 : size(covariance, 2), dataLen1 + 1 : size(covariance, 2));
Sxy = covariance(1 : dataLen1, dataLen1 + 1 : size(covariance, 2));
% Syx = Sxy';
% using SVD to compute the projection
Hx = (Sxx)^(-1/2);
Hy = (Syy)^(-1/2);
H = Hx * Sxy * Hy;
[U, D, V] = svd(H, 'econ');
ccaEigvector1 = Hx * U;
ccaEigvector2 = Hy * V;
% make the canonical correlation variable has unit variance
ccaEigvector1 = ccaEigvector1 * diag(diag((eye(size(ccaEigvector1, 2)) ./ sqrt(ccaEigvector1' * Sxx * ccaEigvector1))));
ccaEigvector2 = ccaEigvector2 * diag(diag((eye(size(ccaEigvector2, 2)) ./ sqrt(ccaEigvector2' * Syy * ccaEigvector2))));
end



相关文章
|
13天前
|
数据挖掘 Python
【视频】随机波动率SV模型原理和Python对标普SP500股票指数预测|数据分享
【视频】随机波动率SV模型原理和Python对标普SP500股票指数预测|数据分享
|
13天前
|
机器学习/深度学习 人工智能 算法
机械视觉:原理、应用及Python代码示例
机械视觉:原理、应用及Python代码示例
|
13天前
|
机器学习/深度学习 人工智能 自动驾驶
人工智能:原理、应用与Python代码实现
人工智能:原理、应用与Python代码实现
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
人工智能:原理、应用与Python代码示例
人工智能:原理、应用与Python代码示例
|
20小时前
参与辅助服务的用户侧储能优化配置及经济分析(matlab代码)
参与辅助服务的用户侧储能优化配置及经济分析(matlab代码)
|
2天前
|
存储 Python
【Python 基础】解释reduce函数的工作原理
【5月更文挑战第6天】【Python 基础】解释reduce函数的工作原理
|
2天前
|
Python
【Python 基础】解释map函数的工作原理
【5月更文挑战第6天】【Python 基础】解释map函数的工作原理
|
6天前
|
算法 异构计算
基于直方图的图像曝光量分析FPGA实现,包含tb测试文件和MATLAB辅助验证
该内容包括了算法的运行效果展示、软件版本信息、理论概述和核心程序代码。在正常图像中,`checkb`位于`f192b`和`f250b`之间,而多度曝光图像中`checkb`超出此范围,判断为曝光过度。使用的软件为Vivado 2019.2和MATLAB 2022a。理论依据未详细给出,但提及主要方法。提供的Verilog代码段用于处理图像数据,包括读取文件、时钟控制及图像histogram计算等,其中模块`im_hist`似乎是关键部分。
|
8天前
|
机器学习/深度学习 PyTorch TensorFlow
【Python机器学习专栏】卷积神经网络(CNN)的原理与应用
【4月更文挑战第30天】本文介绍了卷积神经网络(CNN)的基本原理和结构组成,包括卷积层、激活函数、池化层和全连接层。CNN在图像识别等领域表现出色,其层次结构能逐步提取特征。在Python中,可利用TensorFlow或PyTorch构建CNN模型,示例代码展示了使用TensorFlow Keras API创建简单CNN的过程。CNN作为强大深度学习模型,未来仍有广阔发展空间。
|
8天前
|
机器学习/深度学习 算法 数据可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化

热门文章

最新文章