我目前在MATLAB中使用KMBOX toolbox作为内核canonical correlation analysis。
此处的代码是km_kcca.m
I = eye(N); Z = zeros(N);
N0 = eye(N)-1/N*ones(N);
% get kernel matrices
K1 = N0*km_kernel(X1,X1,kernel,kernelpar)*N0;
K2 = N0*km_kernel(X2,X2,kernel,kernelpar)*N0;
显然,km_kernel
会生成内核矩阵。但是N0
的含义是什么?为什么时间N0
?
答案 0 :(得分:4)
我看了一下实现,我认为乘以矩阵N0
的目的是从内核矩阵中删除均值向量,这样就可以实现零中心(这可能对简化有意义)以后的计算)。
完成后,我们将generalized eigenvalue problem Rv = λDv
解析为[a,b]=eig(R,D)
,其中:
R
是一个块对角矩阵,右上角为K1*K2
,左下角为K2*K1
,对角线块为零矩阵。
D
是块对角矩阵,其中(K1^2+reg*I)
和(K2^2+reg*I)
作为对角线上的块,而对角线上的零块(reg
是正则化项使它在数值上更稳定)
(实际上the code以稍微不同的方式做到这一点以避免数字问题,并列出三个选项(注释)来解决它。)
PS:我发现these notes有帮助。
我会使用Symbolic Math Toolbox来帮助我象征性地说明计算:
%% say we built the kernel matrix from data, this is a n-by-n symmetric matrix
n = 3;
K = sym('K',[n n]);
K = triu(K) + triu(K,1).';
这是一个对称矩阵:
>> K
K =
[ K1_1, K1_2, K1_3]
[ K1_2, K2_2, K2_3]
[ K1_3, K2_3, K3_3]
现在让我们从矩阵中删除平均向量(简单地计算平均值并减去它)。正如预期的那样,新矩阵沿行/列应该具有零均值:
% remove mean-row from the kernel, so that mean(KK,1) == zeros(1,n)
>> KK = K - repmat(mean(K,1),n,1);
>> mean(KK,1)
ans =
[ 0, 0, 0]
% or remove mean-column from the kernel, so that mean(KK,2) == zeros(n,2)
>> KK = K - repmat(mean(K,2),1,n);
>> mean(KK,2)
ans =
0
0
0
有趣的是,这也可以通过矩阵乘法(在该代码中使用)来完成:
% first we build the coefficients matrix for n=3
>> N0 = eye(n) - 1/n*ones(n);
>> N0 = sym(N0)
N0 =
[ 2/3, -1/3, -1/3]
[ -1/3, 2/3, -1/3]
[ -1/3, -1/3, 2/3]
% pre-multiply to remove average row
>> KK = N0*K;
>> mean(KK,1)
ans =
[ 0, 0, 0]
% post-multiply to remove average column
>> KK = K*N0;
>> mean(KK,2)
ans =
0
0
0
现在km_kcca.m
中的代码在两边进行乘法运算,这样可以消除行和列的平均值,并且矩阵的均值在两个方向都为零:
>> KK = N0*K*N0;
>> mean(KK,1)
ans =
[ 0, 0, 0]
>> mean(KK,2)
ans =
0
0
0
这与做:
相同>> KK = K - repmat(mean(K,1),n,1);
>> KK = KK - repmat(mean(KK,2),1,n);
>> mean(KK,1)
ans =
[ 0, 0, 0]
>> mean(KK,2)
ans =
0
0
0
值得注意的是,零中心矩阵如下所示(对于n=3
情况):
>> pretty(N0*K*N0)
/ 4 K1_1 4 K1_2 4 K1_3 K2_2 2 K2_3 K3_3 \
| ------ - ------ - ------ + ---- + ------ + ----, #1, #3 |
| 9 9 9 9 9 9 |
| |
| K1_1 4 K1_2 2 K1_3 4 K2_2 4 K2_3 K3_3 |
| #1, ---- - ------ + ------ + ------ - ------ + ----, #2 |
| 9 9 9 9 9 9 |
| |
| K1_1 2 K1_2 4 K1_3 K2_2 4 K2_3 4 K3_3 |
| #3, #2, ---- + ------ - ------ + ---- - ------ + ------ |
\ 9 9 9 9 9 9 /
where
5 K1_2 2 K1_1 K1_3 2 K2_2 K2_3 K3_3
#1 == ------ - ------ - ---- - ------ - ---- + ----
9 9 9 9 9 9
K1_1 K1_2 K1_3 2 K2_2 5 K2_3 2 K3_3
#2 == ---- - ---- - ---- - ------ + ------ - ------
9 9 9 9 9 9
5 K1_3 K1_2 2 K1_1 K2_2 K2_3 2 K3_3
#3 == ------ - ---- - ------ + ---- - ---- - ------
9 9 9 9 9 9
答案 1 :(得分:2)
Amro的答案是正确的:乘以N0
的目的是从内核矩阵中删除数据均值。您可以在第二篇参考文献的第3.2.1节的最后一段中找到这一点:F。R. Bach和M. I. Jordan," Kernel Independent Component Analysis",JMLR,2002。
原因不是避免数字问题,而是因为correlation is typically calculated on zero-mean data。