主要内容

线性最小二乘的雅可比矩阵乘函数

使用雅可比矩阵乘函数,您可以解决这种形式的最小二乘问题

最小值 x 1 2 C x - d 2 2

这样lb≤x≤ub,对于问题在哪里C非常大,也许太大了。对于这种技术,使用'信任区域反光'算法。

例如,考虑一个问题在哪里C是一个基于循环矩阵的2n×n矩阵。的行C是行矢量的班次v。这个例子有行向量v使用表单的元素 ( - - - - - - 1 ) k + 1 / k :

v = ( 1 , - 1 / 2 , 1 / 3. , - 1 / 4 , , - 1 / n ] ,

元素循环移位的地方。

C = ( 1 - 1 / 2 1 / 3. - 1 / n - 1 / n 1 - 1 / 2 1 / ( n - 1 ) 1 / ( n - 1 ) - 1 / n 1 - 1 / ( n - 2 ) - 1 / 2 1 / 3. - 1 / 4 1 1 - 1 / 2 1 / 3. - 1 / n - 1 / n 1 - 1 / 2 1 / ( n - 1 ) 1 / ( n - 1 ) - 1 / n 1 - 1 / ( n - 2 ) - 1 / 2 1 / 3. - 1 / 4 1 ]

这个最小二乘例子考虑的问题是

d = ( n - 1 , n - 2 , , - n ] ,

约束条件是 - 5 x 5 = 1 , , n

足够大的 n 、稠密矩阵C不适合计算机内存( n = 1 0 , 0 0 0 在一个测试系统上太大)。

Jacobian乘法函数具有以下语法。

w = jmfcn(动力系统,Y,标志)

jinfo是矩阵相同的尺寸C,用作前提者。如果C太大,无法装入内存,jinfo应该是稀疏的。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)];% Now temp = C'(1,:)

来计算C ' * C * Y,简单地计算C * Y使用班次v,然后计算C '乘以移位的结果fliplr (v)

辅助函数lsqcirculant3.是一种实现此过程的Jacobian乘法功能;它出现在此示例的结尾

dolsqJac3的辅助函数此示例的结尾建立矢量v并调用求解器lsqlin使用lsqcirculant3.Jacobian乘法函数。

什么时候n= 3000,C是一个18,000,000元素的密集基质。确定结果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算法:“信任-区域-反射”firstorderopt: 5.9351e-05 cgiterations: 36约束:[]线性求解器:[]消息:“局部最小可能。↵↵lsqlin停止,因为函数的相对变化值小于该函数宽容。”

辅助函数

此代码创建lsqcirculant3.helper函数。

功能w = lsqcirculant3(动力系统,Y,国旗,v)%此函数计算雅可比矩阵乘函数对于2N-By-N循环矩阵示例的%如果flag > 0 w = Jpositive(Y);elseifflag < 0 w = Jnegative(Y);其他的w = Jnegative (Jpositive (Y));结束功能一个= Jpositive(问)%计算C * qtemp = v;一个= 0(大小(q));分配矩阵a的%a = [;];%结果是输入的两倍高。a(r,:) = temp*q;%计算第r行temp = circshift (temp, 1 2);移循环液结束结束功能一个= Jnegative(问)%计算C ' * qtemp = pliplr(v);temp = circshift (temp, 1 2);为C'改变循环len (q, 1) / 2 =大小;%返回的向量是原来长度的一半%作为输入向量。= 0 (len大小(q, 2));分配矩阵a的%len (r,:) = [temp,temp]*q;%计算第r行temp = circshift (temp, 1 2);移循环液结束结束结束

此代码创建dolsqJac3helper函数。

功能[x, resnorm残留,exitflag,输出]= dolsqJac3 (n)%r = 1:n-1;生成向量的%索引v(n)=(-1)^(n + 1)/ n;%分配矢​​量vv (r) = (1) ^ (r + 1) / r;现在C应该是一个基于v的2n×n循环矩阵,%但它可能太大而无法装入内存。r = 1:2 * n;d(r)= n-r;jinfo = [speye(n); speye(n)];用于预处理的稀疏矩阵%该矩阵是求解器所需的输入;在这个例子中没有使用预条件作用。%传递向量v,这样它就不需要%计算在雅可比矩阵乘函数中。选项= Optimoptions('lsqlin',“算法”,'信任区域反光',“JacobianMultiplyFcn”,@(jinfo,y,flag)lsqcirculant3(jinfo,y,flag,v));lb = -5 *α(1,n);UB = 5 *那些(1,n);[x,Resnorm,剩余,ExitFlag,输出] =lsqlin(动力系统d[]、[][],[],磅,乌兰巴托,[],选项);结束

另请参阅

|

相关话题