matlab:找到减少两个系列之间标准差的乘数

时间:2013-08-21 08:45:11

标签: matlab

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

按照@ EitanT的建议,试试:

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

修改

请注意,在上面我假设你想要最小化向量范数,但是在注释之后很明显你想要最小化数组中样本的std dev(A-B * 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修复的问题