理解 CCA(Matlab 实现)2
Making sense of CCA (Matlab implementation) 2
我在工作中使用 CCA,想了解一些东西。
这是我的 MATLAB 代码。为了更好地理解 CCA 的概念,我只取了 100 个样本。
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),'.');
我的剧情是这样的:
这指出,在第一个图(左)中,转换后的变量高度相关,并且围绕中心轴几乎没有散布。而在图2(右)中,围绕中心轴的散布更多。
正如我从 here 中了解到的那样,CCA 最大化了转换后 space 中数据之间的相关性。所以我尝试设计一个匹配分数,如果向量最大相关,它应该 return 一个最小值。我尝试将 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 .....
我不明白为什么会这样。
- 我哪里错了吗?在转换后的 CCA subspace 中,矢量是否应该最大相关?
- 如果我的上述假设是错误的,请指出正确的方向。
提前致谢。
首先,让我在 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));
OK,现在的诀窍是,在 CCA 子空间中最大相关的向量是 列 向量 U(:,1)
,其中 V(:,1)
和 U(:,2)
与 V(:,2)
,而不是 行 向量 U(i,:)
,因为您正在尝试计算。在 CCA 子空间中,向量应该是 N 维的(这里 N=100
),而不是简单的 2D 向量。这就是 CCA 结果的可视化通常非常复杂的原因!
顺便说一句,相关性由 canoncorr
的第三个输出给出,您(故意?)选择跳过您的代码。如果你检查它的内容,你会发现相关性(即向量)是有序的:
r =
0.9484 0.5991
很难比您已经提供的 link 更好地解释 CCA。如果你想走得更远,你可能应该投资一本书,比如 this one or this one。
我在工作中使用 CCA,想了解一些东西。
这是我的 MATLAB 代码。为了更好地理解 CCA 的概念,我只取了 100 个样本。
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),'.');
我的剧情是这样的:
这指出,在第一个图(左)中,转换后的变量高度相关,并且围绕中心轴几乎没有散布。而在图2(右)中,围绕中心轴的散布更多。
正如我从 here 中了解到的那样,CCA 最大化了转换后 space 中数据之间的相关性。所以我尝试设计一个匹配分数,如果向量最大相关,它应该 return 一个最小值。我尝试将 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 .....
我不明白为什么会这样。
- 我哪里错了吗?在转换后的 CCA subspace 中,矢量是否应该最大相关?
- 如果我的上述假设是错误的,请指出正确的方向。
提前致谢。
首先,让我在 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));
OK,现在的诀窍是,在 CCA 子空间中最大相关的向量是 列 向量 U(:,1)
,其中 V(:,1)
和 U(:,2)
与 V(:,2)
,而不是 行 向量 U(i,:)
,因为您正在尝试计算。在 CCA 子空间中,向量应该是 N 维的(这里 N=100
),而不是简单的 2D 向量。这就是 CCA 结果的可视化通常非常复杂的原因!
顺便说一句,相关性由 canoncorr
的第三个输出给出,您(故意?)选择跳过您的代码。如果你检查它的内容,你会发现相关性(即向量)是有序的:
r =
0.9484 0.5991
很难比您已经提供的 link 更好地解释 CCA。如果你想走得更远,你可能应该投资一本书,比如 this one or this one。