情報更新

last update 03/28 22:54

ツイート検索

 

@genkuroki
サイトメニュー
Twilogユーザー検索

Twilog

 

Stats Twitter歴
5,099日(2010/04/13より)
ツイート数
315,589(61.8件/日)

ツイートの並び順 :

表示するツイート :

2020年09月07日(月)173 tweetssource

9月7日

@Atsushi_twi

Atsushi Sakai@Atsushi_twi

rsync的な差分コピーをしてくれる、python or juliaのツールないかなぁ。指定したディレクトリを、指定したディレクトリに、OSに関わらず差分コピーしたいだけなんですけど。。。

Retweeted by 黒木玄 Gen Kuroki

retweeted at 20:44:29

9月7日

@ceptree

ceptree@ceptree

その上に伝統の顧慮がある。一例として指数函数、三角函数を取ってみる。彼等は初等解析において王位を占めるものであるが、その古典的導入法は、全く歴史的、従って偶発的で、すこぶる非論理的と言わねばなるまい。」高木貞治 解析概論 緒言

Retweeted by 黒木玄 Gen Kuroki

retweeted at 20:34:15

 

非公開

retweeted at xx:xx:xx

 

非公開

retweeted at xx:xx:xx

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

@ohtanilson @tkksnk #Julia言語 続き

③そもそもMATLABの方で正確に計算できているかどうかも確認が必要。

結論:Float64の2倍の精度のDouble64で(逆行列を経由せずに直接に)行列による割算を実行すれば問題は解決する。

根拠については添付画像の計算結果を見て下さい。

ソースコード↓
nbviewer.jupyter.org/gist/genkuroki pic.twitter.com/h6wM5zqxym

Retweeted by 黒木玄 Gen Kuroki

retweeted at 19:48:57

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

@ohtanilson @tkksnk #Julia言語 黒木と申します。例の逆行列の誤差が大きくなる件を調べてみました。結論は以下の通り。

①そもそも数値計算で逆行列を求めること自体が非常識なのでやめた方がよい。

②行列による左割算や右割算を2倍の精度で計算すれば相当に正確に計算できる。

続く

twitter.com/search?q=tkksn

Retweeted by 黒木玄 Gen Kuroki

retweeted at 19:48:53

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

@ohtanilson @tkksnk #Julia言語 続き

③そもそもMATLABの方で正確に計算できているかどうかも確認が必要。

結論:Float64の2倍の精度のDouble64で(逆行列を経由せずに直接に)行列による割算を実行すれば問題は解決する。

根拠については添付画像の計算結果を見て下さい。

ソースコード↓
nbviewer.jupyter.org/gist/genkuroki pic.twitter.com/h6wM5zqxym

posted at 19:44:42

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

@ohtanilson @tkksnk #Julia言語 黒木と申します。例の逆行列の誤差が大きくなる件を調べてみました。結論は以下の通り。

①そもそも数値計算で逆行列を求めること自体が非常識なのでやめた方がよい。

②行列による左割算や右割算を2倍の精度で計算すれば相当に正確に計算できる。

続く

twitter.com/search?q=tkksn

posted at 19:40:44

 

非公開

retweeted at xx:xx:xx

 

非公開

retweeted at xx:xx:xx

 

非公開

retweeted at xx:xx:xx

 

非公開

retweeted at xx:xx:xx

 

非公開

retweeted at xx:xx:xx

 

非公開

retweeted at xx:xx:xx

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語

①での「函数の引数の型を指定する必要はない」という処方箋は分かり易い。過学習によっておかしなイデオロギーに染まっていなければ、すぐに適応できるはず。

一方、②と③ではJulia独特の考え方が必要。Juliaでは各種コンテナの中身の型がコンパイラに見えるように書く必要がある。

posted at 17:43:18

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 ③の「struct Foo a end 問題」=「中身の型が不定になる問題」の解決法。

* 次のようにパラメータ付きにする。

struct Foo{T}
a::T
end

こうしておくとコンパイラにaの型が見えるようになる。

posted at 17:43:16

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 ②の「A = [] 問題」=「Vector{Any}」の解決法

* Aの成分の型がxと同じであるべきなら、

A = type(x)[]

と書く。

* Aの成分の型がXの成分と同じであるべきなら、

A = eltype(X)[]

