#Julia言語 Dictのプロット

ポイント:Dict型のdにはkeys(d)だけではなく、values(d)も定義されている。

Juliaのメソッド群は

a = []
for k in keys(d)
append!(a, d[k])
end

のようなコードを書かなくてもよいようになっている。

aがVector{Any}型になるのも嫌。

gist.github.com/genkuroki/ef0c… Image
#Julia言語 Juliaの型システムへの理解に自身がない場合には

function f(x, y)

end

struct Foo{A, B}
a::A
b::B
end

のように書いて、Float64とか、Arrayのような型名を書かずに済むようにすることがお勧め。

理解不足で型名を書くと、色々悪いことが起こる。何度も失敗した。
#Julia言語 例えば

struct Foo
a::Float64
b::Vector{Complex}
end

のように書いてFoo型を使うと、計算速度が数十倍オーダで遅くなる。

ComplexはComplexF64などであるべき。

考えずに済む解決策は

struct Foo{A, B}
a::A
b::B
end

具体的な型はJuliaに決めさせるとよい。 Image
#Julia言語

f(a::Vector{Any}) = println(a.^2)

のように a::Vector{Any} (これは a::Array{Any, 1} と等価)と書くと、

f([1, 2, 3])

でさえエラーになる。

函数の引数の型は、型についてよく理解していないなら、一切書かない方が安全だと思われる。引数の型を書いても計算は速くならない。続く Image
#Julia言語

g(a::Vector{<:Any}) = println(a.^2)

なら、g([1, 2, 3]) を実行してくれる。

これはもっとシンプルな

h(a::Vector) = println(a.^2)

と等価である。

しかし、

h(1:3)

はエラーになってしまう。続く Image
#Julia言語

k(a::AbstractVector) = println(a.^2)

ならば

k([1, 2, 3])



k(1:3)

も実行してくれる。しかし、

k(i for i in 1:3)

はエラーになってしまう。続く Image
#Julia言語 以上を読んで、「Juliaの函数の引数の型指定は何て難しいんだ!」と思い人もいるかもしれない。

シンプルな解決策!引数の型を書かない!

l(a) = println(a.^2)

ならば

l([1, 2, 3])
l(1:3)
l(i for i in 1:3)

のすべてを意図通りに実行してくれます!

速度的劣化は起こりません! Image
#Julia言語 型を

struct Foo
a::Float64
b::Vector{Complex64}
end

function f(foo::Foo, x::Float64, y::Vector{Complex64})

end

とめんど臭く書くのをやめて

struct Foo{A, B}
a::A
b::B
end

function f(foo::Foo, x, y)

end

と書くと楽ちんです。
#Julia言語

名前付きの数のstructを定義して

My.NamedNumber("hoge", 123)

の表示がデフォルトで

hoge(123)

になるようにする方法。

Base. show(io::IO, x::NamedNumber) をと定義してやるだけなので簡単です。この辺はJITの便利なところ。

gist.github.com/genkuroki/7b85… Image
#Julia言語 varinfo()の使用例

添付画像2の状況で添付画像1のように表示される。

varinfo(My; all=true) の結果から、module My 専用の eval と include が定義されていることもわかる。 ImageImage

• • •

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

22 Jan
#Julia言語

nbviewer.jupyter.org/gist/genkuroki…
QuadGK, Optim, Roots, Memoize, NLsolve の使用例

QuadGK.jl 1変数函数の数値積分
Optim.jl 函数の最小化
Roots.jl 1変数函数の零点
Memoize.jl メモ化
NLsolve.jl 非線形(連立)方程式の解法

この手の基本的なパッケージの使い方を知っていると楽をできます。
#Julia言語

∫_0^1 ζ(s, x+t) dt = 1/((s-1)xˢ⁻¹) の数値的確認.

数値積分に QuadGK.quadgk を使用。私の場合には、自前で数値積分のコードを書くより、楽で同精度なら速いことが多いです。 Image
#Julia言語

Optim.optimize を使ったベータ分布の最尤法

