雅可比矩阵乘法函数与线性最小二乘法
使用雅可比矩阵乘法函数,可以解决最小二乘问题的形式
这样磅≤x≤乌兰巴托
的问题,C是非常大的,也许太大存储。这种技术使用“trust-region-reflective”
算法。
例如,考虑一个问题C是一个2 n×n矩阵基于循环矩阵。的行C是一个行向量的变化v。这个例子的行向量v以元素的形式 :
,
在元素周期发生了变化。
这个最小二乘的例子考虑的问题
,
和约束条件 为 。
足够大的 ,稠密矩阵C不适合计算机内存( 在一个测试系统太大)。
雅可比矩阵乘法函数具有以下语法。
w = jmfcn(动力系统,Y,标志)
动力系统
是一个矩阵大小一样吗C,用作预调节器。如果C太大了,适合记忆,动力系统
应该是稀疏的。Y
是一个向量或矩阵大小的吗C * Y
或C ' * Y
是矩阵乘法。国旗
告诉jmfcn
产品形式:
国旗
> 0⇒w = C * Y
国旗
< 0⇒w = C ' * Y
国旗
= 0⇒w C = C的* * Y
因为C就是这样一个简单的结构矩阵,您可以很容易地编写一个雅可比矩阵乘法函数的向量v,没有形成C。每一行的C * Y
是圆转的版本的产品吗v次Y
。使用circshift
圆转变v。
来计算C * Y
,计算v * Y
找到第一行,然后转变v计算第二行,等等。
来计算C ' * Y
执行相同的计算,但使用的移动版本临时
,从第一行的向量形成C '
:
temp = [fliplr (v), fliplr (v)];
temp = [circshift (temp, 1 2) circshift (temp, 1, 2)];%现在temp = C ' (: 1)
来计算C ' * C * Y
简单的计算C * Y
使用变化v,然后计算C '
次使用变化的结果fliplr (v)
。
辅助函数lsqcirculant3
是雅可比矩阵乘法函数实现这个过程;它出现在这个例子。
的dolsqJac3
辅助函数在这个例子建立了向量v并调用解算器lsqlin
使用lsqcirculant3
雅可比矩阵乘法函数。
当n
= 3000,C是一个18000000 -稠密矩阵的元素。确定的结果dolsqJac3
函数n
在选定的值= 3000x,并显示输出结构。
[x, resnorm残留,exitflag,输出]= dolsqJac3 (3000);
局部最小值。lsqlin停止,因为函数的相对变化值小于公差的函数。
disp (x (1))
5.0000
disp (x (1500))
-0.5201
disp (x (3000))
-5.0000
disp(输出)
迭代:16个算法:“trust-region-reflective”firstorderopt: 5.9351 e-05 cgiterations: 36 constrviolation: [] linearsolver:[]消息:“局部最小值。↵↵lsqlin停止,因为函数的相对变化值小于该函数宽容。”
辅助函数
这段代码创建了lsqcirculant3
helper函数。
函数w = lsqcirculant3(动力系统,Y,国旗,v)%这个函数计算雅可比矩阵乘法函数%的2 n×n循环矩阵的例子。如果国旗> 0 w = Jpositive (Y);elseif国旗< 0 w = Jnegative (Y);其他的w = Jnegative (Jpositive (Y));结束函数一个= Jpositive(问)%计算C * qtemp = v;一个= 0(大小(q));%分配矩阵aa = [;];%的结果作为输入的两倍高。为r = 1:大小(a, 1) (r:) = temp * q;%计算仅仅行temp = circshift (temp, 1 2);%将循环结束结束函数一个= Jnegative(问)%计算C ' * qtemp = fliplr (v);temp = circshift (temp, 1 2);%的循环转移C 'len (q, 1) / 2 =大小;%返回向量的一半长%作为输入向量。= 0 (len大小(q, 2));%分配矩阵a为r = 1: len (r:) =(临时、临时)*问;%计算仅仅行temp = circshift (temp, 1 2);%将循环结束结束结束
这段代码创建了dolsqJac3
helper函数。
函数[x, resnorm残留,exitflag,输出]= dolsqJac3 (n)%r = 1: n - 1;%指数向量v (n) = (1) ^ (n + 1) / n;%分配向量vv (r) = (1) ^ (r + 1) / r;% C现在应该是一个基于v 2 n×n循环矩阵,%,但它可能太大,以适应到内存中。r = 1:2 * n;d (r) = n-r;动力系统= [speye (n); speye (n));%稀疏矩阵进行预处理%这个矩阵解算器是一个必需的输入;在本例中没有使用%预处理。%通过向量v,这样就不需要%计算雅可比矩阵乘法函数。选择= optimoptions (“lsqlin”,“算法”,“trust-region-reflective”,…“JacobianMultiplyFcn”@(动力系统,Y,国旗)lsqcirculant3(动力系统,Y,国旗,v));磅= 5 * 1 (1,n);乌兰巴托= 5 * 1 (1,n);[x, resnorm残留,exitflag,输出]=…lsqlin(动力系统d[]、[][],[],磅,乌兰巴托,[],选项);结束