我的目标是最小化以下成本函数而不是W
J = (E)^2
E = A - W .* B
Such that W(n+1) = W(n) - (u/2) * delJ
delJ = gradient of J = -2 * E .* B
u = step_size=0.2
where:
- A, B are STFT matrix of 2 audio signals (dimension is 257x4000 for a 16s audio with window size = 256 , 75% overlap, nfft=512)
- W is a matrix constructed with [257x1] vector repeated 4000 times (so that it become 257x4000] matrix
我已经编写了自定义功能,如下所示。问题是,A和B中的元素是如此之小(~e-20),即使在1000次迭代之后,g也没有发生变化。
我肯定错过了一些东西,如果有人可以帮助或引导我找到一个解释新人整个过程的链接。
[M,N] = size(A);
E =@(x) A - repmat(x,1,N) .* B; % Error Function
J = @(x) E(x) .^ 2; % Cost Function
G = @(x) -2 * E(x) .* B; % Gradiant Function
alpha = .2; % Step size
maxiter = 500; % Max iteration
dwmin = 1e-6; % Min change in gradiation
tolerence = 1e-6; % Max Gradiant norm
gnorm = inf;
w = rand(M,1);
dw = inf;
for i = 1:maxiter
g = G(w);
gnorm = norm(g);
wnew = w - (alpha/2)*g(:,1);
dw = norm(wnew-w)
if or(dw < dwmin, gnorm < tolerence)
break
end
end
w = wnew;
A&amp; B总是正实数矢量。
答案 0 :(得分:1)
您的问题实际上是一系列独立问题。如果我们将A
和B
的每一行以及w
的每个元素与i
编入索引,那么最小化误差矩阵中的平方和
A - repmat(w, 1, N) .* B
与最小化误差向量
上的平方和相同A(i, :) - w(i) * B(i, :)
分别用于所有行。后一个问题可以使用Matlab的最小二乘算子之一来解决,特别是mrdivide
或/
:
for i = 1 : M
w(i) = A(i, :) / B(i, :);
end
据我所知,没有办法进一步对这个计算进行矢量化。
在任何情况下,都不需要使用梯度下降或其他形式的优化算法。