主要内容

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

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

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

这样磅≤x≤乌兰巴托的问题,C是非常大的,也许太大存储。这种技术使用“trust-region-reflective”算法。

例如,考虑一个问题C是一个2 n×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 在一个测试系统太大)。

雅可比矩阵乘法函数具有以下语法。

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

动力系统是一个矩阵大小一样吗C,用作预调节器。如果C太大了,适合记忆,动力系统应该是稀疏的。Y是一个向量或矩阵大小的吗C * YC ' * Y是矩阵乘法。国旗告诉jmfcn产品形式:

  • 国旗> 0⇒w = C * Y

  • 国旗< 0⇒w = C ' * Y

  • 国旗= 0⇒w C = C的* * Y

因为C就是这样一个简单的结构矩阵,您可以很容易地编写一个雅可比矩阵乘法函数的向量v,没有形成C。每一行的C * Y是圆转的版本的产品吗vY。使用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停止,因为函数的相对变化值小于该函数宽容。”

辅助函数

这段代码创建了lsqcirculant3helper函数。

函数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));%分配矩阵ar = 1: len (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 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[]、[][],[],磅,乌兰巴托,[],选项);结束

另请参阅

|

相关的话题