Canonical Correlation Analysis(CCA)典型相关分析也是一种常用的降维算法。我们知道,PCA(Principal Component Analysis) 主分量分析将数据从高维映射到低维空间同时,保证了数据的分散性尽可能地大, 也就是数据的方差或者协方差尽可能大。而LDA(Linear Discriminant Analysis) 线性判别分析则利用了类标签,利用一种监督学习的方法,将数据从高维空间映射到低维空间时,让不同类的数据尽可能地分开而同一类的数据尽可能地聚合。

但是,有的时候,我们想探讨多个线性空间之间的相关性。比如有的时候我们会从图像中提取各种特征,每一种特征都可以构成一个线性空间,为了分析这些空间之间的相关性,我们可以利用CCA 来做分析。

假设我们有两个特征空间,S1=x1∈Rd1, S2=x2∈Rd2, 我们可以将两个特征向量合并。

x=(x1x2)E(x)=(μ1μ2)Σ=(Σ11Σ21Σ12Σ22)

可以看到,Σ12=ΣT21,Σ 称为协方差矩阵。我们引入投影向量 a, b, 假设投影之后的变量满足:

u=aTx1v=bTx2

可以进一步算出 u,v 的方差和协方差:

var(u)=aTΣ11a,var(v)=bTΣ2b,cov(u,v)=aTΣ12b

可以计算出 u,v 的相关系数:

Corr(u,v)=cov(u,v)var(u)−−−−−√var(v)−−−−−√

将u,v的表达式代入,可以得到:

Corr(u,v)=aTΣ12baTΣ11a−−−−−−√bTΣ22b−−−−−−−√

我们的目标是让相关系数Corr(u,v) 尽可能地大。为了求解a,b, 可以固定分母而让分子最大化,所以上面的函数可以变成:

maxa,baTΣ12b
s.t.aTΣ11a=1,bTΣ22b=1

构造拉格朗日等式:

L=aTΣ12b−λ12(aTΣ11a−1)−λ22(bTΣ22b−1)

L 分别对a,b 求导,可以得到:

∂L∂a=Σ12b−λ1Σ11a=0
∂L∂b=Σ21a−λ2Σ22b=0

根据约束条件,可以得到:

λ1=λ2=aTΣ12b

所以只要求出 λ1 或者 λ2 就可以得到最大的相关系数。令 λ=λ1=λ2.

通过上面的偏导数,我们可以得到:

Σ−111Σ12b=λa
Σ−122Σ21a=λb

写成矩阵形式:

(Σ−11100Σ−122)(0Σ21Σ120)(ab)=λ(ab)

令:

B=(Σ1100Σ22),A=(0Σ21Σ120)w=(ab)

,

那么,上式可以表示成:

B−1Aw=λw

所以,λ 和 w 就是B−1A 的特征值和特征向量。我们可以求出 B−1A 的特征值和特征向量,然后利用特征向量将原来的特征

x1,x2做映射。对应特征值 λ 的求解,可以有更简单的方法,从上面的偏导数,我们可以得到如下等式:

Σ−111Σ12Σ−122Σ21a=λ2a

我们可以利用上面的表达式求出 λ 和 a,然后再待会上面的偏导数等式求出 b.

λ 就是 u,v的相关系数,u,v 就是一对典型变量(canonical variables)。按照 B−1A 的特征值从大到小排列,可以求出一系列的典型变量。特征值越大,说明典型变量的相关性越强。

参考来源:

http://www.cnblogs.com/jerrylead/archive/2011/06/20/2085491.html

https://en.wikipedia.org/wiki/Canonical_correlation

