matlib’s lsqnonlin 和 scipy.optimize’s least_square

问题

有三个点 $A,B,C$ , 经过一个线性变换 $T$ , 变为了 $A’,B’,C’$ 三点,现在知道 $A,B,C$ , $A’,B’,C’$ 六个点坐标, 求出相应的变换 $T$ ?

matlab

matlab 使用的都是矩阵运算,所以一切在都要化成矩阵形式。直接将问题写成矩阵形式有一些不直观。所以首先将问题写成一些线性方程组的形式,根据线性方程组的形式再写出矩阵的形式。
假设

  • 线性方程组的形式 为:

其中前两个一组两个一组,第一个和第二个方程组组成的矩阵形式为:

将六个方程组合并成为:

矩阵的表示形式之后,使用 MATLAB 的程序 lsqnonlin 优化程序得到 $T$ .

lsqnonlin 的输入是要优化的函数句柄和初始参数向量 $X$ ,输出是一个结果向量。注意这里输入和输出都是向量。当要优化的变量是矩阵形式的时候,例如本例子中的 $T$ , 需要人为的将其变为向量作为参数向量传入要被 lsqnonlin 优化的函数,同样,当结果也是矩阵形式时候,也要做类似转换。

针对上面的公式 和 分析 ,得出的 MATLAB 代码如下:

function F = foo(T)
T = reshape(T,3,2);
R = [-2^0.5/2,0,2^0.5 ;
-2^0.5/2+1,0+1,0+1;
1,1,1];
A = [1+3,0+3,-1+3;
0+1,0+1,1+1];
F = reshape(T'*R-A,1,[]); %向量化 % 命令行调用函数
lsqnonlin(@foo,ones(3,2)) ans = -0.7071 0.7071
-0.7071 -0.7071
3.7071 1.7071

由上面返回的 ans 结果可以得到 $T$ 。

python’s scipy.optimize

scipy 中的数值计算不同于 MATLAB ,是基于元素的 , 所以我们没必要将线性方程组化为矩阵形式 。
坐标的线性变换为 ,

其中 $x,y$ 可以分别是列向量,
所以假设

则可以写成

为了方便写代码,这里将$T$ 的各个元素的顺序改变了一下。其中 x[:,[1,0]] 是将两列换一下。

所以对应的代码为:

In [9]: def foo1(T):
...:
...: R = np.array([ [-2**0.5/2,0,2**0.5 ],
...: [-2**0.5/2+1,0+1,0+1大专栏  Matlib’s lsqnonlin 和 scipy.optimize’s least_squaren>]]).T
...: A = np.array([ [1+3,0+3,-1+3],
...: [0+1,0+1,1+1]]).T
...:
...: return np.ndarray.flatten(T[:2]*R+T[2:4]*A[:,[1,0]]+T[4:])
...: from scipy.optimize import least_squares as l_s
...: T0 = np.ones(shape=(6,))
...: print(l_s(foo1,T0))
...:
active_mask: array([ 0., 0., 0., 0., 0., 0.])
cost: 6.1972286281607316e-46
fun: array([ -2.62791580e-23, -1.37051771e-24, 4.13590306e-24,
0.00000000e+00, 2.27798139e-23, -3.30872245e-24])
grad: array([ 5.07976927e-23, -3.71013779e-24, 2.34163730e-23,
-1.20995158e-23, 6.36559009e-25, -4.67924016e-24])
jac: array([[-0.70710678, 0. , 1. , 0. , 1. ,
-0. ],
[ 0. , 0.29289322, -0. , 4. , 0. ,
1. ],
[ 0. , 0. , 1. , 0. , 1. ,
-0. ],
[ 0. , 1. , -0. , 3. , 0. ,
1. ],
[ 1.41421356, 0. , 2. , 0. , 1. ,
-0. ],
[ 0. , 1. , -0. , 2. , 0. ,
1. ]])
message: '`gtol` termination condition is satisfied.'
nfev: 3
njev: 3
optimality: 5.0797692652871677e-23
status: 1
success: True
x: array([ 4.30133919e-23, 6.61744490e-24, -4.21862112e-23,
3.30872245e-24, 4.63221143e-23, -1.65436123e-23])

lsqnonlin 和 least_square 的函数封装方法

对于这两个函数的传入的要优化的函数 , 该函数的输出是一个向量 ,假设该向量为:

则通过lsqnonlin 和least_square 之后的包裹为:

其中 $c$ 是一个常量。

Matlib’s lsqnonlin 和 scipy.optimize’s least_square的更多相关文章

  1. 使用python scipy.optimize linprog和lingo线性规划求解最大值,最小值(运筹学学习笔记)

    1.线性规划模型: 2.使用python scipy.optimize linprog求解模型最优解: 在这里我们用到scipy中的linprog进行求解,linprog的用法见https://doc ...

  2. Scipy教程 - 优化和拟合库scipy.optimize

    http://blog.csdn.net/pipisorry/article/details/51106570 最优化函数库Optimization 优化是找到最小值或等式的数值解的问题.scipy. ...

  3. Scipy优化算法--scipy.optimize.fmin_tnc()/minimize()

    scipy中的optimize子包中提供了常用的最优化算法函数实现,我们可以直接调用这些函数完成我们的优化问题. scipy.optimize包提供了几种常用的优化算法. 该模块包含以下几个方面 使用 ...

  4. scipy.optimize.minimize 解决实际问题

    接上博客问题http://www.cnblogs.com/shizhenqiang/p/8274806.html # coding=utf-8 from scipy import optimize i ...

  5. 非线性规划带约束-scipy.optimize.minimize

    # coding=utf-8 from scipy import optimize import numpy as np def get(args): a, b, c, d, e, f, g, h = ...

  6. python scipy优化器模块(optimize)

    pyhton数据处理与分析之scipy优化器及不同函数求根 1.Scipy的优化器模块optimize可以用来求取不同函数在多个约束条件下的最优化问题,也可以用来求取函数在某一点附近的根和对应的函数值 ...

  7. python scipy学习-曲线拟合

    根据某地每月的平均温度[17, 19, 21, 28, 33, 38, 37, 37, 31, 23, 19, 18]拟合温度函数. import numpy as np import matplot ...

  8. 使用Python scipy linprog 线性规划求最大值或最小值(使用Python学习数学建模笔记)

    函数格式 scipy.optimize.linprog(c, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=None, method='simp ...

  9. 数据分析(4):Scipy

    科学计算 最小二乘leastsq # -*- coding: utf-8 -*- def func(x,p): # p 参数列表 A,k,theta = p; # 可以一一对应赋值 return A* ...

随机推荐

  1. pix2pix-tf官方文档

    # 对抗网络的基本思想 # 假设有一种概率分布M,它相对于我们是一个黑盒子.为了了解这个黑盒子中的东西是什么,我们构建了两个东西G和D, # G是另一种我们完全知道的概率分布,D用来区分一个事件是由黑 ...

  2. MySql数据库,查询数据导出时会出现重复的记录(数据越多越明显)

    在查询数据时,数据量多的时候,我们会使用分页功能. 每页显示多少数据. 这种情况下,一半看不出什么问题. 而导出数据时,有时就是通过分页的方法,逐步讲数据追加到导出文件中. 当全部数据都导出之后,就有 ...

  3. Matlab高级教程_第一篇:Matlab基础知识提炼_05

    第九节:矩阵的操作 第十节:数组与矩阵 linspace函数

  4. CodeForces - 697B

    这道题看见就觉得是道水题,想着随便写写就能A了,然后就开始上手直接模拟,然后就被数据打脸了. 后面就困了一个多小时,各种改,最后还是看了题解发现了scanf的多种用法. 题目大概意思就是说: 给一个  ...

  5. 统计学中比较重要的分布及python中使用方法

    比较重要的四种分布:正态分布.卡方分布.F分布.t分布 卡方分布概率密度曲线 t分布概率密度曲线 F分布概率密度曲线 参考资料: 统计学中四个概率分布 重要抽样分布

  6. 形参和实参|默认值|可选实参|tuple|*tuple|args|*args | **kwargs|args[:]|

    #!/usr/bin/python def hello(i,greet='long time to see!'): out = "hello "+i+" "+g ...

  7. AtCoder Beginner Contest 126

    因为本人rating太低,这场比赛还要记rating就来划水了,果然垫底了. 6题都很水,于是头一次在网赛中AK,不过由于网卡+手速太慢还是成功垫底. ABE 签到.不贴代码了,因为A考察字符串读入和 ...

  8. 吴裕雄--天生自然python学习笔记:python 用pygame模块角色类(Sprite)移动与碰撞

    角色类(Sprite) Py game 游戏中有许多组件会重复用到,比如射击宇宙飞船的游戏中,外星宇宙 飞船可能多达数十艘 , 通过创建“角色类”,可以生成多个相同的对象. Py game 角色类是游 ...

  9. range|Sample Standard Deviation|标准差几何意义

    Measures of Variation 方差:measures of variation or measures of spread 源于range发现range不足以评估整个set(因为只用到l ...

  10. JS替换变量中的文字字母

    var text='Hello world, Hello world'; var b= text.replace('world','zhengxiaoya'); // 找到字符串中的第一个'world ...