#Julia言語

Juliaでは

foo(f::函数, X::配列など)

の形式で、配列Xなど(generatorやiteratorを含む)のすべての要素に函数fを施した結果に "foo" の操作を施せる場合が多数あります。

例えばXの要素の絶対値の最大値と和はそれぞれ

maximum(abs, X)
sum(abs, X)

二乗和は

sum(x->x^2, X)
#Julia言語 二乗和は

X = randn(10^6)
sum(Base.Fix2(^, 2), X)
sum(abs2, X)

のようにも書ける。Fix2(f, a)は本質的に x->f(x, a) です。読み易さは x->f(x,a) の方が上のことが多い。

1.96より大きい要素の割合は

count(>(1.96), X)/length(X)

using Statistics
mean(>(1.96), X)
#Julia言語

Xのすべての要素に手続き f を施すには

foreach(f, X)

返り値はforループと同じnothingになります。

Xの要素に函数 f を作用させた結果を集めたものは f.(X) だけではなく

map(f, X)

で作れる。

これら以外にもmaximum, minimum, count, sum, mean, …も似た使用法が可能。
#Julia言語 open(args...; kwargs...) の結果に函数 io -> f(io) を作用させることも

open(f, args...; kwargs...)

の形式で可能です。io -> f(io) の定義が複雑で一回限りしか使わない場合には

open(args...; kwargs...) do io
f(io)の定義
end

がよく使われている。
#Julia言語 m×n行列 A のすべての列(縦⃗ベクトル)に函数 f を作用させた結果を並べた1×n行列は

mapslices(f, A; dims=1)

これをただの1次元配列にしたければ

vec(mapslices(f, A; dims=1))

Aが縦ベクトルの配列なら f.(A) で似たようなことをできますが、同じことを行列でやりたいことは多い。
#Julia言語 foo(f::函数, X::配列など繰り返し可能な何か) のXや for ループのインデックスの動く範囲に使えるものが非常に多彩であることを知るには

methods(iterate)

の結果を眺めるとよいです。

〇〇について△△を繰り返すことをやらせたい場合には、このスレッドの内容が役に立つ。
#Julia言語 #数楽 #統計

〇〇達について互いに独立に△△を実行するプログラムのコードを書くことは易しい場合が多く、並列化も易しい。

しかし、△△の実行が各〇〇ごとに独立になっていない場合は面倒になり、効率的な並列化も難しくなる。

確率論でもi.i.d.だと話が易しくなる。
#Julia言語

サンプル A の経験累積確率分布函数

ecdf(A, x) = count(≤(x), A)/length(A)

using Distributions してあれば

ecdf(A, x) = mean(≤(x), A)

でもよい。ブロードキャストで使う場合には配列AをRefで保護する。

x = range(0, 6; length=600)
y = ecdf.(Ref(A), x)
#Julia言語

using Base64
showimg(mime, fn; tag="img") = open(fn) do f
base64 = base64encode(f)
display("text/html", """<$tag src="data:$mime;base64,$base64" />""")
end

showimg("image/jpeg", "foo.jpeg"; tag="img width=80%")

でJupyterノートブック上に画像を取り込める。
#Julia言語

open(f -> ファイル f を読み込んで行う操作, ファイル名)

と等価な

open(ファイル名) do f
ファイル f を読み込んで行う操作
end

の形式のコードはよく書く。

1つ前のツイートの内容はこれの応用例。
#Julia言語 確率分布 dist における確率変数(函数) f(X) の期待値 E[f(X)|X~p] のモンテカルロ法による計算は

X = rand(dist, L)
mean(f, X)

例えば、ガンマ分布でのlog Xの期待値は

α, θ = 10, 0.1
using Distributions
dist = Gamma(α, θ)
L = 10^7
X = rand(dist, L)
ElogX_mc = mean(log, X)
#Julia言語 サンプルX上でのf(x)の平均が

mean(f, X)

とシンプルに書けるのはありがたい。

このスレッドのテーマはこれの一般化がJuliaで広範に使用可能になっているという話。これを知っていると、数学語の直訳でJuliaのコードを書ける場合が増える。しかも多くの場合に計算速度的にも効率的。
#Julia言語 微訂正

