データサイエンス時代で活躍する人材になるために

データサイエンス時代で活躍できる人材になるために

純粋数学から応用数学までデータサイエンスに関わる様々なことについて取り上げます!

ニュートン・ラプソン(Newton-Raphson)法の基礎

 ニュートン・ラプソン(Newton-Raphson)法f(x)=0となる解を近似的に求める方法であり,解析的に解を求めることが困難な場合の有効な手法です.

f:id:koki12070930:20190520223334p:plain
図1
 図1を例に考えると,f(x)=0の近似解x_4を求めることが今回の目標となるわけです!ニュートン法を用いて,x_1 \rightarrow x_2\rightarrow x_3\rightarrow x_4という具合で近似解を求めます.

step1:
適当に初期値x_1を決め,x_1におけるf(x)の接線()~y=f'(x_1)(x-x_1)+f(x_1)を求める.
step2:
step1で求めた接線とx軸との交点x_2を求め,x_2におけるf(x)の接線(水色)を求める.
step3:
以下同様に,step1,2の操作を繰り返す.
x_kにおける接線を求める\rightarrow接戦とx軸との交点x_{k+1}を求める.\rightarrow x_{k+1}における接線を求める.
step4:
あるmに対して,x_mx_{m+1}の差の絶対値が限りなく小さくなった時,x_{m+1}f(x)の近似解とする.

以下にニュートン法のサンプルコードを記載します.ネットではC言語での実装が多かったので,Pythonでコードを書きました.
初期値x_1=3として,f(x)=x^3-2の近似解を求めてみました.

<サンプルコード>

from sympy import Symbol,diff,sympify
import math
f=input('式を入力してください:')
a=int(input('初期値を入力してください:'))
eps=1.0e-5
max=10
count=0
x=Symbol('x')
f = sympify(f)
df=diff(f,x)
for i in range(0,max):
    newa = a-(f.subs({x:a})/df.subs({x:a}))
    print(round(a,6))
    if abs(a-newa)<eps:
        a=newa
        break
    a=newa
    count=count+1
    if(count==max):
        print('収束しません')
print('反復回数は{0}回です.'.format(count))

<実行画面>

式を入力してください:x*x*x-2
初期値を入力してください:3
3
2.074074
1.537691
1.307076
1.261602
1.259923
反復回数は5回です.

 Newton-Raphson 法の簡単な修正法として,Fisher のスコア法というものがあります.Newton-Raphson 法,Fisherのスコア法は確立分布のパラメータ推定に役に立ちます.
近々,Newton-Raphson 法,Fisherのスコア法さらにEMアルゴリズムを用いて,確立分布のパラメータ推定について取り上げた記事を書きたいと思います.

ここまで読んでいただいてありがとうございました.ではまた!