我正在使用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),'.');
我的情节是这样的:
这指出在第一个图(左)中,变换后的变量高度相关,中心轴周围的散射很少。在第二个图(右)中,围绕中心轴的散射更多。
正如我从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 .....
我不明白为什么会这样。
提前致谢。
答案 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