KMBOX用于核典型相关分析

时间:2014-07-09 14:02:11

标签: algorithm matlab math machine-learning correlation

我目前在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

2 个答案:

答案 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情况):

N0*K*N0

>> 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