0

我想使用matlab(A&B是向量)找到C的值,使得AB * C的标准偏差最小,其中C是标量。有任何想法吗 ?

4

2 回答 2

6

这不是编程问题,而是数学问题。你想找到c这样的

Var(A - c * B)

被最小化。但

Var(A - c*B) = Var(A) - 2 * c * Cov(A,B) + c^2 * Var(B)

微分并置零

-2 * Cov(A,B) + 2 * c * Var(B) = 0

这意味着

c = Cov(A,B) / Var(B)

您可以在 Matlab 中使用

M     = cov(A, B); # Now M = [varA, covAB; covAB, varB]
covAB = M(1,2);
varB  = M(2,2);
c     = covAB / varB;
于 2013-08-21T11:33:39.103 回答
0

按照@EitanT 的建议,尝试:

Ctry = 1.5; % define trial parameter first
Copt = fminsearch(@(x) sum((A-B*x).^2),Ctry)

编辑

请注意,在上面我假设您想要最小化向量范数,但是在评论之后很明显您想要最小化数组 (AB*x) 中样本的标准偏差,在这种情况下尝试

Ctry = 1.5; % define trial parameter first
Copt = fminsearch(@(x) var(A-B*x),Ctry)

如果您正在从 A 中执行向量 B 的列减法,您可以执行以下操作:

A=rand(900,100); B=randn(900,1); % example

Ctry = 1.5; % define parameter first
B = repmat(B,size(A,2),1);
Copt = fminsearch(@(x) var(A(:)-B*x),Ctry)
Eopt=var(A(:)-B*Copt)

@Luis Mendo 建议

nA = numel(A);
Copt = fminsearch(@(x) sum((A(:)-B*x).^2)-sum(A(:)-B*x)^2/nA,Ctry)

这在我的系统上要快一些。

此外,与所有最小化问题一样,如果您有一个良好的初始估计值,它会有所帮助。

编辑 值得注意的是,这两种方法都找到了第二个有效数字不同的点,这就提出了更准确的问题。<-- 只是一个可以用 optimset 解决的问题

于 2013-08-21T09:52:10.173 回答