Python 学習:多項式近似なら“Numpy”で

2014-06-09 :  PCクリニック
本文の前に、
-・・・ -・-
昨日昼前「たこ焼き」に 821位(0.03bg)でランクイン。
現時点での、blogramのランクインカテゴリは、
3、3、3、0、0、 0、0、0、0、0(41)で、換算ポイント 72pt 。
「Firefox」今朝方、3位にアップ。(日替わりパターン)
・-・ - -・

さて、本文。

近似(フィッティング:Fitting)に関しては、
もう3ヶ月以上前(2014-03-02)になる記事:
Python 学習:Fitting
で、
  ・・・・・
  「Scipy」パッケージを追加しておいて、その中の
  「optimize」モジュールの「curve_fit」関数を使う。
  これは、“non-linear least squares”
  即ち、“非線形最小二乗法”ですか。
    なお、その為には、
  「NumPy」パッケージも必要。
  これの“アレイ”関数で、データを定義する。
  ・・・・・

 import numpy as np
 from scipy.optimize import curve_fit

 x = np.array( [1, 2, 3, 4, 5, 6, 7, 10] )
 y = np.array( [8, 7, 6.5, 6, 5.8, 5.3, 5, 4] )
 def yfx( x, a, b ): return a * ( x ** (-1/b) )

 ab = curve_fit( yfx, x, y, p0=(1,1) )[0]
 a = ab[0]; b = ab[1]


の様に書いた。

この「scipy.optimize.curve_fit( yfx, x, y, p0=(1,1) )」
で、(多分どんな関数に対しても) yfx でフィッティングできる。

それで、フィッティングしたい関数が“多項式”だったら、・・・
もっと簡単(?)に出来ることが分かった。


そもそもは、
“微分”と云うか、“導関数”を求める方法を学習したくて、

「Google 検索」で、
Python 導関数
と検索した。
初めの方に出てくるのは、
予想通り、「SymPy」ですね。

そんな中で、
SciPy 利用ノート
が目に付いた。

このサイトの中に、
  ・・・・・
  ・・・・・
  SciPy Reference Guide
  ・・・・・
  ・・・・・
  Basic functions in Numpy (and top-level scipy)
  ・sp.isnan, sp.isfinite, sp.isinf を浮動小数点数の
    エラー検知に利用できる。
  ・array インスタンスを素早く作成するために、 sp.mgrid, sp.ogrid,
    sp.r_, sp.c_ の使い方を習得する。
    ・これらは相当な修練が必要そうに思える。
  ・poly1d で一変数多項式を定義することができる。
    ・p.integ で原始関数取得。キーワード引数 k が定数項。
    ・p.derive で導関数取得。
    ・p(arraylike) で評価。
  ・vectorize 関数を使うと、スカラー引数を取りスカラー値を戻す
    関数 func から、 array-like 版 func を新たに定義することができる。
  ・・・・・
  ・・・・・
などとあった。

ン?「poly1d」って???

「NumPy v1.8 Manual」の、
numpy.poly1d
に仕様説明がある。

例えば、
  f = numpy.poly1d( [ 1, 2, 3 ] )
とするだけで、2次の多項式が定義出来る!!!
  f.r
で、方程式“f==0”の根(root)を求めることも出来る!

それで、「SciPy 利用ノート」に戻ると、

  f.derive()

とすると、関数“f”の導関数を求めることが出来る?

!!! “derive”じゃなくて“deriv”!!!
numpy.poly1d.deriv
  poly1d.deriv( m=1 )
   Return a derivative of this polynomial.
   ===> この多項式の微分を返します。


と、
此所までは、当初の学習目的だった。


ここで、“polyfit”が目に付いた。

なので、
「NumPy v1.8 Manual」の、
numpy.polyfit
を見ると、・・・・・
  np.polyfit( x, y, deg, rcond=None, full=False, w=None, cov=False )
   Least squares polynomial fit.
  Fit a polynomial p(x) = p[0] x^deg + ... + p[deg] of degree deg to points (x, y).
  Returns a vector of coefficients p that minimises the squared error.
  例えば、
   x = np.array( [ 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 ] )
   y = np.array( [ 0.0, 0.8, 0.9, 0.1, -0.8, -1.0 ] )
  である、( x, y ) の組に対して、
   z = np.polyfit( x, y, 3 ) ・・・3次式でのフィッティング(近似)
  とすると、
   z == array( [ 0.08703704, -0.81349206, 1.69312169, -0.03968254 ] )
  ・・・・・ poly1d を使うと便利!
  It is convenient to use poly1d objects for dealing with polynomials:
   p = np.poly1d(z)
   p(0.5)  ==> 0.6143849206349179
  ・・・・・
などとあった。


これは、活用しよう。

poly1d・・・・・線形多項式定義
polyfit・・・・・多項式近似
poly1d.deriv・・・・・導関数取得 ==  numpy.polyder
poly1d.r・・・・・“f==0”の求根 =:= numpy.poly
poly1d.c・・・・・係数行列


<おまけ>
「Software Development Tidbits」の
Curve Fitting and Plotting in Python: Two Simple Examples
  Following are two examples of using Python
  for curve fitting and plotting.
  I'm using Python in a style that mimics Matlab --
  although I could have used a pure object oriented style
  if I wanted, as the matplotlib library for Python allows both.
  Example 1: Linear Fit
  ・・・・・
  ・・・・・
  Example 2: 6th Order Polynomial Fit
  ・・・・・
  ・・・・・
も参考にしよう。


本日はここまで。

Python 学習は続く、・・・



見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


140607
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
06 | 2017/07 | 08
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク