Algorithm 核典型相关分析的KMBOX
我目前在MATLAB中使用for内核 这里的代码是Algorithm 核典型相关分析的KMBOX,algorithm,matlab,math,machine-learning,correlation,Algorithm,Matlab,Math,Machine Learning,Correlation,我目前在MATLAB中使用for内核 这里的代码是 显然,要生成核矩阵。但是N0的含义是什么呢。为什么时间N0?我看了一下实现,我认为乘以矩阵N0的目的是从内核矩阵中删除平均向量,这样它就以零为中心(这可能有助于简化以后的计算) 一旦我们有了它,我们将Rv=λDv解为[a,b]=eig(R,D),其中: R是块对角矩阵,右上角为K1*K2,左下角为K2*K1,对角块为零矩阵 D是块对角矩阵,其中(K1^2+reg*I)和(K2^2+reg*I)作为对角线上的块,而非对角线上的零块(reg是一个
显然,要生成核矩阵。但是
N0
的含义是什么呢。为什么时间N0
?我看了一下实现,我认为乘以矩阵N0
的目的是从内核矩阵中删除平均向量,这样它就以零为中心(这可能有助于简化以后的计算)
一旦我们有了它,我们将Rv=λDv
解为[a,b]=eig(R,D)
,其中:
是块对角矩阵,右上角为R
,左下角为K1*K2
,对角块为零矩阵K2*K1
是块对角矩阵,其中D
和(K1^2+reg*I)
作为对角线上的块,而非对角线上的零块((K2^2+reg*I)
是一个正则化项,使其在数值上更稳定)reg
例子: 我将使用来帮助我以象征性的方式说明计算:
%% 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
有趣的是,这也可以通过矩阵乘法(在该代码中使用)实现:
现在,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
case):
我看了一下实现,我认为乘以矩阵
N0
的目的是从内核矩阵中删除平均向量,这样它就以零为中心(这可能有助于简化以后的计算)
一旦我们有了它,我们将Rv=λDv
解为[a,b]=eig(R,D)
,其中:
是块对角矩阵,右上角为R
,左下角为K1*K2
,对角块为零矩阵K2*K1
是块对角矩阵,其中D
和(K1^2+reg*I)
作为对角线上的块,而非对角线上的零块((K2^2+reg*I)
是一个正则化项,使其在数值上更稳定)reg
例子: 我将使用来帮助我以象征性的方式说明计算:
%% 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
有趣的是,这也可以通过矩阵乘法(在该代码中使用)实现:
现在,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
case):
Amro的答案是正确的:乘以
N0
的目的是从核矩阵中删除数据平均值。您可以在第二篇参考文献第3.2.1节的最后一段中找到这一点:F.R.Bach和M.I.Jordan,“内核独立成分分析”,JMLR,2002年
原因不是为了避免数值问题,而是因为。Amro的答案是正确的:乘以
N0
的目的是从核矩阵中删除数据平均值。您可以在第二篇参考文献第3.2.1节的最后一段中找到这一点:F.R.Bach和M.I.Jordan,“内核独立成分分析”,JMLR,2002年
原因不是为了避免数值问题,而是因为。我没有为您提供解释,但是您是否查阅了KCCA算法的参考文献:
核典型相关分析(KCCA),如D.R.Hardoon、S.Szedmak和J.Shawe Taylor提出的,“典型相关分析:学习方法应用概述”,《神经计算》,第16卷(12),第2639-26642004页。
?是的,我已经读过那篇论文,但这里的代码与论文描述的不相似。(即上面的代码,“times N0”)我没有任何解释,但您是否查阅了KCCA算法的参考文献:内核典型相关分析(KCCA),如D.R.Hardoon、S.Szedmak和J.Shawe Taylor所述,“典型相关分析:学习方法应用概述”,神经计算,第16卷(12),第2639-26642004页
?是的,我已经读过那篇文章,但这里的代码与论文描述的代码不同。(即上面的代码“times N0”)另外一个问题,使一个矩阵成为所谓的零中心矩阵的原因是什么?我认为它改进了内核矩阵的数值性质,从而避免了K
。这里有一篇文章讨论了这个主题:@user1522378:见Steven的答案(工具箱的作者)另外一个问题,使一个矩阵成为所谓的零中心的原因是什么?我认为它改进了核矩阵的数值性质,从而避免了K