目次
Math
Analysis
Experiment
Simulations

00Julia on Jupyter notebook

JuliaをJupyter notebookで使えるようにする方法

Juliaとは

Juliaは2012年と比較的最近開発されたプログラミング言語で,機械学習や数値計算と相性が良い言語として近年のデータサイエンス界隈で評価されています.
なんかできたかも

構文がシンプルであること,計算処理が高速であることが主な人気の理由のようです.といっても,PythonでもNumpy使ったりCupyでGPU使ったりした場合に比較するとどうなのかはよく知りません.とりあえず,

あたりが主な特徴ぽいです.

難点は,ともかく教材が少ないことです.プログラミングにある程度精通していないと,困った時に参考にできる記事も少ないし,ハードルが高いです(特に日本語の資料は本当に少ない).これは即ち,ライブラリが少なく様々な機能を自分で実装する必要があるということでもあります.

あと,Pythonと違って汎用性が低いので,上記のような用途以外で使おうと思うとPythonに劣ります.

が,それでも得意分野でPythonと比べたら処理速度30倍なんてうたわれている言語ですので,今回は導入してみます.だいたいCと同等以上の処理速度ですね.動的なのにそれはすごいです.

Juliaのダウンロード

Download

まずは公式のダウンロードページから自分のバージョンにあったものをダウンロードします.

筆者はwindowsなので,囲った部分です.Macの人はMacを選びます.

Install

インストーラーのダウンロードが終わったらクリックして実行.デフォルト設定のままでOKなのでInstall.

起動を簡単にするため,PATHの設定はチェックしておくことをおすすめします.

完了したら,Run Juliaにチェックをつけ,Finishします.

JuliaをJupyter Notebookに追加

以上の内容が出来ていれば,とりあえずJuliaを利用することは出来るようになったはずです.しかし筆者はJupyterを開発環境として使いたいので,その連携を進めていきます.

Jupyter Notebookがない場合には先にこちらから環境構築をしてください.
筆者みたいにおしゃれにするのはこちら.

起動とIJuliaのインストール

インストールが終わったら,juliaを起動します.
前項でRun Juliaにチェックがついていれば勝手につくと思いますが,そうしていなかった場合は普通に検索して起動してください.

こんな感じの画面が表示されれば,juliaのインストールは正常に出来ています.

可愛いですね.\が文字コードの関係で¥になっているのはご愛敬ということで.ちょっと使ってみた感じ,なかなか独特な使用方法になっている気がします.そこらへんは後々紹介しますが,とりあえず環境構築を進めちゃいます.

IJuliaパッケージのインストール

JuliaをJupyter Notebookで使うためにはIJuliaをいうパッケージが必要らしいです.インストールしましょう.

Juliaでのパッケージインストールには]を使います.これを打つとプロンプトの表示がjuliaから(@v1.x) pkgに変わるはずです.数字の部分はバージョンによって異なります.自分の場合は

となります.

add IJulia

と入力し,実行することでIJuliaのインストールが開始します.

進行中...

完了したらバックスペースを押して,通常の画面にもどります.

Jupyter notebookとの接続

IJuliaのインストールが完了したら,Jupyter NotebookでJuliaを呼び出せるはずです,Jupyter Notebookを起動してください.

Newファイルの作成画面に,PythonだけでなくJuliaが表示されるようになっているはずです.これで,Jupyter Notebookを使ってJuliaが書けるようになりました.

パッケージマネージャ(Pkg)について

Juliaを使っていると,拡張でパッケージをいれたくなることがあります.Juliaでは,それらの拡張パッケージのインストール,更新,削除などはJulia組み込みのPkgを通して行うことになります.

Pkgを利用する方法は2種類です.一つは先程も行ったように]をtypeすることでPkgモード?に切り替える方法で,これをするとプロンプトの表示が

のように,pkgに切り替わります.この状態ではJuliaの関数は効かず,pkgの関数のみがworkする状態になります.脱出するにはバックスペースです.

あるいは,もう一つのやり方はJuliaのプロンプトのまま,

using Pkg; Pkg.add("IJulia")

のように記述することです.意味するところは一緒ですが,このやり方だと記述が面倒な分,モードの切り替えはなしですみます.

add以外にも代表的なコマンドを以下にまとめます.

addの注意点

PyCallというパッケージを入れていた時に生じた問題です.このパッケージは,JuliaからPythonを呼び出す時に使われるものなのですが,その時どのPythonを呼び出すねんってところで怒られた,というか不具合が生じました.

筆者はよくある汚い環境を使ってしまっているため,普通にPython3と,Anaconda環境のPython3とPython2が混在しています.こういった場合,PyCallが呼び出すPythonのディレクトリを明示的に与えてあげる必要があったりするようです.

やり方は

using Pkg
ENV["PYTHON"] = "C:\\Users\\...\\python.exe"

Pkg.build("PyCall")

のようにすることです.これで,呼び出すpythonのバージョンを指定した上でPyCallを入れることが出来ました.

Juliaのすごいところ

と,ここまではPythonのpip installなどと何も変わらなそうです.しかしJuliaのPkgとそれらの大きな違い,Juliaのすごいところは,環境ごとにこれらのパッケージの依存関係を管理できることです.

今,Pkgを使っている際のプロンプトは(v1.x)のような表示になっていると思います.これは最初,Juliaのバージョンであると説明しました.つまりローカル環境の大元の環境となります.

しかしこのプロンプトが表示している真の意味は,今現在のアクティブ環境となります.つまり,Pkgによって改変される環境のことです.

そう,Juliaは,というよりPkgは,プロジェクトごとに扱うパッケージの種類やバージョンを切り替えることができるというわけです!

実験してみます.まずはカレントディレクトリを確認します.

