Edited at

なぜ機械学習にPythonが選ばれるのか


はじめに

日本ではWeb系のLL言語としてはPHP・Perl・Rubyが強く、Pythonは海外では普及しているが日本ではマイナーな言語である。Google AppEngineの開始当初(2008年4月)にPythonをサポートしていた際には、なんでPythonなんだろうと軽く調べ、教育用として海外では普及しているという認識だった。

2012年~2013年頃にデータサイエンスがバズワードとなり機械学習する上でR言語と次点でPythonという感じだったと思う。そして昨今は人工知能ブームということでTensorFlowやChainerといったPythonのフレームワークが公開されたことで、Python一色になってきている。

※タイトルは科学技術計算より世間的に馴染みがある機械学習にしました。


科学計算や機械学習にはPython

特に科学計算分野ではPythonコミュニティが非常に活発で、機械学習など新しい技術は真っ先にPythonで実装されるようになっている。

なぜ、この分野が強くなったのか疑問を持ち「科学計算|機械学習 Python なぜ」検索してみると下記上位2サイト(どちらも著者は同じ:原作は海外の方)が見つけられる。

「なぜ科学計算にはPythonか?」の一部から引用すると


要約すると エコシステムが充実&加速


Rで出来たことがpandas, statsmodelでかなり できるようになった(著者は無くて困らない)

機械学習もscikit-learnで楽に


言語間のデータのやり取りの必要がなくなるメ リットが大きい



科学/エンジニアリングコミュニティから早期に注目

前述では機能面によるものであったが、私としては何故このように科学計算分野のライブラリが作成され強化されるように至ったのかを知りたくなり歴史から調べてみました。年表は長くなったので後方に記載。

RubyがRailsにより注目されたように、Pythonでは当初数値コンピューティング用に設計されたものではなかったが、リストの概念や関数型言語の基本機能を実装したこと、Jim Fulton氏(元ZOPE社CTO)が多次元配列・行列ライブラリ「Matrix Object in Python」を開発したことで、早い段階(Python 1.0(1994年)から1年後)で科学/エンジニアリングコミュニティに注目され「Matrix-SIG」が設立、後の「NumPy」が紆余曲折(Numeric(1995年)とNumArray(2001)を統合)を経て2005年にリリースされた。また幾つかの科学計算用ライブラリをパッケージ化した「SciPy」が2001年にTravis Oliphant氏らによりリリースされた。

その後はEnthought社が2001年に米国で設立され、SciPyをベースにツールやパッケージやサポートを提供、また科学技術計算向けの「SciPy Conference」と呼ばれる会議の開催を支援して行く。

参照:Travis E. Oliphant, "NumPy and SciPy: History and Ideas for the Future" - SlideShare


コミュニティと民間企業のサポート

科学技術計算のためのPython入門」の本の第1章「科学技術計算とPython」に「なぜ Python が使われるのか?」についての記載があるとのことKindleで購入。

Pythonが、科学技術計算で使われるようになるであろう理由のもう一つに着目した。


オープンソースプロジェクトは開発リソース(おもにマンパワー)が限られ、開発の中心メンバーが何らかの理由で参加しなくなった場合、一気にそのプロジェクトが衰退する場合があるが、特に科学技術計算関係のパッケージについては民間企業が本格的にサポートとしており、オープンソースソフトウェアとして公開する体制が整っている。


民間企業の代表的なのが、Enthought社とContinuum Analytics社である。

Enthought社は科学技術計算用パッケージ群「Scipy Stack」を提供し、科学技術計算向けの「SciPy Conference」と呼ばれる会議の開催を支援している。Continuum Analytics社はPythonディストリビューション「Anaconda」を提供し、データ分析向けの「Py Data」と呼ばれる会議の開催を支援している。

また、GoogleもPython作者のGuido van Rossum氏を2005年に雇用したり、「Google Summer of Code」というオープンソースの開発に資金を提供するプロジェクトを2005年に作成し、機械学習ライブラリの「scikit-learn」や多変量回帰分析・時系列分析ライブラリ「statsmodels」がリリースされています。


