追記

この記事よりもPyCall.jlでPyTorch使ってDeep Learningするのほうが内容が豊富です。
追記終わり。


JuliaからPythonを呼ぶにはPyCallを使えばいいらしいので、Scikit-learnのサンプルコードを試しに移植してみました。いくつか修正は必要ですが、ほとんどそのまま動く印象です。

ここでは、移植に際して必要な変更点を最初に列挙します。そのあとにコード全文を載せました。

オリジナルのサンプルコードはアヤメデータの可視化です。

http://scikit-learn.org/stable/auto_examples/datasets/plot_iris_dataset.html

モジュール呼び出しの変更(Python -> Julia)

1. matplotlib(Python)はPyPlot(Julia)から呼び出す.

変更前(Python)

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

変更後(Julia)

using PyPlot

注)plt.は必要なくなります。

2. Pythonモジュールの読み込みにPyCallを使う

変更前(Python)

from sklearn import datasets
from sklearn.decomposition import PCA

変更後(Julia)

using PyCall
@pyimport sklearn.datasets as datasets
@pyimport sklearn.decomposition as decomposition

その他の変更箇所

Python -> Julia

  • インデックス
    • Python:0-base
    • Julia:1-base
  • 最初の2つの要素のスライス
    • Python:array[:2] <= 右端を含まない
    • Julia:array[1:2]<= 右端を含む

NumPy -> Julia

  • ndarrayはJulia nativeのArrayに変換される。
  • 1次元配列からの最大値の取得
    • Python:array.max()
    • Julia:maximum(array)

PyCall

https://github.com/JuliaPy/PyCall.jl

  • @pyimportでインポート出来るのはモジュールのみ
    • Pythonのクラス、関数、変数の直接の読み込みは出来ない
    • from xxx import yyyの構文は使えない(たぶん)
  • Pythonオブジェクトoのメソッド/アトリビュートへのアクセスにはJuliaのsymbolを使う。
    • Python : o.attribute
    • Julia : o[:attribute]

コード全文

# Code source: Gaël Varoquaux
# Modified for documentation by Jaques Grobler
# License: BSD 3 clause

using PyCall
using PyPlot
@pyimport sklearn.datasets as datasets
@pyimport sklearn.decomposition as decomposition

# import some data to play with
iris = datasets.load_iris()
X = iris["data"][:, 1:2]  # we only take the first two features.
y = iris["target"]

x_min, x_max = minimum(X[:, 1]) - .5, maximum(X[:, 1]) + .5
y_min, y_max = minimum(X[:, 2]) - .5, maximum(X[:, 2]) + .5

figure(2, figsize=(8, 6))
clf()

# Plot the training points
scatter(X[:, 1], X[:, 2], c=y, cmap=PyPlot.cm[:Set1],
            edgecolor="k")
xlabel("Sepal length")
ylabel("Sepal width")

xlim(x_min, x_max)
ylim(y_min, y_max)
xticks(())
yticks(())

# To getter a better understanding of interaction of the dimensions
# plot the first three PCA dimensions
fig = figure(1, figsize=(8, 6))
ax = Axes3D(fig, elev=-150, azim=110)
X_reduced = decomposition.PCA(n_components=3)[:fit_transform](iris["data"])
ax[:scatter](X_reduced[:, 1], X_reduced[:, 2], X_reduced[:, 3], c=y,
           cmap=PyPlot.cm[:Set1], edgecolor="k", s=40)

ax[:set_title]("First three PCA directions")
ax[:set_xlabel]("1st eigenvector")
ax[:w_xaxis][:set_ticklabels]([])

ax[:set_ylabel]("2nd eigenvector")
ax[:w_yaxis][:set_ticklabels]([])
ax[:set_zlabel]("3rd eigenvector")
ax[:w_zaxis][:set_ticklabels]([])

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.