【发布时间】: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大小相同的向量,但它是一个与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,我猜缩放器应该是 norm(J)。但是,使用 fminsearch,我认为最小化大约 250 个元素的向量是不可行的(我实际上尝试过)
标签: matlab signal-processing mathematical-optimization least-squares gradient-descent