と書く。

posted at 17:43:14

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語

①函数の引数の型は書いても書かなくても、JITコンパイル後の計算速度には影響しない。

② A = [] はVector{Any}を作ることになるので、計算速度の劣化を引き起こす場合がある。

③ struct Foo a end と書いても計算速度の劣化を引き起こす場合がある。

続く

posted at 17:43:12

9月7日

@Dr_KID_

Dr. KID@Dr_KID_

「おしゃぶりを使用して良いですか?」という質問もあります。

わざわざ購入する必要はありませんが、私はアメリカ小児科学会(AAP)の推奨を根拠に「使用する場合は、生後3−4週間からにしましょう」とお話をすることがあります。

この推奨にも、いくつか根拠があります
(続く

Retweeted by 黒木玄 Gen Kuroki

retweeted at 16:59:58

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 以前、Juliaで逆行列を計算していて、誤差が大き過ぎて困ったというようなツイートをみかけたが、見失いました。そういう人は、成分をDouble64に変換してから逆行列を計算してFloat64に戻せばよいと思います。

そしてできれば逆行列の計算を避けるようにする。(A \ B などを使う。)

posted at 16:56:53

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 要するに、逆行列やそれを避けた行列の「割り算」の計算で精度が低過ぎてまずいなと思った場合には、

using DoubleFloats

として、Double64を使えば良さそう。

より一般に、「精度を上げたい部分で、Float64をDouble64に変換して計算して、Float64に戻す」とすればよいと思います。

posted at 16:54:36

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#julialang

Double64 も Float128 もメモリ上では128ビットを占める。精度は添付画像のようにほぼ同じ。(Float128の方が精度が少し高い。さらに、Float128の方が扱える数値の幅が広い。)

Double64の精度は桁数で言えばFloat64の2倍。

添付画像2:Float64とそれらの計算速度の違いがわかる。 pic.twitter.com/dIQbDiFv9E

posted at 16:44:56

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

@Hishinuma_t #Julia言語 私の環境は添付画像の通りです。

Double64はFloat64を2個使って精度を上げたものです。だから、Float64と比較すると非常に遅いです。

Double64とFloat128の精度はほとんど同じ。精度がほとんど同じなのに、Double64の方が速いわけです。(Float128には別の良い点がある。) pic.twitter.com/33DatBta2Y

Retweeted by 黒木玄 Gen Kuroki

retweeted at 16:29:24

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 vは長さ1000のVectorで、Aは50×50のMatrixです。

浮動小数点数の型にも色々ある。だから、浮動小数点数一般で通用するはずのアルゴリズムに基く函数を

function f(x::Float64)::Float64 ~ end

のスタイルで書くと、損をすることになる。

function f(x) ~ end

が多くの場合に勝る。 pic.twitter.com/VP14Y7lOdw

posted at 15:38:12

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語

github.com/JuliaMath/Doub

のDouble64と

github.com/JuliaMath/Quad

のFloat128とprecision=113のBigFloatの比較。

Double64が非常に速かったです。単純にDouble64の方が良いわけではないですが、速度も必要な場合にはDouble64を使いたい。

nbviewer.jupyter.org/gist/genkuroki twitter.com/Hishinuma_t/st pic.twitter.com/qkK8F50rAO

posted at 15:38:12

 

非公開

retweeted at xx:xx:xx

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

梅崎さんが正しい。

大学理学部数学科でも、演習で学生が

A ⇔ B
 ⇔ C
 ⇔ D
 ⇔ E

のような「証明」を書いて来たときには大抵ギャップが残っていて、例えば「DからCが出ることは自明なんですか?自明と言えるためにはノータイムで証明をすぐに書けることが必要です」と質問すると大抵潰れる。 twitter.com/unaoya/status/

Retweeted by 黒木玄 Gen Kuroki

retweeted at 10:48:00

 

非公開

retweeted at xx:xx:xx

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 実際にはJuliaを「高級電卓」のように使っているときには、structの自前での定義は結構面倒です。面倒だと思ったら、既存の型だけで仕事をすませばよいと思います。しかし、

  入力=問題→問題を解く函数→出力=結果

という構造が明瞭になるようなコードを書くべきだと思います。

posted at 10:20:04

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 以上のような「入力のProblemをsolve函数に与えると結果のResultが得られる」という

 問題と解法スタイル

になっている場合には、それをそのまま素直にコードに翻訳すればよいと思います。

問題と結果を見易く表示する函数も用意しておく。

nbviewer.jupyter.org/gist/genkuroki pic.twitter.com/OqKN3oBqNj

posted at 10:09:55

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 パラメーターが α=θ=1.0, N=10^8 の場合。

この場合は「平均1の指数分布のサイズ1億のサンプルを生成して、その算術平均と対数幾何平均を求めよ」という問題になります。

対数幾何平均の方の期待値はオイラー定数(Euler's γ)の-1倍になります。

nbviewer.jupyter.org/gist/genkuroki pic.twitter.com/etPYvZ8EsC

posted at 10:05:27

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 「論よりコード」の原則は重要なので実際に動く例を作って来ました。

Base. showを定義して、問題と結果の表示が見易くなるようにしてあります。

問題は「ガンマ分布(α, θ)のサイズNのサンプルを生成し、その算術平均と対数幾何平均を求めよ」です。

nbviewer.jupyter.org/gist/genkuroki pic.twitter.com/IbFansAAST

posted at 10:00:44

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 Base.@ kwdef structで問題を指定するパラメータをまとめてしまった場合には、デフォルトのパラメータ値で問題を解く場合には

p_default = My.Problem()
r_default = solve(p_default)

とでき、パラメータ値Nを10^5に変えたければ

p = My.Problem(N=10^5)
r = solve(p)

とできます。

posted at 09:30:25

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 パラメータを

const α = 10.0
const N = 10^3

と書いて、函数solve()中にα, Nをナマで書くスタイルだと、パラメータの値を変えるために、ソースコードを書き換えるか、警告を無視して定数の値を変えるかしなければいけなくなります。

これは非常に不便です。

posted at 09:03:28

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 さらにそのとき

using Parameters

function solve(prob::My.Problem)
@ unpack α, N = prob
パラメータα, Nを使った計算
end

と書けば、函数中でprob.α, prob.Nの値をα, Nという名前で利用可能。

これは

const α = 10.0
const N = 10^3

として、solve()の中で使うより便利。

posted at 09:00:54

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 例えば

module My
Base.@ kwdef struct Problem{F, I}
α::F = 10.0
N::I = 10^3
end
end

prob = My.Problem()

と書けば、パラメータα=10.0、N=10^3で指定された問題の型 My.Problem{Float64,Int64}を持つ変数 prob を作れます。

posted at 08:54:51

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 注意!

structの定義はmoduleに入れておいた方が無難!

module(分離された名前空間)でstructを定義していれば、structの定義を変更したいときに、module全体(名前空間全体)を上書きすることによって対処できます。

これはFAQです。

posted at 08:46:27

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 jlファイルには上から順番に実行したいことを並べて書けばよい。例えば

Base.@ kwdef struct Problem~end
struct Result~end

function solve(p::Problem)~end # Resultを返す
function save(r::Result, fn)~end

p = Problem(~)
r = solve(prob)
save(r, "~")

posted at 08:43:25

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 ②③の組み合わせについて。jlファイルを

const PARAM1 = ~

const PARAMn = ~

function main()
モデルを決めるパラメータ達PARAM1~PARAMnを
使ってモデルを解く計算を実行
end

main()

のスタイルにする必要はない。

特にモデルのパラメータのconst化は損だと思う。続く

posted at 08:34:29

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 ①具体的な型を指定して、函数の適用範囲を無駄な制限をかけるのは損。

function f(a::Array{Float64, 2}) ~ end

と書くと、Arrayでない配列のような型に適用できなくなる。Float64以外の浮動小数点数型にも使えない。多くの場合に

function f(a) ~ end

で十分(速度的劣化はない)。

posted at 08:34:28

9月7日

@genkuroki

黒木玄 Gen Kuroki@genkuroki

#Julia言語 無用だと私が思うスタイル

①具体的な型を指定して無用に制限

例:function f(a::Array{Float64, 2})::Float64 ~ end

多くの場合に function f(a) ~ end で十分。

②jlファイルの最後が

function main() ~ end
main()

③モデルのパラメータがconstになっている。

posted at 08:34:27

残り73件のツイートを見る

このページの先頭へ

×