はじめに
最近うちの会社でも機械学習がホットになってきていて、去年、直属の先輩から「機械学習やりなよ」と言われましたが、「自分にはまだ他にやりたいことがあるので。。。」と逃げていました。
しかし今年の後半になるにつれて、さらに勢いをましている機械学習をみて、「これは今のうちにやらないと置いていかれる」と焦り始めて、ちょっと頑張ってみることにしました。
機械学習には「Python」「R」など長年使われている言語もありましたが、新しもの好きの私は迷うことなく「Julia」でやることに決めました!
「Julia」を少し調べてみると面白い機能があったので、個人的な備忘も兼ねて記事にしたいと思います。
参考文献
Julia公式ページ
GitHub
yomichi's blog
なかでもyomichiさんの「JuliaBook」はオススメです。
これをみればある程度のJuliaの文法が把握できると思います。
Juliaとは
一言で言うならば「超速くて、超書きやすい言語」とでも言っておきます。
作成者がJuliaを作った理由(日本語版)は以下にあります。
なぜ僕らはJuliaを作ったか
様々な記事を見ている限り、ここに書いてあることは正しそうだなと思っています。
Juliaのちょっと面白いなって思ったところ
ここからは完全に個人的な備忘と興味の記事です。
他にもこんな面白いことあるんだぜ!っていうのがあれば教えてください。
2*x+1
じゃなくて2x+1
って書ける!
x = 100
y = 2x+1
println(y)
# 201
x = 20
y = 30
fx = 2((x-10)*(y-20))^2
print(fx)
# 751168800
Juliaが対応している「×」の省略は以下のようです。
左側 | 右側 | 対応 | 例 |
---|---|---|---|
数字 | 数字 | × | 23 |
数字 | 変数 | ○ | 2x |
数字 | () | ○ | 2(x+1) |
変数 | 数字 | × | x3 |
変数 | () | × | x(1+2) |
変数 | 変数 | × | xy |
() | 数字 | × | (x+1)2 |
() | 変数 | ○ | (x+1)x |
() | () | × | (x+1)(y+1) |
紙で式を書いているのと同じような書き方ができるのはいいですね。
6/3
は2
だけど、3\6
だって2
だ!
x = 3\6
println(x)
# 2.0
これは面白いと思いましたが、使いどころあるのか?
1 < x && x < 10
って無駄が多くないですか?
x = 5
A = 1 < x < 10
println(A)
# true
人間がパッと見、解けない問題だって解ける!だってプログラミング言語だもの
A = 7+7/7+7*7-7
print(A)
# 50.0
さすがです。
# 原問 -> 6/2(1+2)
x = 1+2
A = 6/2x
print(A)
# 1.0
!!!?
ネットでは、「9」が正解だ!という人が多数いましたが、「そもそも悪問だ!」と主張する人も多いようで。。
Julia先生が出した答えは1.0でした。
これは、数字と変数がくっついている部分を優先的に計算するというJuliaの仕様によるもの。
わかりにくい部分も多いと思いますので、コードを書く際は以下のように「()」で計算順序の明示化をしたほうがいいですね。
# 原文 -> 6/2(1+2)
x = 1+2
A = (6/2)x
print(A)
# 9.0
どうせ行列書くなら見やすいほうがいいに決まってる。
a = 2
x = [ a 3 4;
4 5 6;
5 6 7; ]
y = [ 1 3 4;
4 4 6;
5 6 6; ]
println(x-y)
# [1 0 0
# 0 1 0
# 0 0 1]
"I like %s and %s" %("apple","lemon")
って書かなくていいんだよ!
a = "julia"
println("I love $a")
# I love julia
x = 10
y = 20
println("this is $(x+y)")
# this is 30
埋め込みがあると、出力が簡単に書けるのでいいですね。
もちろん辞書型だってある
x = Dict("example1" => 2, "example2" => 3 , "example3" => 4)
println(x)
# Dict("example3"=>4,"example1"=>2,"example2"=>3)
if ... else ...
っておいしいの?
x = 1
ifelse(false, x + 1, x + 2)
println(x)
# 3
コードが短くなるので個人的には好きです!
配列を一括で初期化
zeroarray = zeros(Integer,4)
println(array)
# Integer[0,0,0,0]
onearray = ones(Integer,4)
println(onearray)
# Integer[1,1,1,1]
0や1で配列を初期化する方法。
このコード何ってなったら@doc
で。
"""
# this is julia example program
# how to use
`add(x,y)`
|x|y|
|:-:|:-:|
|Integer|Integer|
"""
function add(x::Integer, y::Integer)
print(x+y)
end
このように関数の上に文字列を書くことで関数のドキュメントを生成できる。(Markdown対応)
実行方法は、REPLを起動し、Juliaのコードを書いたファイルをinclude("hello.jl")
してから、@doc(add)
を入力。
(画像がイメージ)
ちなみに、変数などにも同様にDocumentをつけることができる。
もちろん標準装備されている関数のドキュメントも参照できる。
これは便利
最後に
いっぱい書きたいけど書きすぎると見栄え悪いのでこの辺で。。
Juliaは面白そうなので、今後様々な場面で使われていくのではないでしょうか。
私も来年に向けて必死にキャッチアップしようと思います。