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

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

新規登録して質問してみよう
ただいま回答率
85.50%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

2回答

1171閲覧

引数を与えていないのになぜうまくいくのか。

genki_0330

総合スコア4

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2020/05/27 04:55

前提・実現したいこと

O'REILLYが出している[ゼロから作るDeep Learning]の第4章の数値積分のところで提供されているコードのf,t(おそらく引数)は指定されていないのに、なぜうまく折線が描画されているのかがわかりません。

発生している問題・エラーメッセージ

コードの内容が理解できない。

該当のソースコード

Python

1# coding: utf-8 2import numpy as np 3import matplotlib.pylab as plt 4 5 6def numerical_diff(f, x): 7 h = 1e-4 # 0.0001 8 return (f(x+h) - f(x-h)) / (2*h) 9 10 11def function_1(x): 12 return 0.01*x**2 + 0.1*x 13 14 15def tangent_line(f, x): 16 d = numerical_diff(f, x) 17 print(d) 18 y = f(x) - d*x 19 return lambda t: d*t + y 20 21x = np.arange(0.0, 20.0, 0.1) 22y = function_1(x) 23plt.xlabel("x") 24plt.ylabel("f(x)") 25 26tf = tangent_line(function_1, 5) 27y2 = tf(x) 28 29plt.plot(x, y) 30plt.plot(x, y2) 31plt.show() 32 33

補足情報(FW/ツールのバージョンなど)


実行したらこのようになります。

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

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

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

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

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

ozwk

2020/05/27 05:01

>コードのf,t(おそらく引数)は指定されていない どこのことですか?関数tangent_line内ですか?
guest

回答2

0

tangent_line(function_1, 5)tangent_lineの定義をみるに、
lambda t: d*t + y、つまりtを引数としてd*t+yを返す関数を返します

dd = numerical_diff(f, x)
yy = f(x) - d*x
fは引数で渡しているfunction_1
xは引数で渡している5です

で、tf=tangent_line(function_1, 5)ですからこの「tを引数としてd*t+yを返す関数」がtfに代入されて、
tf(x)で実行されてyに代入されてます。
ここのxx = np.arange(0.0, 20.0, 0.1)xです。


これが理解できるかって話かなと思うんですが...

python

1def add(x): 2 return lambda t : t + x 3 4 5add3 = add(3) 6print(add3(1)) # => 4 7print(add3(5)) # => 8 8 9add10 = add(10) 10print(add10(1)) # => 11

投稿2020/05/27 05:14

編集2020/05/27 05:45
ozwk

総合スコア13512

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

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

genki_0330

2020/05/27 05:28

t=np.arange(0.0,20.0,0.1)が必要だと思ったのですが、tの引数の中身は記述しなくてもよろしいのでしょうか?
ozwk

2020/05/27 05:35 編集

仮引数名と実際に渡す変数名は関係ありません def hoge(t)があったとして これを呼ぶコードがhoge(x)でも良いのと一緒です。 tに値が渡されるのは y=tf(x)のときです
genki_0330

2020/05/27 06:18

丁寧に教えていただきありがとうございました。 lambdaの使い方の理解が浅かったです。 的確なご指摘ありがとうございました。
guest

0

ベストアンサー

グラフを作成しているのは以下の部分です。

python

1plt.plot(x, y) 2plt.plot(x, y2)

それ以前の部分で折れ線の x 座標の一覧と y 座標の一覧を作成しています。
print() して中身を確認してみてください。

python

1print(x) 2print(y) 3print(y2)

追記

図を描画するプロセスは理解しているのですが、y2の一覧を作る過程がわかっていない状態です。

コードにコメントを入れる形で解説しました。わかりやすいように一部変数名等は変えましたが、質問のコードと内容は同じです。

接線の方程式の導出は以下を参照してください。

接線の方程式の求め方|数学|苦手解決Q&A|進研ゼミ高校講座|ベネッセコーポレーション

python

1import numpy as np 2 3 4def numerical_diff(f, x): 5 h = 1e-4 6 # f'(x) の値を中心差分近似で計算する。 7 return (f(x + h) - f(x - h)) / (2 * h) 8 9 10def function_1(x): 11 return 0.01 * x ** 2 + 0.1 * x 12 13 14def tangent_line(f, a): 15 # f'(a) (接線の傾き) を計算する。 16 d = numerical_diff(f, a) 17 18 # 関数 f 上の点 (a, f(a)) を通る接線の y の値を計算する関数を作成して返す。 19 # 関数上の点 (a, f(a)) を通る接線の方程式は y = f'(a)(x - a) + f(a) なので、 20 return lambda t: d * (x - a) + f(a) # ここで返しているのは値ではなく、関数 21 22 23# [0, 20) を 0.1 刻みにした配列を作成する。 24x = np.arange(0.0, 20.0, 0.1) 25print(x) 26 27# 先程作成した x の各値に対応する関数 f(x) = 0.01 x^2 + 0.1 x の値一覧を作成する。 28y = function_1(x) 29print(y) 30 31# 関数上の点 (5, f(5)) を通る接線の y の値を計算する関数を作成する。 32tf = tangent_line(function_1, 5) # tf は関数 33# 先程作成した x の各値に対応する関数 tf(x) の値一覧を作成する。 34y2 = tf(x)

tangent_line() は y の値を計算しているのではなく、接線の y の値を計算するための関数を作成して返しているという点を理解すれば、疑問点は解消されるのではないでしょうか。

python

1def make_func(a): 2 return lambda x: x + a 3 4f = make_func(5) 5 6x = np.linspace(0, 5, 10) 7y = f(x) 8print(x) 9print(y)

投稿2020/05/27 04:58

編集2020/05/27 05:31
tiitoi

総合スコア21956

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

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

genki_0330

2020/05/27 05:06

回答してくださりありがとうございます。 図を描画するプロセスは理解しているのですが、y2の一覧を作る過程がわかっていない状態です。 質問が分かりにくく申し訳ございません。
tiitoi

2020/05/27 05:27

追記しましたが、いかがでしょうか
genki_0330

2020/05/27 06:13

すごく分かり易かったです! lambdaの使い方がいまいちわかっていませんでした。 丁寧な解説ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問