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

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

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

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

受付中

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

sinonome1201
sinonome1201

総合スコア1

Python

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

2回答

0グッド

0クリップ

293閲覧

投稿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

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/11/10 10:30依頼された後にこの質問は修正されています

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

TakaiY

2022/11/10 10:52

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

回答2

1

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

退会済みユーザー👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

2022/11/10 15:31

こちらの回答が他のユーザーから「説明が不足している回答」という指摘を受けました。

0

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

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

投稿2022/11/10 14:56

TakaiY

総合スコア10467

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python

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