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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

NumPy

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

Q&A

0回答

2831閲覧

K状態N近傍のセル・オートマトンを作りたい

Chihiro0313

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Matplotlib

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

NumPy

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Python

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

0グッド

0クリップ

投稿2020/05/14 13:57

前提・実現したいこと

初めて質問させていただきます。
N状態K近傍のセルオートマトン(CA)を実装して
ラングトンが提唱したλパラメータと相互情報量のグラフを出力し、カオスの縁を確認したいと思っています。
しかし、いざコードを実行してみると、状態4あたりでλの値が後半で急に上昇してしまいます。
おそらく一般化したCAのプログラムが違うと思うのですが、どこをどう直せがいいかさっぱり分かりません。
もし、間違っているところがあれば指摘して欲しいです。よろしくお願いいたします。

該当のソースコード

Python

1import matplotlib.pyplot as plt 2import numpy as np 3import random as rnd 4 5#一次元データの系列をリストで受け取り、そのエントロピーを返す 6def calcEntropy(data): 7 dic = {} 8 for d in data: 9 if d in dic: 10 dic[d] = dic[d] + 1 11 else: 12 dic[d] = 1 13 14 probdist = np.array(list(dic.values()), dtype = float) / float(len(data)) 15 return(np.sum([- p * np.log2(p) for p in probdist])) 16 17#2種類のリストの結合エントロピーを返す 18def calcJointEntropy(x,y): 19 data = [] 20 21 for m in range(len(x)): 22 data1 = x[m] 23 data2 = y[m] 24 data.append((data1,data2)) 25 26 dic = {} 27 28 for d in data: 29 if d in dic: 30 dic[d] = dic[d] + 1 31 else: 32 dic[d] = 1 33 34 probdist = np.array(list(dic.values()), dtype = float) / float(len(data)) 35 return(np.sum([- p * np.log2(p) for p in probdist])) 36 37#2種類のリストの相互情報量を返す 38def calcMI(x,y): 39 H_X = calcEntropy(x) 40 H_Y = calcEntropy(y) 41 H_XY = calcJointEntropy(x,y) 42 return(H_X + H_Y - H_XY) 43 44#CAのデータから各セルの相互情報量を算出し、リストとして返す 45def calcCAMIList(data): 46 MIList = [] 47 48 for l in range(len(data)): 49 List = [] 50 dd = [row[l] for row in data] 51 52 for t in range(0,len(dd)): 53 x = [] 54 y = [] 55 for i in range(6): 56 x.append(dd[(t+i)%len(dd)]) 57 y.append(dd[(t+1+i)%len(dd)]) 58 a = calcMI(x,y) 59 List.append(a) 60 61 MIList.append(List) 62 63 return(MIList) 64 65#全てのセルの相互情報量を平均を返す 66def calcCAMI(data): 67 d = calcCAMIList(data) 68 List = [] 69 darray = np.array(d) 70 for l in range(len(darray)): 71 L = np.sum(darray[l]) / darray.shape[0] 72 List.append(L) 73 74 List_n = np.array(List) / len(List) 75 return(np.sum(List_n)) 76 77#K状態N近傍のCAを計算する 78def NK_CA(l, t, cell_i, K, N, n): 79 cell = cell_i 80 data = [cell] 81 lambda1 = (K**N - n)/K**N 82 83#K状態でのRULEの振る舞い 84 np.random.seed(10000) 85 RULE = [] 86 for i in range(K**N): 87 if np.random.rand()< lambda1: 88 r = np.random.randint(1,K) 89 RULE.append(r) 90 91 else:RULE.append(0) 92 93#N近傍でのneighboringstateの振る舞い。N/2の切り落としでどこから見ていくのかを割り出し、一つずつ足して行きました。 94 for t in range(t): 95 cell_next = [0 for i in range(l)] 96 for j in range(l): 97 neighboringstate = 0 98 for m in range(N): 99 neighboringstate = cell[int(j+(m-(N-1)/2)+l)%l]*(K**(N-1-m)) 100 101 cell_next[j] = RULE[neighboringstate] 102 103 cell = cell_next 104 data.append(cell) 105 106 return(data,lambda1) 107 108#横軸λ、縦軸相互情報量の平均としたグラフに表す 109L = 101 110T = 100 111cell_init = [0 for i in range(L)] 112cell_init[L//2] = 1 113 114lambda2 = [] 115mi = [] 116 117for k in range(2,5): 118 for n in range(3,5): 119 for n_n in range(1, k**n+1): 120 dataXY, lam = KN_CA(L, T, cell_init, k, n, n_n) 121 calc_mi,mi_sum = calcCAMI(dataXY) 122 lambda2.append(lam) 123 mi.append(mi_sum) 124 125 126fig = plt.figure(figsize=(5,5)) 127ax = fig.add_subplot(1,1,1) 128ax.plot(lambda2, mi,'.') 129plt.xlabel('lambda') 130plt.ylabel('averageMI') 131plt.show()

試したこと

NK_CAのneighboringstateでjから離れるほどかける値を小さくなるように組みましたが、余計値がばらついてしまいました。

###環境
MacOS Catalina バージョン10.15.4
Jupyter Notebook

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問