《应用多元统计分析》第十章 典型相关分析(CCA)如何求样本典型系数向量 原理+例子求解 您所在的位置:网站首页 xy协方差矩阵的例题 《应用多元统计分析》第十章 典型相关分析(CCA)如何求样本典型系数向量 原理+例子求解

《应用多元统计分析》第十章 典型相关分析(CCA)如何求样本典型系数向量 原理+例子求解

2024-07-03 22:45| 来源: 网络整理| 查看: 265

1.基本原理

典型相关分析(Canonical Correlation Analysis, CCA)是一种多元统计方法,用于探索两组变量之间的关系。在典型相关分析中,我们试图找到两组变量中各自的线性组合,使这两组线性组合之间的相关性最大化。 具体来说,假设我们有两组变量集合 X = { X 1 , X 2 , … , X m } X = \{X_1, X_2, \ldots, X_m\} X={X1​,X2​,…,Xm​} 和 Y = { Y 1 , Y 2 , … , Y n } Y = \{Y_1, Y_2, \ldots, Y_n\} Y={Y1​,Y2​,…,Yn​}。CCA的目标是找到一对线性组合 U = a 1 X 1 + a 2 X 2 + … + a m X m U = a_1X_1 + a_2X_2 + \ldots + a_mX_m U=a1​X1​+a2​X2​+…+am​Xm​ 和 V = b 1 Y 1 + b 2 Y 2 + … + b n Y n V = b_1Y_1 + b_2Y_2 + \ldots + b_nY_n V=b1​Y1​+b2​Y2​+…+bn​Yn​,使得 U U U和 V V V之间的相关系数尽可能大。