❌E[f(X)|X~p]
⭕️E[f(X)|X~dist]

モンテカルロ法による近似で十分なら

E[f(X)|X~dist]

X = rand(dist, L)
mean(f, X)

と翻訳できる。対応が見易い。

確率変数Xはモンテカルロ法では乱数列Xに対応。逆にこのイメージで確率変数を(測度論を経由せずに)理解してもよい。
#Julia言語 分布Gamma(α, θ)におけるlog xの期待値は

1/(θ^α Γ(α)) ∫_0^∞ e^{-x/θ} x^{α-1} log x dx
= (∂/∂α)log(θ^α Γ(α))
= log θ + ψ(α)

と書ける。ここでψ(s)=(log Γ(s))'はディガンマ函数と呼ばれる基本特殊函数で、適当なライブラリを使えばコンピュータで気楽に計算できる。
#Julia言語 実1変数函数の数値積分は QuadGK.jl パッケージが定番だと思う。

自分で下手に数値積分のコードを書くより、これを利用した方が計算が速いことが多い。

許容誤差を大きめにして計算時間を減らしたければrtol=1e-3とかに設定して使えばよい。

github.com/JuliaMath/Quad…

• • •

Missing some Tweet in this thread? You can try to force a refresh
 

Keep Current with 黒木玄 Gen Kuroki

黒木玄 Gen Kuroki Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

PDF

Twitter may remove this content at anytime! Save it as PDF for later use!

Try unrolling a thread yourself!

how to unroll video
  1. Follow @ThreadReaderApp to mention us!

  2. From a Twitter thread mention us with a keyword "unroll"
@threadreaderapp unroll

Practice here first or read more on our help page!

More from @genkuroki

13 Jan
#Julia言語

Juliaでの最適化では、函数の定義で

function f(x::Float64)::Float64

end

のように「型指定」しても全然__速くならない__ことを理解しておく必要があります。

function f(x)

end

のままで最適化できることを知らずに、一所懸命「型指定」するのは時間の無駄。
#Julia言語 函数の引数の「型指定」をするのは、multiple dispatchを使うためです。例えば

function f(x)
広く通用するアルゴリズムのコード
end

と定義しておいて、Float64専用の同名の函数を

function f(x::Float64)::Float64
Float64に最適化されたコード
end

と定義するとよい。
#Julia言語 しかし、

function f(x)
広く通用するアルゴリズムのコード
end

の段階で十分高速なコードを書ける場合も多いです。

それを可能にするのが、型の伝搬を促すコードの書き方です。

Juliaでは「型指定」ではなく、「引数の型の伝搬」で考える。
Read 23 tweets
12 Jan
#数楽 そうなんです!ベータ函数や超幾何函数達は非常に面白い!高校で微積分を習っていればめっちゃ楽しめる。

B(p,q)=∫_0^1 x^{p-1}(1-x)^{q-1}dx

がよく使われるが、

B(p,q)=∫_0^∞ t^{p-1}/(1+t)^{p+q} dy

およびさらにt=u^{1/p}やt=u^2とおいた場合も応用上重要な点は盲点になり易い。 Image
#数楽

B(p,q)=∫_0^∞ t^{p-1}/(1+t)^{p+q} dy

型のベータ函数の表示で t を t²/ν で置き換えて、p=1/2, q=ν/2 とおけば、本質的に自由度 ν のt分布が得られます。

t分布は非常に基本的な確率分布なのですが、ベータ分布の特別な場合(p=1/2)の変種と思えます。F分布はp=1/2の特殊化をやめた場合。 Image
#数楽

B(p,q)=∫_0^∞ t^{p-1}/(1+t)^{p+q} dy

型のベータ函数の表示を知っていれば

Γ(p)Γ(q)=Γ(p+q)B(p,q)

を y = tx (yを直線の傾きtに変数変換)の形の積分変数変換で示せます。その計算の過程も面白いので知っておいて損がないです。

大学新入生向けの計算練習の題材としてもよい。 Image
Read 19 tweets
10 Jan
#統計

amazon.co.jp/dp/4130413007
竹内啓・竹村彰通編
数理統計学の理論と応用
1994
第5章 竹内啓 統計的推測理論の諸問題

