典型关联分析(Canonical Correlation Analysis,以下简称CCA)是最常用的挖掘数据关联关系的算法之一。比如我们拿到两组数据,第一组是人身高和体重的数据,第二组是对应的跑步能力和跳远能力的数据。那么我们能不能说这两组数据是相关的呢?CCA可以帮助我们分析这个问题。

1. CCA概述

    在数理统计里面,我们都知道相关系数这个概念。假设有两组一维的数据集X和Y,则相关系数$\rho$的定义为:$$\rho(X,Y) = \frac{cov(X,Y)}{\sqrt{D(X)}\sqrt{D(Y)}}$$

    其中$cov(X,Y)$是X和Y的协方差,而$D(X), D(Y)$分别是X和Y的方差。相关系数$\rho$的取值为[-1,1], $\rho$的绝对值越接近于1,则X和Y的线性相关性越高。越接近于0,则X和Y的线性相关性越低。

    虽然相关系数可以很好的帮我们分析一维数据的相关性,但是对于高维数据就不能直接使用了。拿上面我们提到的,如果X是包括人身高和体重两个维度的数据,而Y是包括跑步能力和跳远能力两个维度的数据,就不能直接使用相关系数的方法。那我们能不能变通一下呢?CCA给了我们变通的方法。

    CCA使用的方法是将多维的X和Y都用线性变换为1维的X'和Y',然后再使用相关系数来看X'和Y'的相关性。将数据从多维变到1位,也可以理解为CCA是在进行降维,将高维数据降到1维,然后再用相关系数进行相关性的分析。下面我们看看CCA的算法思想。

2. CCA的算法思想

    上面我们提到CCA是将高维的两组数据分别降维到1维,然后用相关系数分析相关性。但是有一个问题是,降维的标准是如何选择的呢?回想下主成分分析PCA,降维的原则是投影方差最大;再回想下线性判别分析LDA,降维的原则是同类的投影方差小,异类间的投影方差大。对于我们的CCA,它选择的投影标准是降维到1维后,两组数据的相关系数最大。

    现在我们具体来讨论下CCA的算法思想。假设我们的数据集是X和Y,X为$m \times n_1$的样本矩阵。Y为$m \times n_2$的样本矩阵.其中m为样本个数,而$n_1,n_2$分别为X和Y的特征维度。

    对于X矩阵,我们将其投影到1维,或者说进行线性表示,对应的投影向量或者说线性系数向量为$a$, 对于X矩阵,我们将其投影到1维,或者说进行线性表示,对应的投影向量或者说线性系数向量为$b$, 这样X ,Y投影后得到的一维向量分别为X',Y'。我们有$$X' = a^TX, Y'=b^TY$$

    我们CCA的优化目标是最大化$\rho(X',Y')$得到对应的投影向量$a,b$,即$$\underbrace{arg\;max}_{a,b}\frac{cov(X',Y')}{\sqrt{D(X')}\sqrt{D(Y')}}$$

    在投影前,我们一般会把原始数据进行标准化,得到均值为0而方差为1的数据X和Y。这样我们有:$$cov(X',Y') = cov(a^TX, b^TY) = E(<a^TX, b^TY>) = E((a^TX)(b^TY)^T) = a^TE(XY^T)b$$ $$D(X') = D(a^TX) = a^TE(XX^T)a$$$$D(Y') = D(b^TY) = b^TE(YY^T)b$$

    由于我们的X,Y的方差均为0,则$$D(X) = cov(X,X) = E(XX^T), D(Y)= cov(Y,Y) = E(YY^T)$$$$cov(X,Y) = E(XY^T),  cov(Y,X) = E(YX^T)$$

    令$S_{XY} =cov(X,Y)$,则优化目标可以转化为:$$\underbrace{arg\;max}_{a,b}\frac{a^TS_{XY}b}{\sqrt{ a^TS_{XX}a}\sqrt{b^TS_{YY}b}}$$

    由于分子分母增大相同的倍数,优化目标结果不变,我们可以采用和SVM类似的优化方法,固定分母,优化分子,具体的转化为:$$\underbrace{arg\;max}_{a,b}\;\;{a^TS_{XY}b}$$$$s.t. a^TS_{XX}a =1,\; b^TS_{YY}b =1$$

    也就是说,我们的CCA算法的目标最终转化为一个凸优化过程,只要我们求出了这个优化目标的最大值,就是我们前面提到的多维X和Y的相关性度量,而对应的$a,b$则为降维时的投影向量,或者说线性系数。

    这个函数优化一般有两种方法,第一种是奇异值分解SVD,第二种是特征分解,两者得到的结果一样,下面我们分别讲解。

