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

matlab:找到减少两个系列之间标准偏差的乘法器,matlab,Matlab,我想用matlab(A和B是向量)求C的值,这样A-B*C的标准偏差最小,其中C是标量。有什么想法吗?按照@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

我想用matlab(A和B是向量)求C的值,这样A-B*C的标准偏差最小,其中C是标量。有什么想法吗?

按照@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)
如果要执行向量B与A的列式相减,可以执行以下操作:

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)
@路易斯·门多建议

nA = numel(A);
Copt = fminsearch(@(x) sum((A(:)-B*x).^2)-sum(A(:)-B*x)^2/nA,Ctry)
这在我的系统上要快一点

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

编辑
值得注意的是,这两种方法在第二个有效数字中找到了不同的点,这就提出了一个更准确的问题 按照@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)
如果要执行向量B与A的列式相减,可以执行以下操作:

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)
@路易斯·门多建议

nA = numel(A);
Copt = fminsearch(@(x) sum((A(:)-B*x).^2)-sum(A(:)-B*x)^2/nA,Ctry)
这在我的系统上要快一点

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

编辑
值得注意的是,这两种方法在第二个有效数字中找到了不同的点,这就提出了一个更准确的问题 这不是一个编程问题,这是一个数学问题。您希望找到
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;

这不是一个编程问题,这是一个数学问题。您希望找到
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;

你已经安装了吗?如果是这样的话,你应该读一读……你有没有安装过?如果是这样的话,你应该读一读……
sum()。^2
不是方差(只有在平均值为零的情况下)@Luis Mendo再看一次,我认为它是对的……只需使用
fminsearch(@(x)var(A-B*x),Ctry)
,当前的可能不对,至少这一个会更容易阅读。@DennisJaheruddin尝试
编辑var
并与我的代码进行比较…@TryHard norm(X,2)不是std dev!它不会减去平均值,而std会减去平均值
sum()。^2
不是方差(只有当均值为零时)@Luis Mendo再看看它,我认为它是对的…只要使用
fminsearch(@(x)var(A-B*x),Ctry)
,当前的一个可能不正确,至少这一个会更容易阅读。@DennisJaheruddin尝试
编辑var
,并与我的代码进行比较…@TryHard norm(x,2)不是std dev!它不会减去平均值,而std会减去平均值!非常好,思考什么问题需要解决总是好的,而不是试图立即解决它。技术说明:二阶导数是
2*var(B)
这是非负的,因此它保证是最小值。@Chris。。非常感谢…非常好,思考什么问题需要解决总是好的,而不是试图立即解决它。技术说明:二阶导数是
2*var(B)
这是非负的,因此它保证是最小值。@Chris。。谢谢。。。