ダブルループ学習を数学モデルで表現しつつ、Pythonでアニメーション

GPTで適当に生成。残しておきたいのでメモ

ダブルループ学習をもう少し、ドライにフラット捉えてみたかったので、数学モデルとライフゲームから連想した視覚化してみた。

中略。。。


コードの詳細な説明


import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from scipy import stats
import random

# 初期パラメータの設定
grid_size = 50
num_iterations = 100
noise_strength = 0.1  # ノイズの強さ

# セルの状態を表すクラス
class Cell:
    def __init__(self, action, value):
        self.action = action  # セルの行動変容(action)
        self.value = value    # セルの価値観変容(value)

# 新しいセルの状態を生成する関数
def generate_cell(cell, neighbors, strategy, frame):
    actions = np.array([n.action for n in neighbors])  # 隣接セルの行動を配列に格納
    values = np.array([n.value for n in neighbors])    # 隣接セルの価値観を配列に格納
    
    # ダブルループ学習の数式に基づいてセルの行動と価値観を更新する
    if strategy == 'mean':
        # 平均戦略
        new_action = (cell.action + np.mean(actions)) / 2 if actions.size > 0 else cell.action
        new_value = (cell.value + np.mean(values)) / 2 if values.size > 0 else cell.value
    elif strategy == 'mode':
        # 最頻値戦略
        mode_action = stats.mode(actions, axis=None)[0]
        mode_value = stats.mode(values, axis=None)[0]
        new_action = (cell.action + mode_action) / 2 if mode_action.size > 0 else cell.action
        new_value = (cell.value + mode_value) / 2 if mode_value.size > 0 else cell.value
    elif strategy == 'round_robin':
        # ラウンドロビン戦略
        round_robin_strategies = ['mean', 'mode', 'noise']
        current_index = (frame % 3)  # フレーム数に基づいて戦略を選択
        current_strategy = round_robin_strategies[current_index]
        return generate_cell(cell, neighbors, current_strategy, frame)
    elif strategy == 'noise':
        # ノイズ戦略
        new_action = (cell.action + np.mean(actions) + noise_strength * np.random.randn()) / 2 if actions.size > 0 else cell.action
        new_value = (cell.value + np.mean(values) + noise_strength * np.random.randn()) / 2 if values.size > 0 else cell.value
    
    return Cell(new_action, new_value)

# グリッドを初期化
def initialize_grid(size):
    return np.array([[Cell(np.random.rand(), np.random.rand()) for _ in range(size)] for _ in range(size)])

# 隣接セルを取得する関数
def get_neighbors(grid, x, y):
    neighbors = []
    for i in range(x-1, x+2):
        for j in range(y-1, y+2):
            if (i == x and j == y) or i < 0 or j < 0 or i >= grid_size or j >= grid_size:
                continue
            neighbors.append(grid[i][j])
    return neighbors

# グリッド全体を更新する関数
def update_grid(grid, strategy, frame):
    new_grid = np.copy(grid)
    for i in range(grid_size):
        for j in range(grid_size):
            neighbors = get_neighbors(grid, i, j)
            new_grid[i][j] = generate_cell(grid[i][j], neighbors, strategy, frame)
    return new_grid

# 初期グリッドを生成
initial_grid = initialize_grid(grid_size)

# 各戦略に対するグリッドのコピーを作成
grids = {
    'mean': np.copy(initial_grid),
    'mode': np.copy(initial_grid),
    'noise': np.copy(initial_grid),
    'round_robin': np.copy(initial_grid)
}

# アニメーションのセットアップ
fig, axes = plt.subplots(1, 4, figsize=(20, 5))
strategies = ['mean', 'mode', 'noise', 'round_robin']
ims = [axes[i].imshow([[cell.value for cell in row] for row in grids[strategy]], cmap='viridis', animated=True) for i, strategy in enumerate(strategies)]

def animate(frame):
    global grids
    updated_ims = []
    for i, strategy in enumerate(strategies):
        grids[strategy] = update_grid(grids[strategy], strategy, frame)
        data = np.array([[cell.value for cell in row] for row in grids[strategy]])
        ims[i].set_array(data)
        updated_ims.append(ims[i])
    return updated_ims

ani = animation.FuncAnimation(fig, animate, frames=num_iterations, interval=100, repeat=False, blit=True)

# タイトルを設定
for ax, strategy in zip(axes, strategies):
    ax.set_title(strategy.capitalize() + ' Strategy')
    ax.set_xticks([])
    ax.set_yticks([])

plt.show()


コードの各部分の説明

  1. Cellクラス:

    • 各セルの行動と価値観を保持するクラスです。

  2. generate_cell関数:

    • 各セルの新しい状態を生成する関数です。隣接セルの行動と価値観を使用して、新しい行動と価値観を計算します。戦略に基づいて異なる計算を行います。

  3. initialize_grid関数:

    • セルのグリッドを初期化します。ランダムな値でセルを生成します。

  4. get_neighbors関数:

    • 指定されたセルの隣接セルを取得します。

  5. update_grid関数:

    • グリッド全体を更新します。各セルについてgenerate_cell関数を呼び出し、新しい状態を計算します。

  6. アニメーションのセットアップ:

    • 各戦略ごとにグリッドをコピーし、並列で表示します。animate関数で各フレームごとにグリッドを更新し、FuncAnimationを使用してアニメーションを作成します。

このように、数学モデルに基づいてセルの行動と価値観を更新し、4つの異なる戦略を用いて価値観変容をシミュレートしています。

===
出力の断片。

メモ

動物が生き続けるは、個体&群衆&世代で空間Aから空間Bに移動し続けることを行なっている。人は客観的な位置情報だけでなく、価値観を大事にする傾向がある。人が生き続けるとは、空間Aから空有Bへ移動し続けるだけでなく、価値観Aから価値観Bへ移動しつづけること。シミュレーションでは価値観変容は色の濃淡で表現される。上ではすぐに収束するのではなくながく価値観変容をつづける戦略として、ノイズを取り込んでいる。ノイズってなんdなろうか。

この記事が気に入ったらサポートをしてみませんか?