2.实现步骤 标准化变量:由于不同变量可能有不同的量纲和量级,首先需要对它们进行标准化处理。计算相关矩阵:计算两组变量内部以及交叉之间的相关矩阵。求解特征值和特征向量:通过求解相关矩阵的特征值和特征向量来找到最优的线性组合。 这里求解一般有两种,从相关矩阵出发,从样本出发,两种虽然初始数据不同,但最终求解方式是相同的,符号有所不同,对应替代就行 相关矩阵出发 一般会知道 R = ( R 11 R 12 R 21 R 22 ) R=\begin{pmatrix} R_{11} & R_{12} \\ R_{21} & R_{22}\\ \end{pmatrix} R=(R11​R21​​R12​R22​​), R R R是相关矩阵,这里就需要求到 R 11 − 1 R 12 R 22 − 1 R 21 R^{-1}_{11} R_{12} R^{-1}_{22} R_{21} R11−1​R12​R22−1​R21​对应的特征根和特征向量,注意从大到小排序,最后的第 i i i典型系数向量什么的都是按照这个排序的,这里就求到了 a i ∗ a^*_i ai∗​对应的特征向量 a i a_i ai​,但还不是最终的典型系数向量,还需要标准化一波。同理 R 22 − 1 R 21 R 11 − 1 R 12 R^{-1}_{22} R_{21} R^{-1}_{11} R_{12} R22−1​R21​R11−1​R12​对应的特征向量和特征值也能求,这样就求到了 b i ∗ b^*_i bi∗​对应的特征向量 b i b_i bi​,留着后续用。样本出发 其实样本出发也就是一个用样本的思想估计整体的思想,什么大数定律那一团乱七八糟的,反正你就求出来样本协方差矩阵 S = ( S 11 S 12 S 21 S 22 ) S=\begin{pmatrix} S_{11} & S_{12} \\ S_{21} & S_{22}\\ \end{pmatrix} S=(S11​S21​​S12​S22​​),然后再用S去估计 Σ \Sigma Σ就行,估计完以后,还是跟前面一样,均值,标准化,求出相关矩阵 R R R,接下来就跟上面一样做就行。 形成典型变量:利用求得的特征向量构建典型变量。 这一步的精华主要还是要构建典型系数向量,主要原因是需要满足约束条件 a i ′ Σ 11 a i = 1 a'_i\Sigma_{11}a_i=1 ai′​Σ11​ai​=1和 b i ′ Σ 11 b i = 1 b'_i\Sigma_{11}b_i=1 bi′​Σ11​bi​=1,要求两个特征向量满足这个可以构造一个 k = a ′ R 11 a k = \sqrt{a'R_{11}a} k=a′R11​a ​( k = b ′ R 11 b k = \sqrt{b'R_{11}b} k=b′R11​b ​),令 a ∗ = a k a^*= \frac{a}{k} a∗=ka​( b ∗ = b k b^*= \frac{b}{k} b∗=kb​),这样就求到对应的典型系数向量。证明如下 [ a ′ ∗ R 11 a ∗ = ( a k ) ′ R 11 ( a k ) ] [ = 1 k 2 a ′ R 11 a ] [ a'^{*}R_{11}a^* = \left(\frac{a}{k}\right)'R_{11}\left(\frac{a}{k}\right) ] [ = \frac{1}{k^2} a'R_{11}a ] [a′∗R11​a∗=(ka​)′R11​(ka​)][=k21​a′R11​a]由于 ( k = a ′ R 11 a ) ( k = \sqrt{a'R_{11}a} ) (k=a′R11​a ​),所以 ( k 2 = a ′ R 11 a ) ( k^2 = a'R_{11}a ) (k2=a′R11​a)。因此,上式变为: [ 1 k 2 a ′ R 11 a = 1 a ′ R 11 a a ′ R 11 a = 1 ] [ \frac{1}{k^2} a'R_{11}a = \frac{1}{a'R_{11}a} a'R_{11}a = 1 ] [k21​a′R11​a=a′R11​a1​a′R11​a=1] 分析和解释:分析典型相关系数以及对应的典型变量,从中获得变量间的关系和影响。 具体实现我们通过例子出发求解 3.例子

在这里插入图片描述 按照上述步骤,首先求出 R 11 − 1 R 12 R 22 − 1 R 21 R^{-1}_{11} R_{12} R^{-1}_{22} R_{21} R11−1​R12​R22−1​R21​对应的特征根和特征向量 a i a_i ai​,从大到小排序,紧接着令 ( k = a ′ R 11 a ) ( k = \sqrt{a'R_{11}a} ) (k=a′R11​a ​),得到 a ∗ = a k a^*= \frac{a}{k} a∗=ka​即为最终的典型系数向量。作者太懒了,没有手算,下附程序

def calu_canonical_coefficients(eigenvalues1,eigenvectors1): indices = np.argsort(eigenvalues1)[::-1] # 从大到小排序 sorted_eigenvalues = eigenvalues1[indices] sorted_eigenvectors = eigenvectors1[:, indices] # 初始化一个列表来保存标准化的典型系数向量 standardized_canonical_coefficients = [] # 对每个特征向量进行标准化 for i in range(len(sorted_eigenvalues)): a = sorted_eigenvectors[:, i] k = math.sqrt(np.dot(np.dot(a.T, R11), a)) a_standardized = a / k standardized_canonical_coefficients.append(a_standardized) return standardized_canonical_coefficients import numpy as np R=[[1.0000,0.6328,0.2412,0.0586], [0.6328,1.0000,-0.0553,0.0655], [0.2412 ,-0.0553,1.0000,0.4248], [0.0586,0.0655,0.4248,1.0000]] R=np.array(R) R11=R[:2,:2] R12=R[:2,2:4] R21=R[2:4,:2] R22=R[2:4,2:4] R11_inv=np.linalg.inv(R11) R22_inv=np.linalg.inv(R22) A1=np.dot(np.dot(np.dot(R11_inv,R12),R22_inv),R21) eigenvalues1, eigenvectors1 = np.linalg.eig(A1) print('初始特征向量a',eigenvectors1) B1=np.dot(np.dot(np.dot(R22_inv,R21),R11_inv),R12) eigenvalues2, eigenvectors2 = np.linalg.eig(B1) print('初始特征向量b',eigenvectors2) standardized_canonical_coefficients_a=calu_canonical_coefficients(eigenvalues1,eigenvectors1) standardized_canonical_coefficients_b=calu_canonical_coefficients(eigenvalues2,eigenvectors2) print('最终典型系数向量a*') for i, coeff in enumerate(standardized_canonical_coefficients_a): print(f"Canonical Coefficient Vector {i+1}:\n{coeff}\n") print('最终典型系数向量b*') for i, coeff in enumerate(standardized_canonical_coefficients_b): print(f"Canonical Coefficient Vector {i+1}:\n{coeff}\n")

结果如下:

在这里插入图片描述 感觉 b ∗ b^* b∗要么答案错了,要么我错了,有发现问题的欢迎纠正。

求出这个以后,那么直接将系数向量带入就行,看看参考答案 在这里插入图片描述在这里插入图片描述



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有