#Julia言語 リポジトリの方の公式マニュアルに以下が追加されましたね。

* 引数の型の過剰な制限はよくある間違いです。疑わしいなら引数の型を書くのをやめましょう。

* Juliaでは戻り値の型宣言はほとんど使われません。一般に「型安定」な函数を書くべきです。

github.com/JuliaLang/juli…
#Julia言語 具体的には

fib(n::Int) = n ≤ 2 ? one(n) : fib(n-1) + fib(n-2)

はよくある間違で、

fib(n)::Int = n ≤ 2 ? one(n) : fib(n-1) + fib(n-2)

も誤りです。どちらでもBigIntによる計算が不可能になる。よく分からないなら

fib(n) = n ≤ 2 ? one(n) : fib(n-1) + fib(n-2)

でよい。
#Julia言語 無用に引数の型を制限してしまううようだと、NASAでは仕事をできなくなります。(NASAでもJuliaを使っている)
#Julia言語

function f(x::型名) ~ end

と引数の型を書く場合には型名として最も広い抽象型を選ぶ。よく分からなかったら、型名は省略するべき。

不適切に返り値の型を

function f(x)::型名 ~ end

と指定してしまう問題については以下のリンク先を参照。
#Julia言語 「型名を書かなければいけない」「型名は書いた方がよい」「型名を書いた方が安全になる」という(一般には正しくない)考え方を過学習してしまっていることに気付くことも、Juliaを使うメリットの1つだと思います。

あとクラスを使うOOPスタイルへの過剰適応に気付くためにもよい。
#Julia言語 おまけ:グローバル変数を引数を経由せずに直接函数内で使ったり、

struct Foo
a
b
end

のように書くと、計算がひどく遅くなります。

struct Foo{S, T}
a::S
b::T
end

なら大丈夫。

多くの場合にmutable structではなく、structを使った方がお得。
#Julia言語 Juliaでは函数の引数の型宣言の機能は多重ディスパッチで使われる。

引数の型宣言はコードを読み易くするためにも使えるのですが、引数の型の過剰な制限(よくある間違い)を引き起こすようではまずい。

"""
f(x)のxは実数
"""
function f(x)

end

のように書いておけばよいと思う。
#Julia言語 典型的な過学習は以下のリンク先で確認できる。

f(x::Int)::Int = x/2 のように::Intを付けてもJuliaはコンパイル時に返り値がIntになることをチェックしてエラーを出してくれません。f(2)はコンパイルされて正常に実行されてしまう。f(1)は実行時エラー。

discourse.julialang.org/t/why-specify-…
#Julia言語 は明らかに「新しいこと」もしくは「昔からあったが広く普及していなかった技術を一般ユーザーに届くようにすること」をしています。

そこに広く普及している技術への過学習を持ち込んでコメントしても無意味で、「新しいこと」を学んだ方がお得。

トレードオフで考えることが基本。
#Julia言語 Juliaでは、予想外のバグを取るために型宣言は役に立たず、@ code_warntype や @ code_typed で型情報の伝搬の仕方を見ることが役に立ちます。

その自動化の方向での素晴らしい成果(開発進行中)が

github.com/aviatesk/JET.jl

です。こういう新しい試みをみんなで応援して行くべき。

• • •

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

26 Mar
#Julia言語 の多重ディスパッチを強く支持している人達は、「多重ディスパッチのJuliaにはクラスベースのOOPの機能を追加するべきではない」「OOPのデザインパターンはOOPの欠陥を補完するものであり、多重ディスパッチではよりシンプルな方法で解決できる場合が多い」と主張しています。続く
#Julia言語 多重ディスパッチとは、x,y,zの型の組み合わせを変えたとき同名の函数f(x,y,z)で異なるメソッドを実行可能にする機能のことです。x,y,zは平等に扱われる。

f(x,y,z)におけるxおよびその型のみを特別扱いしてx.f(y,z)と書けるようにすれば、よく見るOOPのスタイルになる。

続く
#Julia言語 資料

C++の開発で知られるBjarne Stroustrupさんは、f(x,y,z)をx.f(x,y)と書くスタイルの採用は浅い考えに基く失敗で、多重メソッド(=多重ディスパッチ)の採用が良さそう、のように言っているように見えます。

discourse.julialang.org/t/is-julias-wa…

open-std.org/jtc1/sc22/wg21… Image
Read 13 tweets
25 Mar
#数楽

多項式f∈ℝ[x]に「a∈ℝをf(a)∈ℝを対応させる函数」を対応させる写像は単射なので、多項式fとそれに対応する実数の函数を区別しなくも大丈夫。(無限体でもOK)

