我想找到C的值,使得使用matlab(A& B是向量),A-B * C的标准偏差最小,其中C将是标量。有什么想法吗?
答案 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修复的问题