人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

指数的成長モデルとロジスティック成長モデル

今年は、カオスを本格的に研究しようという目標を立てた(2011/1/1)。基本から体系だって理解しようというわけで下の本を読み始めている。パターン認識と機械学習(2010/8/29)のときと同じく漫然と読むだけでは身につかないのでPythonで実装してみることにしよう。カオスは計算機シミュレーションが可能になったことで探求が大幅に加速したそうなのでいろいろシミュレーションを試して自分の目で確認していきたいなぁ(特に4章のフラクタルとか楽しそうだな!)。

カオス 第1巻 - 力学系入門

カオス 第1巻 - 力学系入門

  • 作者: K.T.アリグッド,T.D.サウアー,J.A.ヨーク,津田一郎
  • 出版社/メーカー: シュプリンガー・ジャパン(株)
  • 発売日: 2006/12/28
  • メディア: 単行本
  • 購入: 3人 クリック: 94回
  • この商品を含むブログ (10件) を見る

まず手始めに、指数的成長モデルとロジスティック成長モデルを描画した。ここでは、関数の出力が入力にフィードバックする。

f:id:aidiary:20110219223912p:plain

このフィードバックをぐるぐるぐるぐる繰り返していったときに最終的に関数の出力がどう変化するかを見る。関数として指数的成長モデル f(x) = 2x とロジスティック成長モデル g(x) = 2x(1-x) の2つを与える。プログラムは、

#coding:utf-8
import numpy as np
from pylab import *

"""指数的成長モデルとロジスティック成長モデル"""

def drawModel(func, initial):
    """写像funcで初期値をinitialとしたときの軌道を描画"""
    nList = []
    yList = []
    nList.append(0)
    yList.append(initial)
    for n in range(1, 10):
        nList.append(n)
        yList.append(func(yList[n-1]))
    print nList
    print yList
    plot(nList, yList)

if __name__ == "__main__":
    # 初期値
    initial = 0.01
    # 指数的成長モデル f(x) = 2x
    drawModel(lambda x: 2 * x, initial)
    # ロジスティック成長モデル g(x) = 2x(1-x)
    drawModel(lambda x: 2 * x * (1 - x), initial)
    xlabel("n")
    ylabel("f^n (x)")
    show()

結果は、

f:id:aidiary:20110219215918p:plain

nはループをまわす回数を意味している。指数モデルはものすごい勢いで大きくなるが、ロジスティックモデルは0.5に収束する。指数モデルに因子 (1-x) がつくことで成長が抑えられる。次に、ロジスティックモデルは、0.0と1.0の任意の値から初めても同じ0.5に収束するそうなので試してみた。プログラムは、

#coding:utf-8
import numpy as np
from pylab import *

"""ロジスティックモデルは、0.0から1.0の間のどの値からでも
最終的に0.5に収束する"""

def drawModel(func, initial):
    """写像funcで初期値をinitialとしたときの軌道を描画"""
    nList = []
    yList = []
    nList.append(0)
    yList.append(initial)
    for n in range(1, 13):
        nList.append(n)
        yList.append(func(yList[n-1]))
    print nList
    print yList
    plot(nList, yList)

if __name__ == "__main__":
    # ロジスティックモデル g(x) = 2x(1-x)
    # 初期値を変えて複数の軌跡を描画
    for initial in np.arange(0.0, 1.0, 0.1):
        drawModel(lambda x: 2 * x * (1 - x), initial)
    xlabel("n")
    ylabel("g^n (x)")
    show()

結果は、

f:id:aidiary:20110219222441p:plain

確かに0.0から1.0の好きな値から初めてもループをまわすと最終的に0.5に「引き込まれる」ことがわかる。0.1と0.9、0.2と0.8といったように0.5を中心として対象にある点は同じ軌跡をたどっている。この様子は、クモの巣図法を使うと視覚的によくわかるとのこと。今回はロジスティックモデルを f(x) = 2x(1-x) としたが、この式の2をもっと大きくしていくとカオスが出現する。楽しみだ!

つづく。