【问题标题】:Least square minimization of a Cost function成本函数的最小二乘法
【发布时间】:2015-08-23 07:15:19
【问题描述】:

我的目标是在 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 和 B 始终是正实数向量。

【问题讨论】:

  • 这里有几个奇怪的地方。首先,您的代码只运行一次迭代,因此您没有给我们即使经过 1000 次迭代也不会停止的代码。其次,您的梯度函数应该返回一个与w 大小相同的向量,但它是一个与AB 大小相同的矩阵。然后你只取第一列,所以它只取决于AB 的第一列,所以实际上你只是解决了那一列的问题。
  • 第三(尽管与您的代码无关),您的成本函数也具有完整矩阵的大小,它应该是一个标量。我认为您应该将其定义为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,我猜缩放器应该是 norm(J)。但是,使用 fminsearch,我认为最小化大约 250 个元素的向量是不可行的(我实际上尝试过)

标签: matlab signal-processing mathematical-optimization least-squares gradient-descent


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,这很有趣。但是,如果我没记错的话,mrdivide 将解决 Aw=B 或 Aw-B = 0 (=J) ...但我需要最小化 J^2,而不是 J = 0。(只是想了解整体东西)
  • 我忘了说,A & B 总是正实数向量,如果这有任何意义的话。
  • @AbdFahim,是的,它以最小二乘的方式解决了这个问题,这正是你想要的。 J = 0 也会使 J^2 = 0,这是可以想象的最小值。如果无法实现,则尽可能接近。
猜你喜欢
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 2014-04-28
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2011-09-16
相关资源
最近更新 更多