理解CCA(Matlab实现)2

时间:2015-01-30 11:11:35

标签: matlab correlation cross-correlation

我正在使用CCA来完成我的工作并希望了解一些事情。

这是我的MATLAB代码。我只采用了 100 样本来更好地理解CCA的概念。

clc;clear all;close all;

load carbig;
data = [Displacement Horsepower Weight Acceleration MPG];

data(isnan(data))=0;

X = data(1:100,1:3);
Y = data(1:100,4:5);

[wx,wy,~,U,V] = CCA(X,Y);

clear Acceleration Cylinders Displacement Horsepower MPG Mfg Model Model_Year Origin Weight when org

subplot(1,2,1),plot(U(:,1),V(:,1),'.');
subplot(1,2,2),plot(U(:,2),V(:,2),'.');

我的情节是这样的:Image

这指出在第一个图(左)中,变换后的变量高度相关,中心轴周围的散射很少。在第二个图(右)中,围绕中心轴的散射更多。

正如我从here所理解的那样,CCA最大化了转换空间中数据之间的相关性。所以我尝试设计一个匹配分数,如果向量最大相关,则应该返回最小值。我尝试将U(i,:)的每个向量与V(j,:)的向量匹配,i,j 1 100

%% Finding the difference between the projected vectors
for i=1:size(U,1)
    cost = repmat(U(i,:),size(U,1),1)- V;
    for j=1:size(U,1)
        c(i,j) = norm(cost(j,:),size(U,2));
    end
    [~,idx(i)] = min(c(i,:));
end

理想情况下,idx应该是这样的:

idx = 1 2 3 4 5 6 7 8 9 10 ....

因为它们是最大相关的。但是我的输出是这样的:

idx = 80 5 3 1 4 7 17 17 17 10 68 78 78 75 9 10 5 1 6 17 .....

我不明白为什么会这样。

  1. 我错了吗?是否应该在转换的CCA子空间中最大限度地关联向量?
  2. 如果我的上述假设是错误的,请指出我正确的方向。
  3. 提前致谢。

1 个答案:

答案 0 :(得分:1)

首先,让我在R2014b中转置您的代码:

load carbig;
data = [Displacement Horsepower Weight Acceleration MPG];

% Truncate the data, to follow-up with your sample code
data = data(1:100,:);

nans = sum(isnan(data),2) > 0;
[wx, wy, r, U, V,] = canoncorr(X(~nans,1:3),X(~nans,4:5));

好的,现在的诀窍是在CCA子空间中最大相关的向量是向量U(:,1)V(:,1)U(:,2)带{您正在尝试计算{1}},而不是向量V(:,2)。在CCA子空间中,向量应该是N维的(这里是U(i,:)),而不是简单的2D向量。这就是为什么CCA结果的可视化通常非常复杂的原因!

顺便说一句,相关性是由N=100的第三个输出给出的,你(有意?)选择在你的代码中跳过。如果你检查它的内容,你会发现相关性(向量)是有序的:

canoncorr

很难比你已经提供的链接更好地解释CCA。如果你想更进一步,你应该投资一本书,如this onethis one