Julia: 目的別機能

Takami Torao Julia 0.6 #julialang
  • このエントリーをはてなブックマークに追加

以下、例示に使用するサンプルデータは主に RDatasets の Iris を使用する。

julia> using RDatasets

julia> iris = dataset("datasets", "iris")
150×5 DataFrames.DataFrame
│ Row │ SepalLength │ SepalWidth │ PetalLength │ PetalWidth │ Species   │
├─────┼─────────────┼────────────┼─────────────┼────────────┼───────────┤
│ 1   │ 5.1         │ 3.5        │ 1.4         │ 0.2        │ setosa    │
│ 2   │ 4.9         │ 3.0        │ 1.4         │ 0.2        │ setosa    │
│ 3   │ 4.7         │ 3.2        │ 1.3         │ 0.2        │ setosa    │
⋮
│ 150 │ 5.9         │ 3.0        │ 5.1         │ 1.8        │ virginica │

データ変換

DataFrame を 2 次元行列に変換する

CSV ファイルや RDatasets から取得したデータはカラム名と行番号付きの DataFrame 構造を持っている。Iris データセットから 1-2 列を取り出し 2 次元行列に変換するには該当範囲を Matrix() に渡せば良い。

julia> Matrix(iris[:, 1:2])
150×2 Array{Float64,2}:
 5.1  3.5
 4.9  3.0
 4.7  3.2
 ⋮
 5.9  3.0

ただし、CSV から読み込んだデータなどは数値を正しく認識できず Missing 型を含む Union 型になっていることがある。この場合は convert() を使用して Array{Float64,2} に変換する。

julia> using CSV
julia> iris = CSV.read("iris.csv")

# 一部が Missings.Missing と認識されている
julia> Matrix(iris[:, 1:2])
150×2 Array{Union{Float64, Missings.Missing},2}:
 5.1  3.5
 4.9  3.0
 4.7  3.2
 ⋮
 5.9  3.0

# すべての要素を Float64 に変換した 2 次元行列を作成
julia> convert(Array{Float64}, iris[:, 1:2])
150×2 Array{Float64,2}:
 5.1  3.5
 4.9  3.0
 4.7  3.2
 ⋮
 5.9  3.0

k-means によるクラスタリング

Iris データセットの Sepal, Petal を 4 次元ベクトル空間上の点として \(k=3\) のクラスタリングを行う。データが DataFrame の場合は 2 次元行列に変換して転置する必要がある。

julia> using Clustering

julia> r = kmeans(Matrix(iris[:, 1:4])', 3; maxiter=200, display=:iter)
julia> assignments(r)
150-element Array{Int64,1}:
 1
 1
 1
...

PCA による次元削減

Iris データセットの Sepal, Petal を 4 次元ベクトル空間上の点として PCA を使用いて 2 次元に削減する。

julia> using MultivariateStats

julia> pca = fit(PCA, Matrix(iris[:,1:4])'; maxoutdim=2)
julia> xy = transform(pca, Matrix(iris[:,1:4])')
2×150 Array{Float64,2}:
 2.68413    2.71414    2.88899    2.74534   2.72872   …  -1.94411   -1.52717   -1.76435    -1.90094   -1.39019
 0.319397  -0.177001  -0.144949  -0.318299  0.326755      0.187532  -0.375317   0.0788589   0.116628  -0.282661

julia> p = plot(convert(DataFrame, xy'), x = :x1, y = :x2, Geom.point)
julia> img = PNG("iris_pca.png", 15cm, 10cm)
julia> draw(img, p)