- z - double 矩阵,大小为 Nx2;
- x - double 矩阵,大小为 Nx2;
sup = x(i, :);
phi(1, i) = {@(z) exp(-g * sum((z - sup(ones([size(z, 1) 1]),:)) .^ 2, 2))};
这是用于逻辑回归的径向基函数 (RBF)。这是公式:
我需要你的建议,我可以优化这个公式吗?因为它调用了数百万次,而且需要很多时间......
最佳答案
在您最近的编辑中,您似乎引入了一些语法错误,但我想我理解您想要做什么(从第一个版本开始)。
而不是使用 REPMAT或索引以重复向量 x(i,:)
以匹配 z
的行,考虑使用高效的 BSXFUN功能:
rbf(:,i) = exp( -g .* sum(bsxfun(@minus,z,x(i,:)).^2,2) );
上面显然遍历了 x 的每一行
您可以更进一步,使用 PDIST2计算 z
和 x
中每对行之间的欧氏距离:
%# some random data
X = rand(10,2);
Z = rand(10,2);
g = 0.5;
%# one-line solution
rbf = exp(-g .* pdist2(Z,X,'euclidean').^2);
现在矩阵中的每个值:rbf(i,j)
对应于 z(i,:)
和 x(j, :)
编辑:
我对不同的方法进行了计时,这是我使用的代码:
%# some random data
N = 5000;
X = rand(N,2);
Z = rand(N,2);
g = 0.5;
%# PDIST2
tic
rbf1 = exp(-g .* pdist2(Z,X,'euclidean').^2);
toc
%# BSXFUN+loop
tic
rbf2 = zeros(N,N);
for j=1:N
rbf2(:,j) = exp( -g .* sum(bsxfun(@minus,Z,X(j,:)).^2,2) );
end
toc
%# REPMAT+loop
tic
rbf3 = zeros(N,N);
for j=1:N
rbf3(:,j) = exp( -g .* sum((Z-repmat(X(j,:),[N 1])).^2,2) );
end
toc
%# check if results are equal
all( abs(rbf1(:)-rbf2(:)) < 1e-15 )
all( abs(rbf2(:)-rbf3(:)) < 1e-15 )
结果:
Elapsed time is 2.108313 seconds. # PDIST2
Elapsed time is 1.975865 seconds. # BSXFUN
Elapsed time is 2.706201 seconds. # REPMAT
关于matlab公式优化: Radial Basis Function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6989442/