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