3. CCA算法的SVD求解

    对于上面的优化目标,我们可以做一次矩阵标准化,就可以用SVD来求解了。

    首先,我们令$a=S_{XX}^{-1/2}u, b=S_{YY}^{-1/2}v$,这样我们有:$$a^TS_{XX}a =1 \Rightarrow u^TS_{XX}^{-1/2}S_{XX}S_{XX}^{-1/2}u =1  \Rightarrow  u^Tu=1$$$$b^TS_{YY}b =1 \Rightarrow v^TS_{YY}^{-1/2}S_{YY}S_{YY}^{-1/2}v=1  \Rightarrow  v^Tv=1 $$$$a^TS_{XY}b = u^TS_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}v $$ 

    也就是说,我们的优化目标变成下式:$$\underbrace{arg\;max}_{u,v}u^TS_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}v$$$$s.t. u^Tu =1,\; v^Tv =1$$   

    仔细一看,如果将u和v看做矩阵$M=S_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}$的某一个奇异值对应的左右奇异向量。那么利用奇异值分解,我们可以得到$M=U\Sigma V^T$,其中$U,V$分别为M的左奇异向量和右奇异向量组成的矩阵,而$\Sigma$为M的奇异值组成的对角矩阵。由于$U,V$所有的列都为标准正交基,则$u^TU$和$V^Tv$得到一个只有一个标量值为1,其余标量值为0的向量。此时我们有$$u^TS_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}v = u^TU\Sigma V^Tv = \sigma_{uv}$$

    也就是说我们最大化$u^TS_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}v$,其实对应的最大值就是某一组左右奇异向量所对应的奇异值的最大值。也就是将M做了奇异值分解后,最大的奇异值就是我们优化目标的最大值,或者说我们的X和Y之间的最大相关系数。利用对应的左右奇异向量$u,v$我们也可以求出我们原始的X和Y的线性系数$a=S_{XX}^{-1/2}u, b=S_{YY}^{-1/2}v$。

    可以看出,SVD的求解方式非常简洁方便。但是如果你不熟悉SVD的话,我们也可以用传统的拉格朗日函数加上特征分解来完成这个函数的优化。

4. CCA算法的特征分解求解  

    特征分解方式就比较传统了,利用拉格朗日函数,优化目标转化为最大化下式:$$J(a,b) = a^TS_{XY}b -\frac{\lambda}{2}(a^TS_{XX}a-1)-\frac{\theta}{2}(b^TS_{YY}b-1)$$

    分别对$a,b$求导并令结果为0,我们得到:$$S_{XY}b-\lambda S_{XX}a=0$$$$S_{YX}a-\lambda S_{YY}b=0$$

    将上面第一个式子左乘$a^T$,第二个式子左乘$b^T$,并利用$a^TS_{XX}a =1,\; b^TS_{YY}b =1$,我们得到$$\lambda = \theta = a^TS_{XY}b$$

    其实也就是说我们的拉格朗日系数就是我们要优化的目标。我们继续将上面的两个式子做整理,第一个式子左乘$S_{XX}^{-1}$,第二个式子左乘$S_{YY}^{-1}$,我们得到:$$S_{XX}^{-1}S_{XY}b=\lambda a$$$$S_{YY}^{-1}S_{YX}a = \lambda b$$

    将上面第二个式子带入第一个式子,我们得到$$S_{XX}^{-1}S_{XY}S_{YY}^{-1}S_{YX}a=\lambda^2a$$

    这个式子我们就熟悉了,这不就是特征分解吗!要求最大的相关系数$\lambda $,我们只需要对矩阵$N=S_{XX}^{-1}S_{XY}S_{YY}^{-1}S_{YX}$做特征分解,找出最大的特征值取平方根即可,此时最大特征值对应的特征向量即为X的线性系数$a$。

    同样的办法,我们将上面第一个式子带入第二个式子,我们得到$$S_{YY}^{-1}S_{YX}S_{XX}^{-1}S_{XY}b=\lambda^2b$$, 我们只需要对矩阵$N’=S_{YY}^{-1}S_{YX}S_{XX}^{-1}S_{XY}$做特征分解,找出最大的特征值取平方根即可,此时最大特征值对应的特征向量即为Y的线性系数$b$。

    可以看出特征分解的方法要比SVD复杂,但是两者求得的结果其实是等价的,只要利用SVD和特征分解之间的关系就很容易发现两者最后的结果相同。

