ホームページ >バックエンド開発 >Python チュートリアル >Python で最小二乗法を呼び出して実装する方法
いわゆる線形最小二乗法は、方程式を解くことの連続であると理解できますが、異なるのは、未知の量が方程式の数よりはるかに小さい場合、解けない問題が得られることです。最小二乗法の本質は、誤差を最小限に抑えながら未知の数値に値を割り当てることです。
最小二乗法は非常に古典的なアルゴリズムであり、私たちは高校でこの名前に触れたことがある、非常に一般的に使用されるアルゴリズムです。私は以前、線形最小二乗の原理と Python での実装について書きました: 最小二乗とその Python 実装; および scipy で非線形最小二乗を呼び出す方法: 非線形最小二乗(記事の最後にある補足コンテンツ) ;疎行列の最小二乗法である疎行列最小二乗法もあります。
以下では、numpy と scipy で実装された線形最小二乗法について説明し、2 つの速度を比較します。
最小二乗法は numpy に実装されています。つまり、lstsq(a,b) は、a@x=b と同様に x を解くために使用されます。ここで、a は M× です。 N 行列; b が M 行のベクトルのとき、それは連立一次方程式を解くのとまったく同じです。 Ax=b のような連立方程式の場合、A がフルランク シミュレーションの場合は x=A−1b と表現でき、それ以外の場合は x=(AT と表現できます) A)−1ATb.
b が M×K の行列の場合、列ごとに x のセットが計算されます。
戻り値は 4 つあり、フィッティングによって得られた x、フィッティング誤差、行列 a のランク、行列 a の単一値形式です。
import numpy as np np.random.seed(42) M = np.random.rand(4,4) x = np.arange(4) y = M@x xhat = np.linalg.lstsq(M,y) print(xhat[0]) #[0. 1. 2. 3.]
scipy.linalg は最小二乗関数も提供します。関数名も lstsq で、そのパラメーター リストは
lstsq(a, b, cond=None, overwrite_a=False, overwrite_b=False, check_finite=True, lapack_driver=None)
です。ここで、a、b は Ax です= b. どちらもオーバーライド可能なスイッチを提供します。これらを True に設定すると、実行時間を節約できます。さらに、この関数は、linalg の多くの関数が持つオプションである有限性チェックもサポートしています。戻り値は numpy の最小二乗関数と同じです。
cond は、特異値のしきい値を示す浮動小数点パラメータです。特異値が cond 未満の場合、特異値は破棄されます。
lapack_driver は文字列オプションで、LAPACK のどのアルゴリズム エンジンが選択されているかを示します。オプションで「gelsd」、「gelsy」、「gelss」です。
import scipy.linalg as sl xhat1 = sl.lstsq(M, y) print(xhat1[0]) # [0. 1. 2. 3.]
最後に、2 つの最小二乗関数セットの速度比較を行います
from timeit import timeit N = 100 A = np.random.rand(N,N) b = np.arange(N) timeit(lambda:np.linalg.lstsq(A, b), number=10) # 0.015487500000745058 timeit(lambda:sl.lstsq(A, b), number=10) # 0.011151800004881807
今回は、2 つの関数はそれほど離れていません。つまり、行列の次元が 500 に拡大されても、この 2 つはほぼ同じになります。
N = 500 A = np.random.rand(N,N) b = np.arange(N) timeit(lambda:np.linalg.lstsq(A, b), number=10) 0.389679799991427 timeit(lambda:sl.lstsq(A, b), number=10) 0.35642060000100173
Python は非線形最小二乗法を呼び出します
導入とコンストラクター
In In scipy さん、非線形最小二乗法の目的は、誤差関数の二乗和を最小化する一連の関数を見つけることです。これは次の式で表されます
ここで、ρ は損失関数を表し、fi(x) の前処理として理解できます。
scipy.optimize は、least_squares(fun, x0, jac, bounds, method, ftol, xtol, gtol, x_scale, f_scale, loss, jac_sparsity, max_nfev, verbose, args, kwargs)として定義される非線形最小二乗関数 minimum_squares をカプセル化します。このうち、func と x0 は必須パラメータであり、func は解く関数、x0 はfunction input の初期値。これら 2 つのパラメータにはデフォルト値はありません。これらは入力する必要があるパラメータです。 bound は解決間隔です。デフォルトは (−∞,∞) です。verbose が 1 の場合、終了出力が表示されます。verbose が 2 の場合、操作中の詳細情報が出力されます。 。さらに、次のパラメータを使用してエラーを制御しますが、これは比較的簡単です。
デフォルト値 |
備考 | |
---|---|---|
10 | -8#機能許容範囲 | #xtol | #10
独立変数許容差 | #gtol | #10-8 |
#xx_scale | 1.0 | 変数の特性スケール|
1.0 | 残余マージン価値############ |
以上がPython で最小二乗法を呼び出して実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。