成本函数的最小二乘法
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 总是正实数向量。
你的问题实际上是一系列相互独立的问题。如果我们用 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
据我所知,没有办法进一步向量化此计算。
在任何情况下,都不需要使用梯度下降或其他形式的优化算法。
我的目标是在 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 总是正实数向量。
你的问题实际上是一系列相互独立的问题。如果我们用 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
据我所知,没有办法进一步向量化此计算。
在任何情况下,都不需要使用梯度下降或其他形式的优化算法。