典型关联分析(CCA)原理总结

这个博主讲的很详细

下面的代码是从知乎一个答主那搬运过来的

import numpy as np
from scipy import linalg
class CCA:
    def __init__(self):
        self.a = None
        self.b = None

    def train(self, X, Y):
        Nx, cx = X.shape
        Ny, cy = Y.shape

        # 标准化 (N, C)
        X = (X - np.mean(X, 0)) / np.std(X, 0)
        Y = (Y - np.mean(Y, 0)) / np.std(Y, 0)

        # 求三个S
        data = np.concatenate([X, Y], axis = 1)
        cov = np.cov(data, rowvar=False)
        N, C = cov.shape
        Sxx = cov[0:cx, 0:cx]
        Syy = cov[cx:C, cx:C]
        Sxy = cov[0:cx, cx:C]
        Sxx_ = linalg.sqrtm(np.linalg.inv(Sxx))
        Syy_ = linalg.sqrtm(np.linalg.inv(Syy))
        M = Sxx_.T.dot(Sxy.dot(Syy_))
        U, S, V = np.linalg.svd(M, full_matrices=False)
        u = U[:, 0]
        v = V[0, :]
        self.a = Sxx_.dot(u)
        self.b = Syy_.dot(v)

    def predict(self, X, Y):
        X_ = X.dot(self.a)
        Y_ = Y.dot(self.b)
        return X_, Y_

    def cal_corrcoef(self, X, Y):
        X_, Y_ = self.predict(X, Y)
        return np.corrcoef(X_, Y_)[0,1]
# test
n = 500
# 2 latents vars:
l1 = np.random.normal(size=n)
l2 = np.random.normal(size=n)

latents = np.array([l1, l1, l2, l2]).T
X = latents + np.random.normal(size=4 * n).reshape((n, 4))
Y = latents + np.random.normal(size=4 * n).reshape((n, 4))

X_train = X[:n // 2]
Y_train = Y[:n // 2]
X_test = X[n // 2:]
Y_test = Y[n // 2:]
print (X_train.shape)
(250, 4)
# my cca
clf = CCA()
clf.train(X_train, Y_train)
print (clf.cal_corrcoef(X_train, Y_train))
print (clf.cal_corrcoef(X_test, Y_test))
# 0.7200173442101319
# 0.671638992091987
# compare with sklearn
from sklearn.cross_decomposition import CCA
cca_sklearn = CCA(n_components=1)
cca_sklearn.fit(X_train, Y_train)
X_c, Y_c = cca_sklearn.transform(X_train, Y_train)
X_c_, Y_c_ = cca_sklearn.transform(X_test, Y_test)
print (np.corrcoef(X_c[:,0], Y_c[:, 0])[0,1])
print (np.corrcoef(X_c_[:, 0], Y_c_[:, 0])[0,1])
# 0.7202109376634042
# 0.6719982185448227
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CCACanonical Correlation Analysis)典型相关分析是一种多元统计分析方法,用于研究两组变量之间的线性关系。其基本思想是将两组变量通过线性变换映射到低维空间中,使得两组变量在该空间中的相关性最大。具体来说,CCA通过构造Lagrangian等式,利用拉格朗日乘子法求解出两组变量的典型相关变量,即两组变量在低维空间中的投影向量,从而得到它们之间的典型相关系数。典型相关系数越大,说明两组变量之间的相关性越强。 在实际应用中,CCA可以用于数据降维、特征提取、模式识别等领域。例如,在故障检测中,可以利用CCA来分析传感器数据和故障模式之间的关系,从而实现故障检测和诊断。 代码示例: ```python import numpy as np from scipy.linalg import eig # 构造两组变量X和Y X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) Y = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]]) # 计算X和Y的协方差矩阵 Cxx = np.cov(X.T) Cyy = np.cov(Y.T) Cxy = np.cov(X.T, Y.T) # 计算广义特征值和广义特征向量 eigvals, eigvecs = eig(np.dot(np.dot(np.linalg.inv(Cxx), Cxy), np.dot(np.linalg.inv(Cyy), Cxy.T))) # 取前k个最大的广义特征值对应的广义特征向量 k = 2 idx = np.argsort(eigvals)[::-1][:k] Wx = eigvecs[:, idx].real Wy = np.dot(np.dot(np.linalg.inv(Cyy), Cxy.T), Wx).real # 计算典型相关变量 U = np.dot(X, Wx) V = np.dot(Y, Wy) # 计算典型相关系数 R = np.corrcoef(U.T, V.T)[k:, :k] print("典型相关系数:", R) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值