キーマン

科学技術計算分野のキーマンは、「SciPy」と「NumPy」の作者でもあるTravis Oliphant氏であろう。Oliphant氏は、2001年から2007年にかけてBrigham Young University(BYU)の電気・コンピュータ工学の助教授を務め、BYU生物医学イメージングラボを指導し、スキャン・インピーダンス・イメージングに関する研究を行っていました。

その後、前述したEnthought社の社長を2007年から2011年まで務め、2012年1月にContinuum Analytics社を設立しました。


R言語との差について

主観的な観点ですが科学計算や機械学習の分野においてはPythonとR言語が二大勢力で、その分野に特化したR言語の方がパッケージが充実しており、Pythonの同分野のパッケージと比べると、機能が少なかったり細かいところに手がとどかなかったりとイマイチでR言語が明らかに有利な点もありましたが、ここ数年でかなり安定しその差は急速に縮まってきています。

統計屋や数理屋が使うようなマニアックな統計処理や多変量解析のライブラリはR言語の方がまだ充実しているのでしょうが、普通のプログラマや非エンジニアがデータ解析に使う分には、Pythonで事足りるようになってきているのだと思います。

代替パッケージを挙げてみます。

R
Python
内容

dplyr/tidyr
pandas
データ解析ライブラリ

ggplot2

Seaborn(シーボーン),bokeh

可視化ライブラリ

RStudio
Rodeo(ロデオ)
統合開発環境(IDE)


教育言語として

Pythonは「同じインデントレベルの文は同じ塊」というルールを採用しており、見掛け上のPythonプログラムの最大の特徴となっています。

Python作者のGuido van Rossum氏(オランダ人でアムステルダム大学卒)はPythonを開発する以前に、オランダで教育向けの「ABC言語」の開発に関わっており、Python自体はRAD(迅速なアプリケーション開発)がメインで教育用を念頭に開発してはいなかったものの、ルーツとなったABC言語では文法に関してさまざまな研究が行われ、インデントを使うのが初心者にとってもっとも間違いにくいブロックの表現として採用していたのです。(Donald Knuth氏が推進していた。)

2014年7月の記事「Pythonが大学の入門用プログラミング言語として人気を集めていると判明」ですが、「アメリカのコンピュータサイエンス教育のトップ39大学で教えられている言語」はPythonがトップになっています。アメリカの大学辺りではプログラミング初等教育用言語として導入されているケースが増えてるとのこと。

Pythonはオブジェクト指向言語として利用できるが、無理してオブジェクト指向設計を行う必要はない。敷居が少しでも低いことは重要である。

【2018/01/07追記】


石本)pandasもかなり最近。Fortranの代わりに使うための行列演算のパッケージというのは昔からあった。歴史的にも、Guido *3がNumPyはひいきにする傾向があって。(中略)

佐藤)なぜNumPyを気に入ってるんですかね。

石本)Pythonのユースケースとして。科学技術計算用にPythonを学校などで使ってほしいという狙いですね。

佐藤)それは当たりましたね。なぜPythonは科学技術計算のほうで強いのかという理由はよく知らなかったですね。

【その3】Pythonがなぜデータ分野で強いのか?の真実 〜 Pythonエンジニア列伝 Vol.3 石本敦夫氏



CG世界のスクリプト言語として

Pythonは統合3DCGソフト(Maya,Blender,LightWave等)ではデファクトスタンダードのスクリプト言語となっています。

また、ドローソフト「Inkscape」や画像処理ソフト「Paint Shop Pro」でも使われています。


オランダ生まれ

日本は江戸時代に鎖国していたが、長崎の出島に限ってオランダは出入りを許されていました。これは、キリスト教がプロテスタント系のオランダ人は、目的は貿易だけであり、カトリック系と違いキリスト教布教には一切関わらない方針だったためと言われています。蘭方医学や自然科学や芸術の面では洋風画など、日本に影響をもたらせてくれました。

