Matlab公式优化:径向基函数

Yek*_*ver 6 math optimization matlab euclidean-distance

  • z - 双倍矩阵,大小Nx2;
  • x - 双打矩阵,大小Nx2;

sup = x(i, :);

phi(1, i) = {@(z) exp(-g * sum((z - sup(ones([size(z, 1) 1]),:)) .^ 2, 2))};

这是用于逻辑回归的径向基函数(RBF).这是公式:

在此输入图像描述

我需要你的建议,我可以优化这个公式吗?因为它呼叫数百万次,而且需要很多时间......

Amr*_*mro 6

在您最近的编辑中,您介绍了一些语法错误,但我认为我理解您尝试做的事情(从第一个版本开始).

不使用REPMAT或索引来重复向量x(i,:)以匹配行z,而是考虑使用高效的BSXFUN函数:

rbf(:,i) = exp( -g .* sum(bsxfun(@minus,z,x(i,:)).^2,2) );
Run Code Online (Sandbox Code Playgroud)

上面明显地遍历x的每一行


你可以走得更远一步,并使用PDIST2来计算每对行之间的欧氏距离zx:

%# 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);
Run Code Online (Sandbox Code Playgroud)

现在矩阵中的每个值: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 )
Run Code Online (Sandbox Code Playgroud)

结果:

Elapsed time is 2.108313 seconds.     # PDIST2
Elapsed time is 1.975865 seconds.     # BSXFUN
Elapsed time is 2.706201 seconds.     # REPMAT
Run Code Online (Sandbox Code Playgroud)