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

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

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

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

Q&A

2回答

1094閲覧

単純パーセプトロンでORゲートを実現したい

sinonome1201

総合スコア1

Python

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

0グッド

0クリップ

投稿2022/11/10 08:52

編集2022/11/10 13:57

前提

pythonを使っております。
単純パーセプトロンでORゲートを実現するプログラムを作りたいです。

実現したいこと

・例題4.1を参照して、以下のようにpreparedata()関数を定義する。
引数:データ数kk
機能:ORゲートの入力と出力の組をkk組作って、配列orgatedataに保存する。
戻り値:配列orgatedata

・preparedata()関数を呼び出して、ORゲートのデータを作成する。

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

エラーメッセージ

該当のソースコード Python

#例題4.1 # ANDゲートの入出力データを作成 import numpy as np # データの数(行数) kk = 10000 # 重みの数(列数) nn = 2 # データ作成 xx = np.random.randint(0,2, (kk, nn)) yy = xx[:, 0] & xx[:, 1] # 作成したデータをnpzファイルに保存 filename = "andgate"+str(kk)+".npz" np.savez(filename, x=xx, y=yy) ***************************************************************** #この下のソースコードに例題4.1を参照する import numpy as np import matplotlib.pyplot as plt import datetime # 重みの学習 def weightlearning(wwold, errork, xxk, eta): wwnew = wwold + eta*errork*xxk return wwnew # 線形結合器 def linearcombiner(ww, xxk): y = np.dot(ww,xxk) return y # 平均誤り def checkerrorrate(error, shiftlen, k): if(k>shiftlen): errorshift = np.abs(error[k+1-shiftlen:k]) else: errorshift = np.abs(error[0:k]) errorave = np.average(errorshift) return errorave # ステップ関数 def stepfunction(x): if x>=0: return 1 else: return 0 # 平均誤りのグラフを作成 def plotevalerror(errorave, kk): x = np.arange(0, kk, 1) plt.figure(figsize=(10, 6)) plt.plot(x, errorave[0:kk]) plt.title("Average Error", fontsize=20) plt.xlabel("k", fontsize=16) plt.ylabel("Average error", fontsize=16) plt.savefig("ch4ex3fig1.png") return # 重みのグラフを作成 def plotweights(ww0, ww1, ww2, kk): x = np.arange(0, kk, 1) plt.figure(figsize=(10, 6)) plt.plot(x, ww0[0:kk], color="red", linestyle="-", label="ww0") plt.plot(x, ww1[0:kk], color="blue", linestyle="--", label="ww1") plt.plot(x, ww2[0:kk], color="green", linestyle="-.", label="ww2") plt.title("Weights", fontsize=20) plt.xlabel("k", fontsize=16) plt.ylabel("Weight", fontsize=16) plt.legend() plt.savefig("ch4ex3fig2.png") return # メイン関数 def main(): eta = 5.0e-1 epsilon = 0.001 shiftlen = 100 # データを読み込む. andgatedata = np.load("andgate10000.npz") xx = andgatedata["x"] kk, nn = xx.shape one = np.ones([kk,1]) xx = np.concatenate((one, xx), 1) kk, nn = xx.shape zztrue = andgatedata["y"] print("zztrue size=", zztrue.shape) # 繰返し:学習過程 wwold = [0.0, 0.0, 0.0] error = np.zeros(kk) errorave = np.zeros(kk) ww = np.empty([kk,nn]) for k in range(kk): yyk = linearcombiner(wwold, xx[k]) zzk = stepfunction(yyk) error[k] = zztrue[k] - zzk errorave[k] = checkerrorrate(error, shiftlen, k) print("k={0} zztrue={1:.4f} zz={2:.4f} errorave={3:.8f}".format(k, zztrue[k], zzk, errorave[k])) if(k>shiftlen and errorave[k]<epsilon): break wwnew = weightlearning(wwold, error[k], xx[k], eta) wwold = wwnew ww[k,:] = wwold # 重みの学習結果を表示 print("重みの学習結果: w0=", wwold[0], "w1=", wwold[1], "w2=", wwold[2]) plotevalerror(errorave, k) plotweights(ww[:,0], ww[:,1], ww[:,2], k) return # ここから実行 if __name__ == "__main__": start_time = datetime.datetime.now() main() end_time = datetime.datetime.now() elapsed_time = end_time - start_time print("経過時間=", elapsed_time) print("すべて完了 !!!")

試したこと

ソースコードの仕組みがよくわからずどこを変更したらよいか分かりません。自分なりに考えた結果
例題4.1の
yy = xx[:, 0] & xx[:, 1]
のソースコードは配列xxの1列目と2列目をAND計算していることが分かったため、試行錯誤してみましたができませんでした。

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

Visual Studio Code

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

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

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

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

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

TakaiY

2022/11/10 10:52

「どうやってもORゲートの実現方法がわかりません」とありますが、何がわからないのでしょう? そもそも、このプログラムがどのように動いているか理解できないとかですか? ORゲートを実現するために何が必要がわかりますか?
guest

回答2

0

Logic

1AND(x, y) = min(x, y) 2OR(x, y) = max(x, y) 3AND(x, y)+OR(x, y) = min(x, y)+max(x, y) = x+y 4 5OR(x, y) = max(x, y) = x+y-min(x, y) = x+y-AND(x, y)

投稿2022/11/10 10:00

atcoderyellow

総合スコア481

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

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

0

yy = xx[:, 0] & xx[:, 1]
のソースコードは配列xxの1列目と2列目をAND計算していることが分かった

のですよね。
なぜ AND 計算をしているかと言えば、ANDゲートとなるように学習させるための教師データを作っているのですから、 OR 計算をするようにすればいいでしょう。

投稿2022/11/10 14:56

TakaiY

総合スコア12801

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問