Distributions.jl の fit(Beta, sample) は最尤法でない推定法を採用しており、グラフを見れば分かるように誤差が大きくなる場合があります。 Image
Read 9 tweets
20 Jan
#数楽

Xを[0,1]上の一様分布に従う確率変数とすると、その分配函数(モーメント母函数)は

Z(β) = E[exp(-βX)] = (exp(-β) - 1)/(-β).

これの逆数が β/(1 - e⁻ᵝ).

カノニカル分布の密度函数

p(x) = exp(-βx)/Z(β)

はBernoulli多項式の母函数。続く
#数楽 [0,1]上の一様分布をℝ上の適切な弱い条件を満たす任意の分布に一般化することによっても、Hurwitzのゼータ函数やBernoulli多項式を一般化できる。

正規分布の場合のBernoulli多項式の類似物はHermiteの多項式になり、正規分布に対応するHurwitz型ゼータ函数の特殊値として出て来る。
#数楽 というような話よりもずっと色々なことが

nbviewer.jupyter.org/github/genkuro…
Hurwitzのゼータ函数の話

に書いてあります。
Read 6 tweets
20 Jan
【こわい人たちの議論に巻き込まないで🥲】←有害なトンデモ本の宣伝をしながら、こういうことを平気で言う?怖い😰

【P値の不適切解釈】については豊田『瀕死本』以外の文献にも書いてあります。

『瀕死本』がトンデモ本なのはP値の代わりに【仮説が正しい確率】の使用を勧めているからです。続く
豊田『瀕死本』ではP値ではなく【仮説が正しい確率】を使うことを勧めているのですが、【仮説が正しい確率】の具体例を見ると漸近的にP値と一致している数値になっていたりするので、この本は実質的にP値ではなくP値を使うことを勧めていることになっています(笑)。続く
例えば豊田『瀕死本』の図5.2, 5.3のphc=「仮説が正しい確率」はそれぞれに対応するP値にほぼぴったり一致しています。

添付画像のグラフとソースコード nbviewer.jupyter.org/gist/genkuroki… を見て下さい。

この一致は偶然ではなく、一般的に成立しています。
Read 19 tweets
19 Jan
まさに数学教育の闇

kanielabo.org/edmath/thirdme…
RIMS研究集会 
教育数学の一側面-高等教育における数学の多様性と普遍性-
研究代表者:岡本和夫
副代表者:蟹江幸博
RIMS420号室,2018.2.13-2018.2.16

大島 利雄(城西大学)
大学における数学教育の問題点と工夫
kanielabo.org/edmath/thirdme…
全然、関係ない話題と繋げてしまうことになるが、上で引用した大島さんの文章は【妖怪について扱った文章であるにも関わらず具体的な妖怪の実例がほとんど皆無で抽象論に終始している】の類のものとは正反対。

ものすごく具体的!
私は大島さん的な文章が好きで、意味のある具体例がない抽象的な文章は有害だと考えている。

数学の研究者間では、抽象化・一般化はやろうと思えば幾らでもできるので、価値ある抽象化・一般化であることを示す具体的な例を示さないとダメだという非常に良い習慣があると思う。例がショボいとアウト。
Read 24 tweets
17 Jan
8割おじさんの西浦博さんの数学セミナー誌での連載を読んだときの印象は、「数学に強い人が、疫病が広がる様々なパターンで経験を積めば、沢山の人達を救える可能性が出て来る!面白い!」でした。

現代版ナイチンゲール!

世界中にいる西浦さんの仲間達の経験の蓄積が西浦さんの分析の背景にある。
そういう経験蓄積部分は単独のモデルを見ても絶対に分からない。

これ、普通に非常に面白い話なので、西浦博さんには面白い話を継続的に気持ちよくしてもらった方が、我々の次の世代を守るために役に立つと思います。

西浦さんに連載を依頼した数学セミナー誌はすごい。
少女時代のナイチンゲールさんに数学を教えたのは6歳年上のシルベスターさんや24歳年上のケトレーさんです(家庭教師)。

数学の知識はナイチンゲールさんの「闘争」で非常に役に立ちました。

wakara.co.jp/mathlog/202005…
Read 4 tweets
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 35 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!