日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

【scipy】Python调用非线性最小二乘法

發(fā)布時(shí)間:2024/1/1 python 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【scipy】Python调用非线性最小二乘法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

    • 簡介與構(gòu)造函數(shù)
    • 迭代策略
    • 雅可比矩陣
    • 測試

簡介與構(gòu)造函數(shù)

在scipy中,非線性最小二乘法的目的是找到一組函數(shù),使得誤差函數(shù)的平方和最小,可以表示為如下公式

arg?min?fiF(x)=0.5∑i=0m?1ρ(fi(x)2),x∈[L,R]\argmin_{f_i} F(x) = 0.5\sum_{i=0}^{m-1}\rho(f_i(x)^2),\quad x\in[L,R] fi?argmin?F(x)=0.5i=0m?1?ρ(fi?(x)2),x[L,R]

其中ρ\rhoρ表示損失函數(shù),可以理解為對fi(x)f_i(x)fi?(x)的一次預(yù)處理。

scipy.optimize中封裝了非線性最小二乘法函數(shù)least_squares,其定義為

least_squares(fun, x0, jac, bounds, method, ftol, xtol, gtol, x_scale, f_scale, loss, jac_sparsity, max_nfev, verbose, args, kwargs)

其中,func和x0為必選參數(shù),func為待求解函數(shù),x0為函數(shù)輸入的初值,這兩者無默認(rèn)值,為必須輸入的參數(shù)。

bound為求解區(qū)間,默認(rèn)(?∞,∞)(-\infty,\infty)(?,),verbose為1時(shí),會(huì)有終止輸出,為2時(shí)會(huì)print更多的運(yùn)算過程中的信息。此外下面幾個(gè)參數(shù)用于控制誤差,比較簡單。

默認(rèn)值備注
ftol10?810^{-8}10?8函數(shù)容忍度
xtol10?810^{-8}10?8自變量容忍度
gtol10?810^{-8}10?8梯度容忍度
x_scale1.0變量的特征尺度
f_scale1.0殘差邊際值

loss為損失函數(shù),就是上面公式中的ρ\rhoρ,默認(rèn)為linear,可選值包括

  • linear:ρ(z)=z\rho(z)=zρ(z)=z,此為標(biāo)準(zhǔn)非線性最小二乘法
  • soft_l1: ρ(z)=2(1+z?1)\rho(z)=2(\sqrt{1 + z}-1)ρ(z)=2(1+z??1), 相當(dāng)于L1損失的平滑
  • huber: 當(dāng)z?1z\leqslant1z?1時(shí),ρ(z)=z\rho(z)=zρ(z)=z,否則ρ(z)=2z?1\rho(z)=2\sqrt{z}-1ρ(z)=2z??1, 表現(xiàn)與soft_l1相似
  • cauchy: ρ(z)=ln?(1+z)\rho(z) = \ln(1 + z)ρ(z)=ln(1+z)
  • arctan:ρ(z)=arctan?(z)\rho(z) = \arctan(z)ρ(z)=arctan(z)

迭代策略

上面的公式僅給出了算法的目的,但并未暴露其細(xì)節(jié)。關(guān)于如何找到最小值,則需要確定搜索最小值的方法,method為最小值搜索的方案,共有三種選項(xiàng),默認(rèn)為trf

  • trf:即Trust Region Reflective,信賴域反射算法
  • dogbox:信賴域狗腿算法
  • lm:Levenberg-Marquardt算法

這三種方法都是信賴域方法的延申,信賴域的優(yōu)化思想其實(shí)就是從單點(diǎn)的迭代變成了區(qū)間的迭代,由于本文的目的是介紹scipy中所封裝好的非線性最小二乘函數(shù),故而僅對其原理做簡略的介紹。

對于優(yōu)化問題min?x∈Rnf(x)\min_{x\in R^n} f(x)minxRn?f(x)而言,定義當(dāng)前點(diǎn)的鄰域

Ωk={x∈Rn∣∥x?xk∥?r}\Omega_k=\{x\in R^n\big\vert \Vert x-x_k\Vert\leqslant r\}Ωk?={xRn?x?xk??r}

其中rrr為置信半徑,假設(shè)在這個(gè)鄰域內(nèi),目標(biāo)函數(shù)可以近似為線性或二次函數(shù),則可通過二次模型得到區(qū)間中的極小值點(diǎn)sks_ksk?。然后以這個(gè)極小值點(diǎn)為中心,繼續(xù)優(yōu)化信賴域所對應(yīng)的區(qū)間。

s=x?xks=x-x_ks=x?xk?, 表示步長;gk=?f(xk),Bk≈?2f(xk)g_k=\nabla f(x_k), B_k\approx\nabla^2 f(x_k)gk?=?f(xk?),Bk??2f(xk?)分別是函數(shù)的一階導(dǎo)數(shù)和黑塞矩陣的近似,則對上述問題進(jìn)行Taylor展開,可以得到一個(gè)二階的近似模型

arg?min?qk(s)=f(xk)+gkTs+12sTBks,∥s∥?r\argmin q^{k}(s)=f(x_k)+g_k^Ts+\frac{1}{2}s^TB_ks, \Vert s\Vert\leqslant r argminqk(s)=f(xk?)+gkT?s+21?sTBk?s,s?r

BkB_kBk?被定義為黑塞矩陣的近似,當(dāng)其表示為雅可比矩陣JkTJkJ_k^TJ_kJkT?Jk?時(shí),所得到的迭代方案便是著名的高斯牛頓法,而LM算法在在高斯牛頓的基礎(chǔ)上,添加了一個(gè)阻尼因子,可記作JkTJk+μIJ_k^TJ_k+\mu IJkT?Jk?+μI

狗腿法的鮑威爾提出的一種迭代方案,特點(diǎn)是新定義了下降比,即隨著sss的不斷前進(jìn),目標(biāo)函數(shù)和模型函數(shù)都會(huì)發(fā)生變化,則可定義二者的變化率rk=f(xk)?f(xk+s)qk(0)?qk(s)r_k=\frac{f(x_k)-f(x_k+s)}{q^k(0)-q^k(s)}rk?=qk(0)?qk(s)f(xk?)?f(xk?+s)?,根據(jù)這個(gè)值的變化,來調(diào)整信賴域半徑rrr的值。

以上就是信賴域方法的基本原理。

雅可比矩陣

在了解了信賴域方法之后,就會(huì)明白雅可比矩陣在數(shù)值求解時(shí)的重要作用,而如何計(jì)算雅可比矩陣,則是接下來需要考慮的問題。jac參數(shù)為計(jì)算雅可比矩陣的方法,主要提供了三種方案,分別是基于兩點(diǎn)的2-point;基于三點(diǎn)的3-point;以及基于復(fù)數(shù)步長的cs。一般來說,三點(diǎn)的精度高于兩點(diǎn),但速度也慢一倍。

此外,可以輸入自定義函數(shù)來計(jì)算雅可比矩陣。

測試

最后,測試一下非線性最小二乘法

import numpy as np from scipy.optimize import least_squaresdef test(xs):_sum = 0.0for i in range(len(xs)):_sum = _sum + (1-np.cos((xs[i]*i)/5)*(i+1))return _sumx0 = np.random.rand(5) ret = least_squares(test, x0) msg = f"最小值" + ", ".join([f"{x:.4f}" for x in ret.x]) msg += f"\nf(x)={ret.fun[0]:.4f}" print(msg) ''' 最小值0.9557, 0.5371, 1.5714, 1.6931, 5.2294 f(x)=0.0000 '''

總結(jié)

以上是生活随笔為你收集整理的【scipy】Python调用非线性最小二乘法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。