成本函数的最小二乘法

Least square minimization of a Cost function

我的目标是在 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 也没有变化。

我肯定遗漏了一些东西,如果有人可以帮助或指导我一些 link 解释新人的整个过程。

[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​​ 和 B 总是正实数向量。

你的问题实际上是一系列相互独立的问题。如果我们用 AB 的每一行以及 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

据我所知,没有办法进一步向量化此计算。

在任何情况下,都不需要使用梯度下降或其他形式的优化算法。