机器学习: Canonical Correlation Analysis 典型相关分析的更多相关文章

  1. Jordan Lecture Note-12: Kernel典型相关分析(Kernel Canonical Correlation Analysis, KCCA).

    Kernel典型相关分析 (一)KCCA 同样,我们可以引入Kernel函数,通过非线性的坐标变换达到之前CCA所寻求的目标.首先,假设映射$\Phi_X: x\rightarrow \Phi_X(x ...

  2. Jordan Lecture Note-11: 典型相关分析(Canonical Correlation Analysis, CCA).

    典型相关分析 (一)引入 典型相关分析(Canonical Correlation Analysis)是研究两组变量之间相关关系的一种多元统计方法.他能够揭示出两组变量之间的内在联系. 我们知道,在一 ...

  3. 经典相关分析,典型关分析, CCA,Canonical Correlation Analysis,多元变量分析,线性组合,相关系数最大化

    1.从概率论中相关系数推广而来 在概率论中,研究两个变量之间的线性相关情况时,提出了 相关系数 这个概念.做一下推广,如果研究一个变量和多个随机变量之间的线性相关关系时,提出了 全相关系数(或者复相关 ...

  4. 多视图学习利器----CCA(典型相关分析)及MATLAB实现

    Hello,我是你们人见人爱花见花开的小花.又和大家见面了,今天我们来聊一聊多视图学习利器------CCA. 一 典型相关分析的基本思想 当我们研究两个变量x和y之间的相关关系的时候,相关系数(相关 ...

  5. 典型相关分析CCA计算过程

      本文介绍了CCA解决的问题,CCA原理的推导过程,以及对计算结果物理意义的解释.并且通过SPSS和R操作演示了一个关于CCA的例子.数据文件下载参考[8],SPSS输出结果文件下载参考[9],R代 ...

  6. SPSS数据分析—典型相关分析

    我们已经知道,两个随机变量间的相关关系可以用简单相关系数表示,一个随机变量和多个随机变量的相关关系可以用复相关系数表示,而如果需要研究多个随机变量和多个随机变量间的相关关系,则需要使用典型相关分析. ...

  7. SPSS数据分析—基于最优尺度变换的典型相关分析

    传统的典型相关分析只能考虑变量之间的线性相关情况,且必须为连续变量,而我们依然可以使用最优尺度变换来拓展其应用范围,使其可以分析非线性相关.数据为分类数据等情况,并且不再仅限于两个变量间的分析, 虽然 ...

  8. R语言 典型相关分析

    1.关键点 #典型相关分析##典型相关分析是用于分析两组随机变量之间的相关程度的一种统计方法,它能够有效地揭示两组随机变量之间的相互(线性依赖)关系#例如 研究生入学考试成绩与本科阶段一些主要课程成绩 ...

  9. CCA(典型相关分析)

    https://www.cnblogs.com/pinard/p/6288716.html

随机推荐

  1. react/redux组件库、模板、学习教程

    开源的有蚂蚁金服的: 1.https://pro.ant.design/index-cn 2.https://pro.ant.design/docs/getting-started-cn 3.http ...

  2. libevent和libev的区别对比

    参考了这篇文章: http://www.cnblogs.com/Lifehacker/p/whats_the_difference_between_libevent_and_libev_chinese ...

  3. assign-cookies

    https://leetcode.com/problems/assign-cookies/ 用贪心算法即可. package com.company; import java.util.Arrays; ...

  4. 电话号码 【trie树】

    电话号码 查看 提交 统计 提问 总时间限制: 1000ms 内存限制: 65536kB 描写叙述 给你一些电话号码,请推断它们是否是一致的,即是否有某个电话是还有一个电话的前缀. 比方: Emerg ...

  5. Naive Bayesian文本分类器

    贝叶斯学习方法中有用性非常高的一种为朴素贝叶斯学习期,常被称为朴素贝叶斯分类器. 在某些领域中与神经网络和决策树学习相当.尽管朴素贝叶斯分类器忽略单词间的依赖关系.即如果全部单词是条件独立的,但朴素贝 ...

  6. 以goroutine为例看协程的相关概念

    转自  http://wangzhezhe.github.io/blog/2016/02/17/golang-scheduler/ 基本上是网上相关文章的梳理,初衷主要是想了解下golang中的gor ...

  7. android等待旋转圆圈动画

    先创建一个动画的xml文件例如以下 <? xml version="1.0" encoding="utf-8"?> <animation-li ...

  8. HDMI各版本对比

    转:一文看懂从HDMI1.0到HDMI2.1的历代规格变化 hdmi HDMI详解 https://blog.csdn.net/xubin341719/article/details/7713450 ...

  9. ElasticSearch 分页检索

    在ElasticSearch的多索引和多类别里说到我们在集群中有14个文档匹配我们的(空)搜索语句.单数仅仅有10个文档在hits数组中.我们怎样看到其它文档? 和SQL使用LIMITkeyword返 ...

  10. python--面向对象封装

    from collectoins import namedtuple Point=namedtuple('point',['x','y']) t1=Point(1,2) print(t1.x) pri ...