適切な場所に移動しました.Juliaのおもちゃ箱で遊んでいきます.また余談ですが,Juliaは\を文字列として利用してしまうので,2個使いましょう.あるいは

のように,rawをつけることでもパスの指定が出来ます.

さて,ではここに新しい環境を作ってみます.

  1. activate xxxで新しくアクティブ環境を設定します.プロジェクト名はxxxです.プロンプトの表示が,tutorialに変わったことが確認できます.
  2. この環境の情報を取得するには,statusを使います.今は何も追加しない空の環境として定義したので,emptyとなっています.
  3. addを使って,exampleパッケージを追加しました.これが終了すると,もう一度statusを使った際に今加えたパッケージが表示されています.

このように,環境,つまりプロジェクトごとにパッケージを指定できるのがメリットです.さらに,この際いれていたパッケージの依存関係はProject.tomlに保存されています.

このファイルごとプロジェクトを共有することで,「他者がダウンロードして自分の環境で実行しようとした時にバージョンの関係で動かない...」なんて自体を回避することが出来ます.

たとえば,Nonlinear Dynamics (George Datseris, Ulrich Parlitz, 2022)の公開しているプロジェクトを自分のローカルに展開して試したい場合,彼らのREADMEにもあるように,ダウンロードしたプロジェクトに対して

Pkg.activate("path/to/the/downloaded/project/folder")
Pkg.instantiate()

をしてあげれば,このプロジェクトで使用されているパッケージが全て (しかもバージョンを合わせて) インストールされ,すぐに実行可能になるわけです!!

上の画像はちょっと失敗しているのもあるっぽいけど,まあそれでも便利です.

ダウンロードしたプログラムの実行

ということで,さっそくNonlinear Dynamics (George Datseris, Ulrich Parlitz, 2022)の1-1の図を出力してみます.

まずはPkgを使ってアクティブ環境を切り替えて,必要なパッケージの読み込みをさせます.その後はコピペで進めます.おまじないらしきものたちの実行.

問題なく動いたので,図の出力部分を実行してみました.無事に下の図が得られましたので,動作チェック終了です.

Julia,というかそれを使った非線形物理学の勉強楽しみ.

動作確認

ということで,環境構築は無事終了です.しかしせっかくなので,ちょっとだけ自分でコードして動かしてみたいと思います.

実際に力学系のプロットをやっていく.

とりあえずLorenz系の視覚化を目指します.

ローレンツ方程式には,1963年のLorenz63モデルと96年の96モデルがありますが, ここでは次元数が低い63モデルの方をプロットしてみます.

モデルは以下の通りです.
x˙=σ(yx)y˙=xz+ρxyz˙=xyβz\dot{x} = \sigma(y-x)\\ \dot{y} = -xz+\rho x - y\\ \dot{z} = xy-\beta z\\

まずはJuliaのDynamicalSystems パッケージを読み込みます.線形および非線形の力学系で遊ぶ際に使える便利機能が盛りだくさんです.

今回は,

  1. Lorenz系の方程式と初期値のセットを与えて
  2. どのように発展するのかの軌道をtrajectory関数で計算させ
  3. 呼び出したPythonのmatplotlibを使って視覚表示

をさせてみます.

using DynamicalSystems
using PyCall
#@pyimport matplotlib.pyplot as plt
#@pyimport mpl_toolkits.mplot3d as mpl3

まずは必要なパッケージの読み込み.下二つはPythonのmatplotlibを呼び出すためのものなんですけど,いまいち毎回必要なのか初回onlyなのか分からなかったです.とりあえずおまじない.

次にローレンツ系の方程式を与えます.

function lorenz_rule(u,p,t)
    σ, ρ, β = p
    x, y, z = u
    dx = σ*(y - x)
    dy = x*(ρ - z) - y
    dz = x*y - β*z
    return SVector(dx, dy, dz)
end

ここで面白いのが,(他の言語でもあるのかもしれないけど知らなかった),JuliaはTeX形式で特殊記号を直接扱えることです.

\sigma

とタイプしてTabを押すことで,プログラム内で記号σ\sigmaを使えます.面白い.

p = [10.0, 28.0, 8/3]
u_theta = [0.0, 10.0, 0.0]

lorenz = ContinuousDynamicalSystem(lorenz_rule, u_theta, p)

T = 100.0
deltat = 0.01
A = trajectory(lorenz, T; deltat)

初期値などなどの設定.ここで素晴らしいのは,trajectoryだけで勝手に軌道を計算してくれることですね.とても便利です.

fig = plt.figure()
fig.add_subplot(projection="3d")

plot(A[:,1], A[:,2], A[:,3], "-", color="r", lw=0.5)
title("Lorenz63")
plt.show()

結果はpythonのmatplotlibで表示.なんか浮気しているみたいでソワソワしますが,こんな簡単に呼び出せるのは重宝しますね.記法も一緒です.

あ,あと注意点は,Juliaのindexは1始まりです.気持ち悪いですが,ここは慣れる必要がありますね.Pythonの記法なので間違えそうです.

実際にこれで表示されたのが

です!!できた!!

ヘルプの使い方およびソースコードの見方

また,Juliaのfunctionについては

?trajectory

のようにタイプすることで詳細をみることが出来ます.

下の方見ると,この関数はDifferentialEquationsを呼び出しているようです.今度はそっちを調べるといった形に深堀っていけば理解が深まるはずです.

また,プログラムがある程度触れる or 勤勉な人なら,実際に数学ソースコードを見たいと思うはずです.そういった場合には

のように@editコマンドを使うことでソースを開くことが出来ます.面白いのはこれ,多分普通に関数のソースなわけではなく,【この場合のソース】が表示されるんですかね?引数の指定までしないといけなかったので...

結果はたとえば以下のようになります.

Home