最急降下法のプログラムを作っているのですが20回くらいで収束してしまいます.これは正しいのでしょうか?
コードに問題があるのでしょうか?
お教えいただけるとありがたいです.
pythonは初心者です.
python
1 2%matplotlib inline 3import matplotlib.pyplot as plt 4from math import * 5import numpy as np 6import sys 7from copy import * 8from random import * 9 10#次元の数 11size = 6 12 13#微分の式のdx 14dx = 1.0e-8 15 16#学習係数 17eta = 0.01 18 19#関数 20def function(x): 21 if len(x)!=size: 22 print('ERROR in function',len(x)) 23 sys.exit() 24 25 ans = 0 26 i=0 27 while i<5: 28 29 ans += (100*((x[i+1]-x[i]**2)**2) + ((1-x[i])**2)) 30 i += 1 31 return ans 32 33#ベクトルの足し算 34def tashizann(x,y): 35 wrk = np.array(x) + np.array(y) 36 return wrk.tolist() 37 38#ベクトルとスカラーの掛け算 39def kakezann(x,y):#x:vector, y:scalor 40 ans = [] 41 for xi in x: 42 ans.append(y*xi) 43 44 return ans 45 46#1階微分を数値で行う関数 47def get_gradient_vector(x): 48 #1階微分 49 ans = [] 50 i=0 51 52 while i<6: 53 #f(x+h)の作成 54 x_up = copy(x) 55 x_up[i] += dx 56 #f(x-h)の作成 57 x_down = copy(x) 58 x_down[i] -= dx 59 #勾配ベクトルをansに挿入 60 ans.append( (function(x_up)-function(x_down))/(2*dx) ) 61 #場所を1つあげる. 62 i += 1 63 64 return ans 65 66#ベクトルが0のみになったか確認 67def check(x): 68 for xi in x: 69 if xi != 0: 70 return False 71 return True 72 73#処理 74def process_of_GD(number): 75 #最急降下法 76 i = 0 77 n = [] 78 fn = [] 79 80 fig = plt.figure() 81 82 global dx 83 global eta 84 85 #初期値 86 point = [random(),random(),random(),random(),random(),random()] 87 88 #print("initial value is ",point) 89 90 string = "initial value is " + str(point) 91 92 93 # x方向のラベル 94 plt.xlabel("n") 95 # y方向のラベル 96 plt.ylabel("f(x_n)") 97 98 99 while True: 100 #プロット用 101 print((point)) 102 n.append(i) 103 fn.append(function(point)) 104 105 #勾配ベクトルの確認 106 gv = get_gradient_vector(point) 107 if check_sa(gv) == True: 108 print(gv) 109 break 110 111 #更新 112 point = tashizann(point, kakezann(gv, -1*eta)) 113 i += 1 114 if i>2000000: 115 print("over loop") 116 sys.exit() 117 118 plt.plot(n,fn) 119 plt.show() 120 121 #filename = "GD"+str(number)+".png" 122 123 #fig.savefig(filename) 124 125time = 0 126process_of_GD(time) 127
あなたの回答
tips
プレビュー