ターミナルアトラクタを組み込んだ複製・競合メカニズムによる効率的な機械学習.
構築データ空間からランダムにデータ点が与えられたとき,そのデータ点群から元の信号を推定する.
推定方法として,複製・競合動径基底関数ネットワーク(RC-RBFN)を使用する.
しかし,RC-RBFNには複製における計算量の課題がある.そこで計算量を考慮した複製方法を提案して実装を行う.
また,従来の機械学習手法にRC-RBFNを組み込むことを提案する.
| モジュール | version | 用途 |
| pandas | データ収集やデータフレームへの格納などに用いる | |
| numpy | 数値計算を効率的に行うための拡張モジュール | |
| numba | サブセットのソースコードを高速に実行する機械語に変換するJITコンパイラ | |
| matplotlib | グラフ描写の為のライブラリ | |
| scipy | 数値解析ライブラリ |
モジュールのインストールはコマンドプロンプトでpip install モジュール名
バージョンまで指定する場合はコマンドプロンプトでpip install モジュール名==指定するバージョン でインストールする
Pythonのバージョンは3.10.14(指定しなくてもいいかもしれない)
↓動作環境(また置き換える)
テキストエディタはVisualStudioCodeを使用する.
ダウンロードはこのページ( https://code.visualstudio.com/ )から行う.
VSCの設定は各自好きな拡張機能入れてもらえれば
↑右上の「カーネルの選択」→「Python環境」で構築した環境を選べばOK
VAR-LiNGAMの分析ではPythonのモジュール「LiNGAM」のVAR-LiNGAMを用いる. これはhttps://lingam.readthedocs.io/en/latest/tutorial/var.html を参考にすればよい
path = "用いるデータのパス" df=pd.read_csv(path,parse_dates=True,index_col="Day",encoding="cp932") scaler = MinMaxScaler() normalized_df = pd.DataFrame(scaler.fit_transform(df), columns=df.columns) model = lingam.VARLiNGAM(lags=2, prune=True) model.fit(normalized_df)
上のコードではデータの読み取り,正規化を行い,それについてVAR-LiNGAMを実行している.
labels = [f'{col}(t)' for i, col in enumerate(normalized_df.columns)]+[f'{col}(t-1)' for i,col in enumerate(df.columns)]
make_dot(np.hstack(model.adjacency_matrices_),
lower_limit=0.05,
ignore_shape=True,
labels=labels
)
上のコードで2次元グラフを作成している.このコードは結果を出すうえで特に必要ないため,実行しなくても良いが必要になった場合にはgraphvizのインストールが必要になる. graphvizのインストールについては以下のサイトを参考にした
https://www.kkaneko.jp/tools/win/graphviz.html
model = lingam.VARLiNGAM() result = model.bootstrap(normalized_df,n_sampling=100)
これでLiNGAMのVAR-LiNGAMをモデルとして設定し,ブートストラップ法による分析を行っている.n_samplingの数でサンプリング回数を設定し,今回は100回になっているが,用いるデータのサンプル数を考慮し設定する必要がある. ブートストラップ法では一般的に用いるデータのサンプル数よりも大きいものを設定することが望ましい.
p_values = model.get_error_independence_p_values()
これで誤差変数間の独立性を分析する.
cdc = result.get_causal_direction_counts(n_directions=8, min_causal_effect=0.3, split_by_causal_effect_sign=True)
このコードで因果関係の方向性を取得する.n_directionは上位いくつの因果方向を限定するかを設定するものであり,min_causal_effectでは係数が何以上の因果方向に限定するかを指定できる.
print_causal_directions(cdc, 100, labels=labels)
でその結果を描画できる.
dagc = result.get_directed_acyclic_graph_counts(n_dags=3, min_causal_effect=0.2, split_by_causal_effect_sign=True)
これではDAGのランキングを取得できる.また,
causal_effects = result.get_total_causal_effects(min_causal_effect=0.01) df = pd.DataFrame(causal_effects)
df['from'] = df['from'].apply(lambda x : labels[x]) df['to'] = df['to'].apply(lambda x : labels[x]) df
これで合計因果関係を取得することができ,この結果を用いて3Dグラフの作成を行うため,pandasのto_csvを用いることでcsvファイルに保存しておく.
#ref(): File not found: "ingakekka.PNG" at page "小澤さん卒論_backup"
得られた因果性は上のような形式で保存される. fromには影響を与えている要素,toには影響を与えられている要素,valueには因果性の大きさが格納されている. 一行ずつ因果の向きと大きさが格納されている
1.シナプス結合荷重wの更新 競争を考慮したシナプス可塑性方程式(適者生存型学習則) に従って更新する。
ここでαj(ϕ)は内的自然増加率、γjk(ϕ) は競争係数を示し以下のような式で成り立つ
2.動径基底関数の中心𝑚𝑗の更新 従来のRBFNにおける更新式は以下の通りである
RC-RBFNでは自由エネルギーを考慮します。更新式は条件付確率密度関数𝑝𝛽′(𝑥𝑖∣𝑚𝑗[𝑖]) を用いて最急降下方向に従って更新されます。
θは(w_0,w_j,w_jk)かなっている. このθの中身がtheta.csvには格納され,これを用いて復元を行う.
df['from'] = df['from'].apply(lambda x : labels[x])