5. CCA算法流程

    这里我们对CCA的算法流程做一个总结,以SVD方法为准。

    输入:各为m个的样本X和Y,X和Y的维度都大于1

    输出:X,Y的相关系数$\rho$,X和Y的线性系数向量a和b

    1)计算X的方差$S_{XX}$, Y的方差$S_{YY}$,X和Y的协方差$S_{XY}$, Y和X的协方差$S_{YX}=S_{XY}^T$

    2)  计算矩阵$M=S_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}$

    3)对矩阵$M$进行奇异值分解,得到最大的奇异值$\rho$,和最大奇异值对应的左右奇异向量$u,v$

    4) 计算X和Y的线性系数向量a和b, $a=S_{XX}^{-1/2}u, b=S_{YY}^{-1/2}v$

    

    可见算法流程并不复杂,但是要理解这个算法需要了解一些背景知识。

6. CCA算法小结

    CCA算法广泛的应用于数据相关度的分析,同时还是偏最小二乘法的基础。但是由于它依赖于数据的线性表示,当我们的数据无法线性表示时,CCA就无法使用,此时我们可以利用核函数的思想,将数据映射到高维后,再利用CCA的思想降维到1位,求对应的相关系数和线性关系,这个算法一般称为KCCA。

    此外,我们在算法里只找了相关度最大的奇异值或者特征值,作为数据的相关系数,实际上我们也可以像PCA一样找出第二大奇异值,第三大奇异值,。。。得到第二相关系数和第三相关系数。然后对数据做进一步的相关性分析。但是一般的应用来说,找出第一相关系数就可以了。

    有时候我们的矩阵$S_{XX},S_{YY}$不可逆,此时我们得不到对应的逆矩阵,一般遇到这种情况可以对$S_{XX},S_{YY}$进行正则化,将$S_{XX},S_{YY}$变化为$S_{XX}+\gamma I,S_{YY}+\gamma I$,然后继续求逆。其中$gamma$为正则化系数。

       

(欢迎转载,转载请注明出处。欢迎沟通交流: pinard.liu@ericsson.com)    

