NumPyと
      RとMATL
  比較に 関     A B ®の
        する一考
             察

                   比戸将平
        Tokyo.S           (@sla)
                ciPy#1 2
                        011.08.2
                                 8
自己紹介
• 比戸将平(HIDO Shohei)
• TwitterID: @sla
• 所属:IBM東京基礎研究所(6年目)
• 専門:データマイニング、機械学習
• 使用言語:Java、 R、 MATLAB®、Python
• マイブーム:NumPy+SciPy
  –   4年前:「Rすげぇ!」
  –   3年前:「Rちょっとうぜぇ!」
  –   2年前:「MATLAB様!」
  –   1年前:「おいMATLAB!」
  –   今年:「冷やしNumPy始めました」
本発表の目的
• 「私にとっての」NumPyの有用性を検証したい
• 比較対象
 –R
 – MATLAB®
• そのために「個人的・主観的」評価
 – 定性的な評価:全てを試した立場から比較検討
 – 定量的な評価:同等の実験で性能比較

      注:一般的な優劣を付けるわけではない
本発表の結論

    適材適所
• 大きく見れば同じような機能・性能・環境
• パフォーマンスー習得コスト-実装コスト
• 決定打となる要素は何か?
R
• 統計言語Sのオープンソース実装
• OSSライセンス:GNU GPL
• 多数の公開ライブラリ群(CRAN)
 – 統計、バイオ、機械学習、DM、信号処理


                abs <- function( value ) {
                  if (value < 0) {
                      abs_value <- -value
                  } else {
                      abs_value <- value
                  }
                  return(abs_value)
                }          絶対値を める関数
                       例:絶対値を求める関数
MATLAB®
• MathWorks社の製品
• 独自の言語
• 多数のToolBox製品(アドオン)
  – Statistics, Optimization, Signal Processing,…
• 配布に関して:MATLAB Compilerがあれば
  – MATLAB Common Runtime+バイナリ配布可



                                         function [ abs_value ] = abs( value )
                                            if (value < 0 )
                                               abs_value = - value;
                                            else
                                                abs_value = value;
                                            end
                                         end            絶対値を める関数
                                                    例:絶対値を求める関数
NumPy (Numerical Python)
• Python用の数値計算ライブラリ
• 科学計算フレームワークSciPyの基盤
• OSSライセンス:BSD&MIT


              def abs(value):
                if value < 0:
                    abs_value = -value
                else:
                    abs_value = value
                return(abs_value)
                      例:絶対値を求める関数
                        絶対値を める関数
定性評 価
定性比較項目
• 使う:公開ツールや利用環境の充実度
• 作る&配る:自前開発環境と公開の容易さ
使う
  NumPy                R          MATLAB

• 無償              • 無償          • 有償製品
• Python各種ツール     • 豊富なライブラリ    • Toolbox別売
    •matplotlib   • CRANで一括管理   • ユーザーコミュニティ
    •Cython
    •f2python
    •IronPython
    •PyPy
    •PyUnit
    •PyLint
• 内部パッケージが複雑
• 機能の重複がいろいろ
作る&配る
   NumPy                  R       MATLAB

• Eclipse+PyDev   • R GUI      • MATLAB製品
                  • R+StatET
• BSD             • RStudio    • MATLAB Compiler
                               • MATLAB Common
                  ・ ツール群はGPL    Runtimeのインストール
定量評 価
定量評価の既存例
• http://scipy.org/PerformancePython
   – ラプラス方程式でNumPy=MATLAB
   – NumPy+Fortlan/C++でPure C++に近づける
• http://www.sciviews.org/benchmark/
   – いろんな統計計算・数値計算のスコアを平均してR=MATLAB
   – 専門ツールはさらに早いが拡張性が無い
• http://mlg.eng.cam.ac.uk/dave/rmbenchmark.php
   – 2倍くらい速い

         NumPy vs. R vs. MATLABはあまり無い
今回の定量評価対象
• 行列演算:機械学習等で非常に重要
 – 逆行列
 – 固有値分解
 – 特異値分解
• 比較軸
 – 行列size:{100, 200, 400, 800}
 – 行列density:{0.001, 0.01, 0.1}
   • スパース行列に対する計算
   • ただしスパース行列のデータ構造は未使用
実験環境
• 実験マシン:Lenovo Thinkpad X201
  – CPU i5 M560 2.67GHz, メインメモリ3GB
• R:Ver 2.13.0
• MATLAB:Ver7.12(R2011a) Win32bit版
• NumPy:Ver1.6.1(Python2.6ベース)
  – SciPy:Ver0.9.0
逆行列(density=1.0)
100



 10

                               NumPy
  1                            R
       100   200   400   800   MATLAB

 0.1



0.01
固有値分解(density=0.1)

1000


 100


  10                            NumPy
                                R
   1                            MATLAB
        100   200   400   800
 0.1


0.01
特異値分解(density=0.01)

100



 10

                                NumPy
  1                             R
        100   200   400   800   MATLAB

 0.1



0.01
逆行列(size=800)
100




                             NumPy
 10                          R
                             MATLAB




  1
      0     0.01   0.1   1
固有値分解(size=800)
1000




 100
                            NumPy
                            R
                            MATLAB
  10




   1
       0   0.01   0.1   1
R+sparse+SVD?
• Rのスパース行列パッケージ
 – Matrix
 – SparseM
 – 両方ともSVDを持たない
• 解決方法
 – 直にSVDLIBCを呼び出す
 – 反復解法を実装する
まとめ
• 定性評価
 – NumPyはPython関連ツールが強み
 – Rのライブラリ充実度は使う分には大きな強み
 – MATLABはMCRを使えるならば有用
• 定量評価
 – MATLABはそのままで最適化されている
 – NumPyとRはどっこいどっこい
 – 行列の密度でかなり性能が変わる
  • スパース行列は使っていないにも関わらず

110828 tokyo scipy1_hido_dist