に最尤法が漸近的に全然最良でないシンプルな例が載っていたので(添付画像)、#Julia言語 で数値的に確認してみた↓

nbviewer.jupyter.org/gist/genkuroki…

ベイズ統計に繋がる話題。続く ImageImage
#統計 その節のタイトルは「5 非正則な場合の漸近推定論」で、尤度函数が漸近的にフラットになる場合(一様事前分布の事後分布が漸近的に一様分布になる場合)のシンプルな例を作っているので、渡辺澄雄『ベイズ統計の理論と方法』の読者は特に興味を持つと思ったので、紹介することにしました。
#統計 データを生成する真の分布は添付画像の密度函数を持つtruncated normal distributionです。標準正規分布を |x|>1 なら確率密度が0になるように改変したもの。

モデルはこの分布を並行移動したものです。パラメータは平均μのみ。

分布の台がパラメータμごとに違うモデルになっている。 Image
Read 26 tweets
4 Jan
#統計 統計学の哲学者のMayoさんによれば

* Royallの3つの問いに、びっくりするほど多くの(しかも異なる信念を持つ)統計家達・哲学者達が賛同している。(大変なことになっている、とてもひどいことになっているというニュアンス)

続く

errorstatistics.com/2014/10/10/bre…
#統計 Mayoさん曰く

* Royallの3つの問いの「戒律」によれば

①何を信じるか→ベイジアンの事後分布

②どう行動するか→Neyman-Pearsonの方法による長期的なパフォーマンスの良さ

③証拠の比較→尤度比較法

となるが、あなたはこれら全部を拒否したいかもしれません。私が拒否しているように。
#統計 日本語圏でも同様にRoyallの3つの問いの「戒律」という合理的であろうとすれば到底受け入れることができない考え方を受け入れている人達を容易に発見できます。

ソーバー著『科学と証拠―統計の哲学入門―』とその翻訳者の松王政浩さんが大変な悪影響を与えているように見える。
Read 11 tweets
3 Jan
#Julia言語 個人的にJuliaはPythonにあまり似ていないと思うのですが、Pythonから来たっぽい人のJuliaのコードで気になるのは、

A = []
for ~

push!(A, a)

end

におけるA = []という書き方(Anyの配列になって効率悪化!)と、

sum([f(x) for x in X])

のような書き方。続く
#Julia言語

sum([f(x) for x in X]) だと、すべてのXの要素についてf(x)を計算した結果を配列として保存してから、その配列の要素の和を計算してしまいます。無駄にメモリを消費する。

sum(f(x) for x in X) # generatorを使う

もしくは

sum(f, X)

と書いた方が得だし、コードも短くなります。
#Julia言語

A = []
for i in 1N
push!(A, randn())
end

とするとAnyの配列Aができてしまう。

Anyの配列に格納されたサンプルによるモンテカルロ積分はFloat64の配列の場合と比較すると180倍くらい遅くなった!

A = [] → push!(A, ~) の繰り返しは要注意。

gist.github.com/genkuroki/7cd0…
Read 4 tweets
3 Jan
他にも似たような反応がありますが、小5の算数の教科書にある割合の3つの公式を覚えさせたり、「もとにする量」「比べられる量」という割合の概念を理解するために不要な用語を使うことを児童に強制していたら、教わっている子の将来が暗くなると思います。

教科書通りの教え方がまずい証拠がある。
お勧めしたいのは以下の2冊の本です。
実際に子供に算数を教えていたら楽しんで読めると思います。

amazon.co.jp/dp/4101370311
お母さんは勉強を教えないで
見尾 三保子

このタイトルはひどいし、内容とも一致していません。

内容の大部分は算数や数学の真っ当な教え方の話です。

2冊目紹介に続く
2冊目

amazon.co.jp/dp/4788508435
学力低下をどう克服するか―子どもの目線から考える
2003/3/25
吉田 甫

タイトルを見ても分からないことですが、教科書通りの教え方の対照群と実験的な教え方を、実際に授業をしてみて比較してみた研究結果が書いてあります。分数と割合の教え方を詳しく扱っています。
Read 8 tweets

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3/month or $30/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!

Follow Us on Twitter!