世界がPython使ってる時に、日本ではPerl主流となりその後もPythonへ流れる事もなくJAVA,PHPへ行きました。

オランダ生まれのPythonを日本が受け入れる時期が来たのかも知れません。なんてね!


最後に

今はR言語からPythonに置き換わりつつあり、日本国内でも普及期に入ってきています。世間では人工知能が騒がれており、この分野の市場がこれ以上縮小しようがないでしょう。

私自身は目的を果たせるなら、プログラム言語は何でもいいと思っています。Pythonとて、いずれJuliaに置き換わる可能性もありえます。今でもPythonのライブラリ群の一部ではC++等で作られ、他の言語でも利用が可能となっているのだから。

Ruby作者のまつもとゆきひろ氏が「言語の人気が運によるというのはほんとにそう思う」とつぶやいたように、言語それ自体の優劣よりやはり「運」と言えるようなものに引っ張られるということは大いにあるでしょう。


年表

年表は大まかです。


出来事

1960
Python作者のグイド・ヴァン・ロッサム(Guido van Rossum)氏がオランダで誕生。

1979
Guido van Rossum氏が最初に触れたコンピュータは「AppleⅡ」。当時のお気に入りのゲームの一つがアドベンチャーゲーム「Colossal Cave」であった。

1982
Guido van Rossum氏がアムステルダム大学で数学・計算機科学の修士号を取得。卒業後にオランダの国立情報工学・数学研究所(CWI)へ入所し、教育向けの「ABC言語」の開発プロジェクトに参加、その後はいくつかの研究機関に所属。

1987
ラリー・ウォール(LarryWall)氏がプログラム言語の「Perl 1.0」を12月にリリース。

1989
Guido van Rossum氏がクリスマス前後の週の暇つぶしのためPythonの開発に着手。名前は空飛ぶモンティ・パイソンから。しかし、オライリーの表紙は伝統的に動物のため、蛇(Pythonの意味はニシキヘビ)のイラストが使用される。蛇との結びつけに抵抗があったが受け入れた。

1990
純粋関数型プログラミング言語「Haskell 1.0」をリリース。

1991
「Python 0.90」のソースコードを2月に公開。オブジェクト指向言語の特徴や抽象データ型である文字列、リストの概念を利用していた。

1994
「Python 1.0」を1月にリリース。主な特徴として関数型言語の基本であるラムダ計算を実装、map関数、reduce関数などを組み込んだ(Pythonの"関数型"の機能の起源)。Jim Fulton氏が多次元配列や行列ライブラリ「Matrix Object in Python」を作成する。

1995
Pythonは早い段階で科学/エンジニアリングコミュニティの注目を集め、多次元配列・行列ライブラリを定義する目的で「Matrix-SIG」が設立され、Python作者のGuido van Rossum氏も参加。Pythonの構文(特に索引構文)の拡張を実装して、配列計算を簡単にしました。Matrix-SIGは多次元配列・行列ライブラリ「NumArray」を後に開発。

MITの大学院生であったJim Hugunin氏(他作者: Konrad Hinsen,Paul Dubois, David Ascher, Jim Fulton)が中心となり多次元配列・行列ライブラリ「Numeric」をリリース。

Guido van Rossum氏がオランダから米国ヴァージニア州レストンにあるCorporation for National Research Initiatives (CNRI) へ移住。

ラスマス・ラードフ(Rasmus Lerdorf)氏がプログラム言語の「PHP 1.0」を6月にリリース。

ニュージーランドのオークランド大学のRoss Ihaka氏とRobert Clifford Gentleman氏がプログラム言語の「R言語」の初期バージョンを6月にリリース。1992年に考案、名前の由来は開発者2人の頭文字「R」と統計解析言語である「S言語」の一歩手前の「R」から。

