ruby – DECODE https://decode.red/blog data decode, decoder or decoded ... design of code Mon, 15 Dec 2025 06:15:00 +0000 ja hourly 1 https://wordpress.org/?v=4.7.29 Matplotlib from Ruby ../../../20170814754/ Mon, 14 Aug 2017 02:40:51 +0000 ../../../?p=754 機械学習といえぱPython、ということが定着して、Rubyがこのジャンルではちょっと肩身の狭い思いをしているとのことですが、Rubyのライブラリがないのなら、PythonのライブラリをRubyから呼び出せばいいというPyCallを使った試みをいろいろと見つけたので、私も試してみました。

PyCall
https://github.com/mrkn/pycall

参考: http://qiita.com/mix_dvd/items/2161278cd996a0ed90a3

基本的にPythonでやれることはPythonでやればいいという考え方ですが、Rubyのデータを表示しょうとしたときに、PythonのMatplotlibのようなものが簡単に使えるのはとても便利に感じました。

環境: Python 2.7.12, Ruby 2.3.1p112 / Ubuntu 16.04
(pythonでnumpyとmatplotlibが使える状態にしておきます)

sudo gem install –pre pycall
sudo gem install ffi

ffiライブラリは古いものだと、エラーが出たのでアップデートしました。(ffi-1.9.18.gem)

require 'pycall/import'
include PyCall::Import

pyimport 'numpy', as: 'np'
pyimport 'matplotlib.pyplot', as: 'plt'

x = np.arange.(-np.pi, np.pi,0.1)
s = np.sin.(x)
c = np.cos.(x)

plt.subplot.(2,2,1)
plt.plot.(x,s)
plt.plot.(x,c)
plt.xlim.(-np.pi, np.pi)
plt.ylim.(-1.1, 1.1)

plt.subplot.(2,2,2)
plt.imshow.(np.random.randn.(300,300))

plt.subplot.(2,2,3)
rx = np.random.randn.(50)
ry = np.random.randn.(50)
plt.plot.(rx,ry, "o")

plt.subplot.(2,2,4)
plt.hist.(np.random.randn.(1000))
plt.show.()

関数呼び出しのところでドットを挿入するところが、ちょっと間違えやすいですが、まったく同じコードになります。
念のためPythonのコードでも確認。

import numpy as np
import matplotlib.pyplot as plt

x = np.arange(-np.pi, np.pi,0.1)
s = np.sin(x)
c = np.cos(x)

plt.subplot(2,2,1)
plt.plot(x,s)
plt.plot(x,c)
plt.xlim(-np.pi, np.pi)
plt.ylim(-1.1, 1.1)

plt.subplot(2,2,2)
plt.imshow(np.random.randn(300,300))

plt.subplot(2,2,3)
rx = np.random.randn(50)
ry = np.random.randn(50)
plt.plot(rx,ry, "o")

plt.subplot(2,2,4)
plt.hist(np.random.randn(1000))
plt.show()

すばらいライブラリです!

]]>
Dijkstra’s Algorithm ../../../20160614580/ Tue, 14 Jun 2016 13:55:54 +0000 ../../../?p=580 ダイクストラ法という最短経路を求めるアルゴリズムをRubyのGraph Libraryを使ってテストしてみました。

環境: ruby 2.0.0p481 / MacOSX 10.10.5
インストール:

sudo gem install rgl
brew install graphviz

参考:
https://github.com/monora/rgl/issues/24

まずは参考サイトのデータをそのままテスト。

require 'rgl/base'
require 'rgl/adjacency'
require 'rgl/dijkstra'
require 'rgl/dot'

graph = RGL::AdjacencyGraph[2,53, 2,3, 3,8, 3,28, 3,39, 29,58, 8,35, 12,39, 10,29, 62,15, 15,32,  32,58, 58,44, 44,53]
graph.write_to_graphic_file(fmt='jpg', dotfile='dijk')
p graph.dijkstra_shortest_path(Hash.new(1), 39, 62)

dijk

[39, 3, 2, 53, 44, 58, 32, 15, 62]

次に最短ルートを本当にとるか、ということで経路を増やしてみます。

require 'rgl/base'
require 'rgl/adjacency'
require 'rgl/dijkstra'
require 'rgl/dot'

graph = RGL::AdjacencyGraph[2,53, 2,3, 3,8, 3,28, 3,39, 29,58, 8,35, 12,39, 10,29, 62,15, 15,32,  32,58, 58,44, 44,53,  10,15, 8, 44,  58,15]

graph.write_to_graphic_file(fmt='jpg', dotfile='dijk2')
p graph.dijkstra_shortest_path(Hash.new(1), 39, 62)

dijk2

[39, 3, 8, 44, 58, 15, 62]

最後に、ルートにコストを加えて迂回させます。(2以上がコスト)
[39, 3, 2, 53, 44, 58, 32, 15, 62]
コストをかけた部分が避けられました。

require 'rgl/base'
require 'rgl/adjacency'
require 'rgl/dijkstra'
require 'rgl/dot'

graph = RGL::AdjacencyGraph[2,53, 2,3, 3,8, 3,28, 3,39, 29,58, 8,35, 12,39, 10,29, 62,15, 15,32,  32,58, 58,44, 44,53,  10,15, 8, 44,  58,15]

cost = {[39,3]=>1, [3,8]=>2, [8,44]=>2, [3,2]=>1, [2,53]=>1, [53,44]=>1, [44,58]=>1, [58,15] => 3, [58,32]=>1, [32,15]=>1, [15,62]=>1,
[39,12]=>1, [3,28]=>1, [8,35]=>1, [58,29]=>1, [29,10]=>1, [10,15]=>1}
p graph.dijkstra_shortest_path(cost, 39, 62)

dijkstra01

まずは基本的な部分のテストでした。

]]>