質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1328閲覧

最急降下法のプログラムでつまづいています.

GAKU_SAY

総合スコア23

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2021/01/25 05:39

編集2021/01/25 07:18

最急降下法のプログラムを作っているのですが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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ockeghem

2021/01/25 05:55

プログラムの意図をソースコード(不完全かもしれない)から読み取れというのは酷な話なので、どのようなプログラムなのか、その意図や仕様を日本語で追記してください。
tiitoi

2021/01/25 05:59

f(x, y) = x^2 + y^2 のように最小となる解がわかってる関数を試してみて、おおよそその値になるかどうかを確認してみればいいのではないでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問