『実践Julia入門』
https://gyazo.com/8fd8b6e33ab8929d00e30520bcae0d4e
サンプルコードが利用できる
REPLにコピペして使うことが想定されている
プロジェクト環境をactivateして起動する
$ julia --project=@.
【入門編】
第1章 Juliaのインストールと開発
1-1. Juliaの特徴
1-1-1. Juliaは高速!
1-1-2. Juliaは動的!
1-1-3. Juliaは動的型付け!
1-1-4. Juliaは多重ディスパッチ!
1-1-5. 直感的な記述!
1-1-6. 真のマクロ!
1-1-7. 並行・並列プログラミング!
1-1-8. 組み込みパッケージマネージャ!
1-2. Juliaのインストール
1-2-1. Juliaの公式バイナリをインストールする
Windows (Windows10,Windows11)
macOS (x86,ARM)
Linux
1-2-2. juliaupを利用したインストール
Juliaupを使うと Juliaのバージョン管理が楽あんも.icon juliaupのインストール(Windows10,Windows11)
juliaupのインストール(Linux,macOS等)
juliaupによる Juliaのインストール・更新(Windows/Linux/macOS共通)
コラム. 安定版とLTS版
1-3. Juliaを REPLで使用する
1-3-1. Julia モード
1-3-2. ヘルプモード
1-3-3. シェルモード
1-3-4. パッケージモード
1-3-5. 履歴検索機能
1-4. Juliaを JupyterLabで使用する
1-4-1. JupyterLabおよび IJuliaのインストール
IJuliaを利用して JupyterLabをインストールする
JupyterLabを Pythonのパッケージマネージャからインストールする
デスクトップアプリとしてインストールする
Julia カーネルを追加する
1-4-2. JupyterLabによる Juliaの実験
1-4-3. 各種クラウドサービス(ノートブック環境)での Juliaの利用
コラム. Pluto.jl
1-5. Juliaをエディタで使用する
1-5-1. Visual Studio Code (VSCode) と Julia プラグインの導入
第2章 Juliaの基本文法
2-1. リテラル
2-1-1. 数値リテラル
整数値
浮動小数点数値
有理数/複素数
2-1-2. 文字リテラル/文字列リテラル
文字
文字列
2-1-3. 正規表現リテラル
2-1-4. 非標準文字列リテラル
2-1-5. 範囲リテラル
2-1-6. 配列リテラル
ベクトル(1次元配列)
行列(2次元配列)
多次元配列(Julia v1.7以降)
ベクトル・行列の結合
多次元配列の結合(Julia v1.7以降)
2-1-7. タプルリテラル/名前付きタプルリテラル
2-1-8. その他のリテラル
2-2. 変数/定数
コラム. Juliaの定数は実は変更できる
2-3. 演算子
2-3-1. 算術演算子
除算演算子
冪乗演算子
2-3-2. ビット演算子
2-3-3. 論理演算子
2-3-4. 文字列操作演算子
2-3-5. 代入演算子
2-3-6. 比較演算子
同値演算子
等価演算子
包含演算子
比較演算子の連鎖
2-3-7. その他の演算子
2-3-8. 演算子の優先順位
コラム. 演算子に使用できる Unicode文字
2-4. 関数
2-4-1. 関数呼び出し
関数呼び出しの基本
キーワード引数
引数展開
2-4-2. 関数定義
関数定義の基本
無名関数
関数の多重定義
可変長引数
オプショナル引数/キーワード引数
型アノテーション
return文
2-4-3. 関数適用演算子
2-5. 制御構文
2-5-1. 条件分岐
2-5-2. 繰り返し
2-5-3. 例外処理
2-6. その他の構文
2-6-1. 内包表記
2-6-2. ドット構文
2-6-3. Doブロック構文
2-6-4. beginブロックと letブロック
2-7. 型の基本
2-7-1. プリミティブ型
プリミティブ整数型
プリミティブ浮動小数点数型
その他の標準プリミティブ型
2-7-2. 複合型
2-7-3. コレクション型
配列
辞書
集合
タプル/名前付きタプル
2-7-4. 文字列型
2-7-5. 型アノテーション
2-8. モジュール
2-8-1. importと using
2-8-2. 標準モジュールとモジュールのネスト
2-8-3. モジュールの定義
【基本編】
第3章 Juliaの標準ライブラリ関数
3-1. 便利な標準関数たち
3-1-1. 演算系(1) 除算・剰余算系
整数除算関数
整数剰余算関数
整数除算・剰余算複合関数
値域を指定した整数剰余算関数と整数除算関数
整数除算・剰余算関数についての補足
コラム. mod1()関数の使い途
その他の除算・剰余算関連関数
3-1-2. 演算系(2) 結合演算
積和演算
冪剰余演算
3-1-3. 演算系(3) その他の演算系関数
3-1-4. 数学系(1) 三角関数,指数関数,対数関数
3-1-5. 数学系(2) その他の数学関数
3-1-6. 文字列関連関数
文字・文字列情報取得関数・演算子
文字・文字列比較関数・演算子
文字列操作関数・演算子
文字列検索・置換関数
Juliaの正規表現
パターンに指定出来るもの
3-1-7. 配列・集合演算
コレクション情報取得関数・演算子
配列関連関数・演算子(1) 配列生成関連
配列関連関数・演算子(2) 配列加工・更新
コラム. 破壊的操作
配列関連関数・演算子(3) ベクトル・行列関連
配列関連関数・演算子(4) デック(両端キュー)
配列関連関数・演算子(5) 集計・畳み込み関連関数
配列関連関数・演算子(6) 検索関連関数
辞書関連関数
集合関連関数・演算子
タプル・名前付きタプル関連関数
3-1-8. その他「あると便利」がある関数
3-1-9. 演算子は関数
3-2. 標準ライブラリ
3-2-1. Printf
コラム. @printfはなぜマクロ?
読みたいあんも.icon*4
3-2-2. Dates
3-2-3. Statistics
3-2-4. LinearAlgebra
3-3. 関数・引数の組合せ
3-3-1. 文字列→数値変換
3-3-2. 数値の丸め処理
3-3-3. all() / any()
3-3-4. 引数にジェネレータ式を指定出来るその他の例
第4章 型システム
4-1. Juliaの型システムの概要
4-2. 公称型システムとサブタイピング
4-2-1. 公称型システム
4-2-2. 基本型と派生型
4-2-3. 型階層
コラム. 参考:公称型ではない型システム
4-2-4. 抽象型と具象型
4-2-5. Any型
4-3. パラメトリック型
4-3-1. パラメトリック型
4-3-2. 型パラメータに指定出来るもの
4-3-3. パラメトリック型のサブタイピング
4-3-4. UnionAll型
4-3-5. パラメトリック抽象型
4-4. 型制約
4-4-1. 型制約とは
4-4-2. 制約の種類
4-4-3. 型制約とサブタイピング
4-5. ユーザ定義型
4-5-1. ユーザによる型の定義
4-5-2. コンストラクタ定義
4-6. 特殊な型
4-6-1. Tuple型・NamedTuple型
4-6-2. Union型
4-6-3. ボトム型
4-6-4. シングルトン型
4-6-5. Type{T}型セレクタ
4-6-6. 型エイリアス
第5章 多重ディスパッチ
5-1. 多重ディスパッチとは?
5-2. 多重定義
5-2-1. 関数の定義(おさらい)
5-2-2. 型シグニチャ
5-2-3. 実例
5-2-4. メソッドの曖昧さの解決
コラム. キーワード引数と多重ディスパッチ
5-3. ポリモーフィズム
5-3-1. Juliaのポリモーフィズム
コラム. Juliaと部分型多相
5-3-2. 実例
5-4. 演算子オーバーロード
5-4-1. 演算子オーバーロードも多重ディスパッチ
5-4-2. 実例
5-4-3. 型昇格ルール
5-5. 糖衣構文
5-5-1. 糖衣構文(の多く)も多重ディスパッチ
5-5-2. 例
例1. インデクシング関連
例2. プロパティ
例3. 後置演算子 '~
5-6. Holy トレイト
5-6-1. Holy トレイトとは?
5-6-2. 実例: IndexStyle
5-7. その他の実用例
5-7-1. sort()のアルゴリズム指定
5-7-2. Val{N}によるディスパッチ
第6章 イテレーション
6-1. Juliaのイテレーションの仕組み
6-1-1. イテレーションも糖衣構文
6-1-2. iterate()関数
6-1-3. Base.IteratorSizeと Base.IteratorEltype
Base.IteratorSize
Base.IteratorEltype
6-2. イテレーションプロトコルの実装
6-2-1. サイズが決まっているパターン
例1. 配列( AbstractArray )の派生型とする場合(推奨)
例2. 配列( AbstractArray )の派生型としない場合
6-2-2. 長さが不定のパターン
例. コラッツの予想
その他の例
6-2-3. 無限列挙
例. フィボナッチ数列
6-3. Iteratorsサブモジュール
コラム. Iterators.~のイテレータ型とそのトレイト実装
第7章 ブロードキャスティング
7-1. ブロードキャスティングとは?
7-1-1. ドット構文(おさらい)
7-1-2. ブロードキャスティング
7-1-3. @.マクロ
7-1-4. ブロードキャスティングの特徴
7-2. ブロードキャスティングの実装
7-2-1. ドット構文も糖衣構文
7-2-2. ブロードキャスティングの仕組み
Broadcast.broadcasted()と Broadcast.materialize()
Broadcast.broadcastable()
Broadcast.BroadcastStyle
7-3. ブロードキャスティングの適用
実例(1) 配列の派生型
実例(2) イテレーションプロトコルを実装した型
コラム. もっと柔軟なブロードキャスティング計算適用へのヒント
第8章 メタプログラミング
8-1. 用語の説明・おさらい
8-2. メタプログラミングとは?
8-3. Expr型とシンボル
8-3-1. AST
8-3-2. Expr型
8-3-3. シンボル
8-3-4. QuoteNode
8-4. 解析と評価
8-4-1. Meta.parse()
8-4-2. eval()
8-4-3. 式展開
8-4-4. コードの動的生成
8-5. マクロ
8-5-1. Juliaのマクロ呼び出し
8-5-2. マクロの定義
8-5-3. マクロの動作原理
8-5-4. 衛生的なマクロ
8-5-5. 実例
8-5-6. 非標準文字列リテラルとコマンドリテラル
8-6. 生成関数
8-6-1. 生成関数 (Generated Function) とは
8-6-2. 生成関数の特徴と注意点
8-6-3. 実例
第9章 並行・並列処理
9-1. タスクとチャネル
9-1-1. タスク
9-1-2. 通知
9-1-3. チャネル
9-1-4. タスク・チャネル による並行処理
コラム. ネット検索の例が並行動作する理由
9-2. スレッド
9-2-1. Juliaでスレッドを利用する
9-2-2. スレッドの基本
Threads.@threadsマクロ
Threads.@spawnマクロ
Threads.@threadsと Threads.@spawnの使い分け
Channel(spawn=true)
Threads.foreach()
9-2-3. 実用例
ソートアルゴリズムの並列化
Iterators.mapのマルチスレッド化
9-2-4. スレッドセーフ
Threads.@atomicマクロ(Julia v1.7以降のみ)
ロック機構による排他制御(1)
ロック機構による排他制御(2)
コラム. デッドロック
9-3. マルチプロセス
9-3-1. Juliaのマルチプロセシング
9-3-2. マルチプロセスの基本
@everywhere
remotecall()
pmap()
RemoteChannel
SharedArray
@distributed
コラム. 分散処理
第10章 パッケージマネージャ
10-1. Juliaのパッケージマネージャ
10-1-1. REPLのパッケージモード
10-1-2. Project.toml / Manifest.toml
10-1-3. Pkg標準ライブラリ
コラム. Juliaのパッケージ管理の単位
10-2. 基本的な使い方
パッケージの追加・更新・削除
パッケージの固定・固定解除,開発モード・開発モード解除
その他のパッケージ関連コマンド
パッケージレジストリ関連コマンド
10-3. 環境の管理
10-3-1. 環境(仮想環境)
10-3-2. プロジェクト
10-3-3. パッケージディレクトリ
10-3-4. パッケージディレクトリの共有・公開
10-4. パッケージ開発の基本
10-4-1. PkgTemplates.jlによるパッケージディレクトリの生成
10-4-2. 構成ディレクトリ・ファイルについての補足
テストの追加
パッケージのビルドフェーズの追加
10-4-3. 公式パッケージ化のヒント
コラム. JupyterLab上での操作
【実践編】
第11章 数値計算
11-1. Juliaで数値計算
数値計算の種類
1次方程式の求解
行列計算
逆行列・固有値・特異値・分解
得意値というタイポを見つけたあんも.icon
非線形方程式の求解
数値積分
微分方程式
最適化問題
シンプレックス法
内点法
ラグランジュの未定乗数法
数値線形代数の例
code:jl
A = [1. 2.
3. 5.];
x, y = A^(-1) * b # 逆行列を利用する方法
x, y = inv(A) * b # inv()関数を利用する方法
x, y = A \ b # \演算子を用いる方法が最も高速
### 値を確認する
code:newtonmethod.jl
function newtonmethod(f, f′, init=1.0;
tol=1e-16,
ε=1e-14,
maxiteration=1000,
withconverged=false)
solution_found = false
x1 = x0 = init
for i in 1:maxiteration
y = f(x0)
y′ = f′(x0)
abs(y′) < ε && break
x1 = x0 - y / y′
if abs(x1 - x0) ≤ tol
solution_found = true
break
end
x0 = x1
end
withconverged && return (x1, solution_found)
x1
end
### 多重定義で数値微分を使うバージョンを定義する
newtonmethod(f, init::Number=1.0; h=1e-6, kwargs...) = newtonmethod(
f,
x -> (f(x+h) - f(x-h)) / 2h, # 数値微分
init;
kwargs...)
### ニュートン法による f(x) = x^2 - 2 の求解
f(x) = x^2 - 2
newtonmethod(f)
newtonmethod(f) ≈ √2
11-2. NLsolve.jlによる非線形方程式の求解
非線形方程式の数値解を求めるパッケージ
多元連立方程式に対応している
自動微分が利用できる
ヤコビ行列を解析的に知らなくてもよい
解を求めるアルゴリズムを選択できる
ヤコビ行列を利用する
:trust_region: デフォルト
:newton
ヤコビ行列が不要
イテレーションが多くなる
:broyden
:anderson
NLsolve.jlの使用例
code:using_nlsolve.jl
using NLsolve
function f!(F, xy) # 破壊的関数で更新していくほうがパフォーマンスがよい
x, y = xy
F1 = (x+3)*(y^3-7)+18 # u end
function j!(J, xy) # ヤコビ行列
x, y = xy
J1, 2 = 3y^2*(x+3) # ∂u/∂y ∂v_∂y = exp(x)*cos(y*exp(x)-1) # ∂v/∂y
end
sol_uv = nlsolve(f!, j!, 0.1, 1.2) # 注目している関数, ヤコビ行列, xyの初期値 # * Algorithm: Trust-region with dogleg and autoscaling
# * Inf-norm of residuals: 0.000000
# * Iterations: 4
# * Convergence: true # 収束したかどうか
# * |x - x'| < 0.0e+00: false
# * |f(x)| < 1.0e-08: true
# * Function Calls (f): 5
# * Jacobian Calls (df/dx): 5
### 実行結果を確認する
res = similar(sol_uv.zero, 2); f!(res, sol_uv.zero);
# res ≈ 0.0, 0.0 # ≈演算子が内部的に決定している許容誤差ではうまくいかない ≈(res, 0.0, 0.0; atol=1e-8) # 絶対許容誤差を指定して評価させる ### 自動微分を利用する
### ForwardDiff利用を指定する
nlsolve(f!, 0.1, 1.2; autodiff=:forward) ### 解法に:broydenを指定(j!が不要)
### 解法に:andersonを指定(j!が不要)
11-3. DifferentialEquations.jlによる常微分方程式の数値的解法
多くの定式化された偏微分方程式は、数値的に解くときは常微分方程式に帰着できる
与えられた微分方程式と初期条件から、解を求める問題
常微分方程式
一部の偏微分方程式
確率微分方程式
code:solve_lotka_volterra.jl
using DifferentialEquations, Plots
function f!(du, u, params, t)
x, y = u
a, b, c, d = params
du1 = a*x - b*x*y # -- (1) du2 = c*x*y - d*y # -- (2) end
tspan = 0, 20; # 時刻0(t_0)から20まで計算する prob = ODEProblem(f!, u0, tspan, params) # ODEの初期値問題オブジェクトの生成
solution = solve(prob)
### 可視化する
ts = solution.t;
xs = solution1, :; # Same as xs = [u[1] for u in solution.u]; ys = solution2, :; # Same as ys = [u[2] for u in solution.u]; a, b, c, d = params;
title="Lotoka-Volterra \$a=$(a), b=$(b), c=$(c), d=$(d)\$",
xlabel="\$t\$")
# savefig(plt, "lotka_volterra_plot1.svg")
### 4次のルンゲ‐クッタ法で、刻み幅0.05で固定して解く
solution_by_rk4 = solve(prob, RK4(), dt=0.05, adaptive=false);
### 可視化する
ts = solution_by_rk4.t;
xs = solution_by_rk41, :; ys = solution_by_rk42, :; a, b, c, d = params;
title="Lotoka-Volterra \$a=$(a), b=$(b), c=$(c), d=$(d)\$",
xlabel="\$t\$")
# savefig(plt, "lotka_volterra_plot2.svg")
11-4. その他の外部パッケージ情報
数値計算全般
Juliaの数値線形代数全般の標準パッケージ
関数近似
最適化関連
非線形方程式の解法
Newton-Raphson法やBroyden法などのアルゴリズムを提供している
微分方程式関連
機械学習による微分方程式の解法
その他
二重精度の浮動小数点数とそれを用いた高精度演算
第12章 データ解析
12-1. Juliaでデータ解析
12-2. 基本的な道具の使い方
12-2-1. 可視化(データプロット)の基本
コラム. Plots.jlのレシピ機能
12-2-2. データフレームの基本
12-3. 実例:ネット上に公開されているデータの読み込みと簡単な解析
オープンデータを利用した解析
1. URLで指定されたCSVデータを動的に読み込んで、データフレームに変換する
2. そのデータを加工してプロットと解析をする
解析まで含む処理だからJuliaスクリプトのほうがうまくできそうあんも.icon
なんでJuliaで組んでしまったんだろう?あんも.icon
新型コロナウイルス感染症についてのオープンデータを利用した解析
1. URLで指定されたCSVデータを動的に読み込んで、データフレームに変換する
大きなデータの場合は、HTTP.open("GET, url) do stream ; ...; endでDoブロックをつくってストリーミングする
データにアクセスし続けて、Doブロック内での要求に応じて、必要な部分を逐次的に読み込む
メモリ不足になるのを避けることができる
code:jl
### URLで指定されたCSVデータを動的に読み込んで、データフレームに変換する
using DataFrames, CSV, HTTP
df = begin
CSV.read(HTTP.request("GET", url).body, DataFrame; dateformat="y/m/d")
end
2. そのデータを加工してプロットと解析をする
code:jl
### 日付の範囲でデータフレームを抽出する
using Dates
df2021d = begin
dts2021d = Date(2021, 4, 1):Day(1):Date(2022, 3, 31)
df[df:Date .∈ Ref(dts2021d), :]
end
### ALL列(全国の数)のプロット(1): そのままプロットする
using Plots, StatsPlots
@df df2021d plot(:Date, :ALL, label="日別 ",
title="全国の新規陽性者数(2021/4/1~2022/3/31)", fontfamily="sans-serif-roman")
### ALL列(全国の数)のプロット(2): スムース化して結果重ね合わせる
using Loess
plt_all_2021d = @df df2021d plot(:Date, :ALL, ls=:dash, label="日別 ", legend=:topleft,
title="全国の新規陽性者数(2021/4/1~2022/3/31)", fontfamily="sans-serif-roman");
model = loess(1:nrow(df2021d), df2021d.ALL, span=0.15);
vs = Loess.predict(model, Float64.(1:nrow(df2021d)));
@df df2021d plot!(plt_all_2021d, :Date, vs, w=2, label="スムース化 ")
### 相関分析の例: 相関係数算出、可視化
# - 北海道と沖縄県の陽性者数に相関があるかを確認する
using Statistics
@df df2021d cor(:Hokkaido, :Okinawa)
@df df2021d scatter(:Hokkaido, :Okinawa,
legend=false, xlabel="北海道", ylabel="沖縄", fontfamily="sans-serif-roman")
12-4. 発展的な情報
統計・データ解析全般
データプロット関連
データフレーム・データ操作関連
クエリ言語のような書式で記述できる
13章 機械学習
13-1. Juliaで機械学習
13-2. MLJ.jl
13-3. Flux.jl
13-4. 発展的な情報
機械学習全般
深層学習(Deep Learning)関連
MLJ.jl関連
Flux.jl関連