まつもとゆきひろ氏がプログラム言語の「Ruby 1.0」を12月にリリース。1993年2月24日に静岡県浜松市で開発に着手。きっかけはperlが美しくないことへの不満から。触発はPython 20%、Perl 80%

1996
10月に「Python 1.4」をリリース。主な特徴としてキーワード引数や複素数型(complex)の組み込みをサポートした。

1997
1月に「Python 1.5」をリリース。主な特徴としてクラス例外を導入した。

1998
ラリー・ペイジとセルゲイ・ブリンによりGoogleを9月に創業。1996年に原型となる検索エンジンBackRubを開発、 URLServerとクローラはPythonで実装。

1998~1999
後にSciPyの一部となるfftw、Cephesmodule、stats.pyなどが開発される。1999年8月に「F2PY(Fortran to Python interface generator)」の開発に着手。

1999
「Haskell 98」を2月にリリース。

2000
Guido van Rossum氏とPythonのコア開発チームは BeOpen.com に移り、BeOpen PythonLabs チームを結成する。

10月にPythonLabsチームはDigital Creations (現在のZope Corporation) に移る。

「Python 2.0」を10月にリリース。リスト内包表記とガベージコレクションシステムとUnicodeが導入されました。多くの機能はHaskellを参考にした。

2001
Matrix-SIGは多次元配列・行列ライブラリ「NumArray」(作者:Perry Greenfield, J. Todd Miller,Rick White, Paul Barrett)として開発が継続され、その資産の上に科学計算用ライブラリ「SciPy 1.0」(作者:Pearu Peterson, Travis Oliphant, Eric Jones)をリリース。

Python Software Foundation」が3月6日に米国で設立。このときZope CorporationはPSFの賛助会員となる。

民間企業のEnthought社が米国で設立される。Pythonによる科学技術計算に特化したツールやコンサルティングおよびトレーニングの提供を行っている。「Scipy Stack」の整備と発展に主導的な役割を果たしている企業です。また科学技術計算向けの「SciPy Conference」と呼ばれる会議の開催を支援している。

Fernando Perez氏がインタラクティブシェル「IPython」を12月にリリース。

2003
ワシントンDCで第1回「PyCon(Python Conference)」が開催される。

john hunter氏により可視化ライブラリ「matplotlib 0.1」を4月にリリース。2001年から開発に着手。MATLABの競合への道を歩み始める。

多次元配列・行列ライブラリ「NumArray」(作者:Perry Greenfield, J. Todd Miller,Rick White, Paul Barrett)をリリース。Numericより大規模な配列が高速だが小さな配列では遅かったため、コミュニティの分断が発生する。

2005
Travis Oliphant氏は、1月に多次元配列ライブラリのコミュニティを統合するため、Numarrayの機能をNumericへの移植に着手。

Googleが「Google Summer of Code」というオープンソースの開発に資金を提供するプロジェクトを始める。

Guido van Rossum氏が12月にGoogleへ移籍し、2012年末まで勤める。

2006
Travis Oliphant氏により数値解析ライブラリの「NumPy 1.0」を10月にリリース。SciPyライブラリの一部であったが配列オブジェクトを取得するためだけに大きなSciPyライブラリをインストールするのを避けるために、ライブラリは分離された。BLASの競合への道を歩み始める。

2007
機械学習ライブラリの「scikit-learn」を6月にリリース。scikit-learn(初期はscikits.learn)は、David Cournapeau氏のGoogle Summer of Codeプロジェクトとして始まりました。

Cとの融合によるPythonの高速化ツール「Cython」を6月にリリース(Pyrexからフォーク)された。

OndřejČertík氏がシンボリック演算ライブラリ「SymPy」を3月にリリース。「Sage」の数式処理エンジンとなり、Mathematicaの競合への道を歩み始める。

Travis Oliphant氏が2007年にEnthought社の社長に就任し2011年まで務めました。

