我想使用matlab(A&B是向量)找到C的值,使得AB * C的标准偏差最小,其中C是标量。有任何想法吗 ?
问问题
248 次
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 回答