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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

Q&A

解決済

2回答

803閲覧

「ANDゲート」のイメージをグラフにしてみたい〜

okahijiki

総合スコア404

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

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

0グッド

0クリップ

投稿2019/08/31 08:48

「ゼロから作るDeepLearning」(斉藤康毅/オライリー・ジャパン)を参考に、ANDゲートの(任意の値を入れ、0と1のいずれかが出力される)クラスを書いてみました。

python

1w1,w2,θ = 0.5,0.5,0.8 2 3class AndClass: 4 def __init__(self,x1,x2): 5 self.x1=x1 6 self.x2=x2 7 def AND(self): 8 y=self.x1*w1+self.x2*w2 9 if y <=θ: 10 return 0 11 else: 12 return 1 13 14a1=AndClass(0.8,0.8) 15a1.AND() 16 170 18 19a2=AndClass(0.9,0.9) 20a2.AND() 21 221 23

ご覧のとおり、出力の確認にあたり、逐一、値を入れて確かめる...というのは、やっかいでして。できれば、グラフでざっくりした感じを、つかんでみたいのです。

◎質問です。

横軸をx1、縦軸をx2とした、出力される0と1を区分するグラフは描けるものでしょうか。以下のようなイメージとなります(ご参考程度に。グラフィックのソフトで当てずっぽうで描いています)。できるようなら、記述の方法をご教示くださいませ。

イメージ説明
◎やってみたこと。

python

1import numpy as np 2 3#x1、x2の任意の範囲を設ける 4x1=np.arange(-3,3,0.1) 5x2=np.arange(-3,3,0.1) 6 7#x1,x2の値をリスト化する 8x1_arr=[] 9for i in (x1): 10 x1_arr.append(i) 11 12x2_arr=[] 13for i in (x2): 14 x2_arr.append(i) 15 16#引数に、上記のリストの値を入れ、インスタンスを作ろうとしたところで、爆死〜 そのあとmatplotlibで、何とかして続けたいと思ったのですが... 17#そもそも、インスタンスを作るときにリストなど使えないだろうとも... 18a3=AndClass(x1_arr,x2_arr) 19a3.AND()

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

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

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

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

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

meg_

2019/08/31 10:01

Pythonでのグラフ描画の方法を学んでから実装した方が良さそうに思います。
okahijiki

2019/08/31 22:38

ご指摘、ありがとうございまーす。これからも学びを続けていきたいと存じますー。
guest

回答2

0

ベストアンサー

numpy.vectorizeを使うと少し簡潔に書けます。
参考:numpy.vectorizeの使い方

Python

1import matplotlib.pyplot as plt 2import numpy as np 3 4w1,w2,θ = 0.5,0.5,0.8 5 6class AndClass: 7 def __init__(self,x1,x2): 8 self.x1=x1 9 self.x2=x2 10 def AND(self): 11 y=self.x1*w1+self.x2*w2 12 if y <=θ: 13 return 0 14 else: 15 return 1 16 17def F(x, y): 18 a = AndClass(x, y) 19 return a.AND() 20 21fv = np.vectorize(F) 22 23x = np.arange(-3,4,0.1) # 範囲はお好みで 24xs, ys = np.meshgrid(x, x) 25zs = fv(xs, ys) 26 27plt.contourf(xs, ys, zs, cmap='Blues') 28plt.show()

イメージ説明

投稿2019/08/31 11:21

can110

総合スコア38262

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

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

okahijiki

2019/08/31 22:39

ご回答、ありがとうございました。 当てずっぽうで、じぶんなりに、じぶんの作ったクラスに、 a=AndClass(x1,x2) a.AND() を、ためしたり、ジタバタしておりました。 がしかし、インスタンスの引数に1,0のような数値でなく、x1,x2を入れるのは不可(エラー表示される)ということで、あえなく撃沈… ご教示いただいたような、クラスの属性にx,yの引数を渡す、新たに関数f()を作るアイデアは、考えも及びませんでした。 np.vectorize、ご紹介ありがとうございます。おかげさまでイメージ通りの表示がなされました。ほんじつ休日を利用して、マスターしてみたいと存じます。
guest

0

自分も勉強しながら書いてみました。
今の実装だとAND()は配列を受け付けられません。
numpyにはそれをできるようにする「ユニバーサル関数化」という手法があるそうです。

X,Yを入力、Zに結果にするような3Dグラフを書いてみました。

Python

1from mpl_toolkits.mplot3d import Axes3D 2import matplotlib.pyplot as plt 3import numpy as np 4 5 6w1,w2,Theta = 0.5,0.5,0.8 7 8class AndClass: 9 def __init__(self,x1,x2): 10 self.x1=x1 11 self.x2=x2 12 def AND(self): 13 y=self.x1*w1+self.x2*w2 14 if y <= Theta: 15 return 1 16 else: 17 return 0 18 19def func1(x, y): 20 return AndClass(x,y).AND() 21 22x = np.arange(-3.0, 3.0, 0.1) 23y = np.arange(-3.0, 3.0, 0.1) 24 25X, Y = np.meshgrid(x, y) 26 27ufunc1 = np.frompyfunc(func1, 2, 1) 28Z = ufunc1(X, Y) 29 30fig = plt.figure() 31ax = Axes3D(fig) 32 33ax.set_xlabel("x") 34ax.set_ylabel("y") 35ax.set_zlabel("AND(x, y)") 36 37ax.plot_wireframe(X, Y, Z) 38plt.show()

投稿2019/08/31 11:05

nomuken

総合スコア1627

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

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

okahijiki

2019/08/31 22:39

ご回答、ありがとうございます。 新たな関数func()を作るのですね。その発想がなく、まずは、こちらで、つまずいてしまっていました。 np.meshgrid、はじめて知りました。ありがとうございます。きょう、集中して学んでみようとおもいます。 表示は、想像していた以上の3Dとなりました。表示された瞬間、アッと思ったりしました。新鮮ですー。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問