典型关联分析(CCA)原理总结的更多相关文章

  1. Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...

  2. 第十四篇:Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...

  3. 全基因组关联分析(GWAS)的计算原理

    前言 关于全基因组关联分析(GWAS)原理的资料,网上有很多. 这也是我写了这么多GWAS的软件教程,却从来没有写过GWAS计算原理的原因. 恰巧之前微博上某位小可爱提问能否写一下GWAS的计算原理. ...

  4. 使用Apriori进行关联分析(一)

    大型超市有海量交易数据,我们可以通过聚类算法寻找购买相似物品的人群,从而为特定人群提供更具个性化的服务.但是对于超市来讲,更有价值的是如何找出商品的隐藏关联,从而打包促销,以增加营业收入.其中最经典的 ...

  5. 关联分析---Apriori

    关联分析是一种在大规模数据集中寻找有趣关系的任务,这些关系有两种形式:频繁项集和关联规则.频繁项集是经常出现在一起的物品的集合,关联规则暗示两种物品之间可能存在的很强的关系. 如何寻找数据集中的频繁或 ...

  6. 机器学习实战 - 读书笔记(11) - 使用Apriori算法进行关联分析

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第11章 - 使用Apriori算法进行关联分析. 基本概念 关联分析(associat ...

  7. 使用Apriori算法和FP-growth算法进行关联分析

    系列文章:<机器学习实战>学习笔记 最近看了<机器学习实战>中的第11章(使用Apriori算法进行关联分析)和第12章(使用FP-growth算法来高效发现频繁项集).正如章 ...

  8. 数据关联分析 association analysis (Aprior算法,python代码)

    1基本概念 购物篮事务(market basket transaction),如下表,表中每一行对应一个事务,包含唯一标识TID,和购买的商品集合.本文介绍一种成为关联分析(association a ...

  9. 关联分析:FP-Growth算法

    关联分析又称关联挖掘,就是在交易数据.关系数据或其他信息载体中,查找存在于项目集合或对象集合之间的频繁模式.关联.相关性或因果结构.关联分析的一个典型例子是购物篮分析.通过发现顾客放入购物篮中不同商品 ...

随机推荐

  1. mvc拦截器

    在ASP.NET MVC中,有三种拦截器:Action拦截器.Result拦截器和Exception拦截器.这里说的是第一种和第三种.其实所谓的ASP.NET MVC拦截器,也没什么神秘的,就是一个普 ...

  2. 2.4 LINQ中使用where子句指定筛选条件

    本篇讲解的内容有: 使用where筛选过滤LINQ查询 带逻辑的where筛选 多个where筛选子句 [1.使用where筛选过滤LINQ查询] 通常一个LINQ查询不会如前面的示例代码这么简单,经 ...

  3. ASP.NET-FineUI开发

    ASP.NET-FineUI开发 随笔分类 - FineUI   ASP.NET-FineUI开发实践-10 摘要: 嵌套Grid,光棍月大放送,不藏着掖着.实在写的不好,没脸藏啊~只考虑显示排序修改 ...

  4. 安装WindowsXP操作系统(安装版) - 初学者系列 - 学习者系列文章

    本文主要介绍下Windows XP操作系统的安装. 1.             将光驱装入光驱.启动电脑,在开始界面按下DEL键,进入BIOS设置界面.将光驱设置为第一启动项.下面以虚拟机为例子. ...

  5. solr的安装与配置

    solr的安装与配置 不久之前开发了一个项目,需要用到solr,因为所以在开始再网上查找资料,但是发现大部分的资料都是很片面的,要么就是只讲解solr如何安装的,要么就是只讲解solr的某一个部分的, ...

  6. C# 6.0 功能预览

    C# 6.0 功能预览 (一) 一.索引的成员和元素初始化 1.1 原始初始化集合 Dictionary 1.2 键值初始化集合 Dictionary 1.3 运算符 $ 初始化集合 Dictiona ...

  7. 使用UpdatePanel控件

    使用UpdatePanel控件(二) UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编 ...

  8. 网页启动Windows服务

    如何在网页启动Windows服务   由于公司有许多windows服务进行业务的处理,所谓对服务的维护也是一个比较头痛的问题,因为自己也不知道服务什么时候自动停了,而且更主要的原因是服务都是由运维部门 ...

  9. 玩转python之每次处理一个字符

    在Python中字符就是长度为1的字符串,所以可以循环遍历一个字符串,依次访问每一个字符,得到你想要的处理前提: 一个列表是个好主意,就像这样:thelist = list(thestring) 当然 ...

  10. 朴素贝页斯分类法 c++实现

    朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.对于搞机器学习的同学们来说,这是相对简单但效果较好的模型. 朴素贝叶斯方法的理论 设输入为n维特征向量X={x1,x2,...,xn},输出为 ...