Matlab 代价函数的最小二乘极小化

Matlab 代价函数的最小二乘极小化,matlab,signal-processing,mathematical-optimization,least-squares,gradient-descent,Matlab,Signal Processing,Mathematical Optimization,Least Squares,Gradient Descent,我的目标是在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 ,

我的目标是在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;
[M,N]=尺寸(A);
E=@(x)A-repmat(x,1,N)。*B;%误差函数
J=@(x)E(x)。^2;%成本函数
G=@(x)-2*E(x)。*B;%梯度函数
α=.2;%步长
最大值=500;%最大迭代
dwmin=1e-6;%最小梯度变化
公差=1e-6;%最大梯度范数
gnorm=inf;
w=兰特(M,1);
dw=inf;
对于i=1:maxiter
g=g(w);
gnorm=范数(g);
wnew=w-(α/2)*g(:,1);
dw=标准值(wnew-w)
if或(dw

A和B总是正实数向量。

你的问题实际上是一系列独立的问题。如果我们用
i
索引
A
B
的每一行以及
w
的每一个元素,则最小化误差矩阵的平方和

A - repmat(w, 1, N) .* B
与最小化误差向量的平方和相同

A(i, :) - w(i) * B(i, :)
分别用于所有行。后一个问题可以使用Matlab的一个最小二乘算子来解决,特别是或
/

for i = 1 : M
    w(i) = A(i, :) / B(i, :);
end
据我所知,没有办法进一步矢量化这个计算


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

这里有一些奇怪的事情。首先,您的代码只运行一次迭代,因此您没有向我们提供即使在1000次迭代之后也不会停止的代码。其次,梯度函数应该返回一个与
w
大小相同的向量,但它是一个与
a
B
大小相同的矩阵。然后你只取其中的第一列,因此它只依赖于
A
B
的第一列,因此实际上你只解决了该列的问题。第三(尽管与你的代码无关),你的代价函数也有完整矩阵的大小,在这里它应该是一个标量。我认为你应该把它定义为
J=@(x)sum(sum(E(x)。^2))我尝试使用无梯度方法解决您的问题(使用正确的成本函数),
fminsearch
,但也没有找到解决方案。您确定您的问题有唯一的解决方案吗?你是怎么想到的?一点背景可能有助于找到更好的方法。嗨,非常抱歉第一个问题。实际上,我编辑了代码以在末尾添加if()条件[这会导致在1次迭代后中断循环),但忘记编辑文本中的行。实际上,我不确定它是否有唯一的解决方案。正如我所说,这里的a和B实际上是从2个音频信号的STFT导出的2个矩阵。函数E的目标是将B(k,l)的每一列乘以向量w(k),然后从a(k,l)中减去。在这种方法中,成本函数J不在任何地方使用,而J的梯度很重要。如果你想使用fminsearch,我想定标器应该是范数(J)。但是,使用fminsearch,我认为在大约250个元素的向量上最小化是不可行的(实际上我尝试过)谢谢,这是一个有趣的观点。但是,如果我没有错的话,mrdivide将为Aw=B或Aw-B=0(=J)求解……但是我需要最小化J^2,而不是J=0。(只是试图理解整件事)我忘了提到,A和B总是正实数向量,如果这有任何意义的话。@AbdFahim,是的,它在最小二乘意义上解决了这个问题,这正是你想要的。J=0也会使J^2=0,这是可以想象的最小值。如果不能实现,它会尽可能接近这个值。