2008
「Python 3.0」(Unicodeへの全面移行)を12月にリリース。「Python 2.6」を10月にリリース。

2009
Skipper Seabold氏とJosef Perktold氏が多変量回帰分析・時系列分析ライブラリ「statsmodels」をリリース。「Google Summer of Code」プロジェクトとして始まりました。

2010
「Python 2.7」を7月にリリース。2.xの最終バージョンとなる。

James Bergstra氏らにより数値計算ライブラリ「Theano(テアノ)」がリリース。当時はCPU上ではNumPyの1.8倍、GPUではNumPyの11倍も速くなるとも報告された。

12月にOPenCV 2.2でPython2系のバインディングをサポート。

2011
Wes McKinney氏がRのdata.frameデータ構造を実装したデータ解析ライブラリ「Pandas 0.3」を2月にリリース。2008年に開発に着手、2011年まではAQL社のクローズドソースだった。plyr/dplyrを備えたRの競合への道を歩み始める。

2012
Travis Oliphant氏が1月にContinuum Analytics社を設立 。Continuum社はPythonディストリビューションの「Anaconda」を作っています。またデータ分析向けの「Py Data」と呼ばれる会議の開催を支援している。

ニューヨーク大学の研究者 Michael Waskom氏が可視化ライブラリ「matplotlib」ラッパーの「Seaborn(シーボーン)」をリリース。Rの可視化ライブラリ「ggplot2」のように美しく書ける。

Peter Wang氏がインタラクティブなグラフを作成できる可視化ライブラリ「bokeh」をリリース。bokehは写真用語である「ボケ」の英単語。

Jeff Bezanson氏らMITグループがプログラム言語の「Julia」を2月にリリース。 LLVMを使ったJITコンパイラでCなみの実行速度、Pythonのコードを呼び出す仕組みがありPythonの資産が活用できる。

2013
Guido van Rossum氏が1月にDropboxへ移籍。

Yangqing Jia氏ら当時Berkeleyのメンバーが中心にディープラーニングフレームワーク「Caffe」をリリース。

2014
IPythonを他言語でも対応させる「jupyter」プロジェクトを6月に発表。IPythonの拡大を受けてJulia、Python、Rから名付けた。

2015
Yhat社がデータサイエンスのための統合開発環境(IDE)「Rodeo(ロデオ)」を4月にリリース。R Studioの競合への道を歩み始める。

OPenCV 3.0でPython3系のバインディングを6月にサポート。

Preferred ResearchよりDeep Learningのフレームワーク「Chainer」を6月にリリース。

GoogleよりDeep Learningのフレームワーク「TensorFlow」を11月にリリース。

2016
GoogleのFrançoisChollet(フランソワ・ショレ)氏が高水準ディープランニングライブラリ「Keras 1.0」を4月にリリース。2015年3月に初公開。Keras(ケラス)はギリシャ語で"角"

「Python 3.6」を12月にリリース。

2017
「TensorFlow 1.0」、「Chainer 2.0」を2月にリリース。

「Keras 2.0」を3月にリリース。

IEEEが発行するオンラインマガジン「IEEE Spectrum」の7月の記事「The 2017 Top Programming Languages」で「Python」が1位になりました。

2018
「Python 3.7」を6月27日にリリース。

Guido van Rossum氏が、意思決定プロセスから完全に退くことを決断

IEEEが発行するオンラインマガジン「IEEE Spectrum」の7月の記事「The 2018 Top Programming Languages」で「Python」が1位になりました。

Julia 1.0」を8月8日にリリース。

他にもいろんな研究支援にPythonが使われている。


  • 分子生物学パッケージ「biopython

  • 天文学パッケージ「AstroPy

  • 化学分子構造ビジュアライザ「PyMOL

  • 分子構造モデリングツールキット「MMTK

  • 制御工学シミュレーション「python-control

並列処理や分散処理として次世代の多次元配列パッケージ群が出ている。

参照:Python 次世代の多次元配列パッケージ群


参照