有限体F上の多項式g∈F[x]に「a∈Fをg(a)∈Fを対応させる函数」を対応させる写像は単射でないので、それらを同一視できない。
#数楽 例えば二元体𝔽₂={0,1} (1+1=0)について、𝔽₂上の多項式としてxとx²は異なるが、𝔽₂上の函数としてはどちらも恒等写像になって等しくなってしまう。

xとx²を𝔽₂の2次拡大𝔽₄=𝔽₂[α] (α²=α+1)上の函数とみなしたものは互いに異なる。

こういう具体例がノータイムで出て来ることが大事。
#数楽 面倒なのは有理函数(多項式環の分数体の要素)に対応する「函数」の場合。

有理函数ごとに定義域も変わるので、異なる定義域を持つ函数達を同時に扱うための「処理」が必要になる。(これには複数の処方箋がある。)

結果的に、無限体の場合には、有理函数と対応する「函数」は同一視可能になる。
Read 7 tweets
25 Mar
大学生相手であっても、必要な数学の実力は結構高いので、統計学を教えるのに苦労しています。

高校生相手に検定が「お墨付きが得られる道具」であるかのように教えられてしまうようになったら最悪。

あと、信頼区間がモデル依存であることも(大学生と同様に)教えることにならないと思う。
現実には世界的にかなり悲惨なことになっていて、論文を日常的に書いている研究者であっても、統計的検定を「お墨付きが得られる道具」扱いしている人達が沢山いるんじゃないか?

そういう現状は若くて優れた研究者が育つことを妨害していると思う。

こういう問題を維持固定しないような教育が必要。
まだ高校生なのに、「統計的に有意である!」を水戸黄門的な「ひかえおろう!」と同じ意味で使うようになったら最悪(笑)
Read 24 tweets
24 Mar
#Julia言語 (1-2^(1-s))ζ(s) は交代級数になりEuler変換が使える。Euler変換を使えば数十項でFloat64の精度を使い切った計算が可能。

①オイラー変換のウェイトのグラフ
②64項の和の計算結果
③正確な値との相対誤差の常用対数、横軸Lは項数

Euler変換はかなり強力。

nbviewer.jupyter.org/gist/genkuroki…
#Julia言語 Euler変換とは、1つ前のツイートの1つ目の添付画像で示された謎のウェイト w^{(L)}_k をかけて (-1)^k a_k を k=0からL-1まで足し上げると、(-1)^k a_k のk=0から∞までの和の良い近似になるという魔法のような話。

1つ前のツイートのLは2^6=64.
#Julia言語 #数楽 (1-2^(1-s))ζ(s) のEuler変換は複素平面全体で収束するので、ζ(s)の近似計算にも使える。

効率はそんなに良くないが、リーマン予想の数値的確認や視覚化をそれで行うこともできる。

非自明な零点の周囲のプロットもオイラー変換を知っていれば容易に可能である。
Read 4 tweets
24 Mar
#Julia言語 もう何度目になるか分かりませんが、私もdual numbersを実装してみた。

添付画像2の @ code_warntype と @ btime の結果に注目。この2つの確認は必ずやった方がよい。続く

ソースコード↓
nbviewer.jupyter.org/gist/genkuroki…
#Julia言語 自動微分の仕組みのdual numberパートは易しい部分。

難しいのは大量の函数を合成してできる函数の微分をどのように効率的に求めるか。

行列A,B,C,Dのサイズによって、A(B(CD))と((AB)C)Dで計算にかかる時間が大きく違う場合がある(そのことは行列の積の定義さえ知っていれば理解可能)。
#Julia言語 Juliaで積極的に計算を遅くするには、

① グローバル変数の値を引数を経由せずに函数の中で中で使う。

② structを

struct Foo
a
b
end

のように定義して使う。もしくはこれのバリエーション。

あとほとんどの場合に mutable struct は必要ない。
Read 8 tweets
24 Mar
悪ふざけ論文のネタ:

* f(a,b,c,…)の中の個人aを特別扱いして、a.f(b,c,…) のように書き、函数fをaの所有物とするアイデアは極めて資本主義的。

* それに対抗する解放運動として多重ディスパッチが提案されて来たが、ことごとく資本主義に敗北して来た。

* 解放運動にとってJuliaは(略)
上のツイートはネタ(冗談)なので要注意。
axiom of equality を「平等の公理」だと誤解させて(本当は「等号の公理」)、さらに axiom of choice を「(産むか産まないかの)選択(を認める)公理」と読ませることに成功したパロディ論文は有名。
physics.nyu.edu/faculty/sokal/…

他にも滅茶苦茶で笑えるのですが、アクセプトされて大騒ぎになった。
Read 4 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!