.

2019年01月14日

プログラミング言語紹介(2):R / Python / MATLAB

 ども勉三です。「プログラミング言語紹介シリーズ」の2回目。今回は、いま流行りの機械学習や人工知能で注目されホットであり、何かと比較されることが多い R / Python / MATLAB の3言語について紹介したいと思います。

「オープンな R と Python」vs「商用ソフトウェアの MATLAB」

 まずざっくりとこの3言語を分類するなら、まずオープンかどうかで区切ることができると思います。オープンなのは R と Python、企業が開発して商用ソフトウェアとして販売されているのが MATLAB です。

 勉三はこの3言語はいずれも利用してきましたが、やっぱりドキュメント類は MATLAB は群を抜いて整備されています。線形回帰とかPCA解析とかの説明とか、普通に読んでても勉強になるレベルです。

 一方で、R や Python は基本的にドキュメントが分かりづらい。オープンソース界隈の文化というか、公式ドキュメントも分かる人だけ分かればいいというスタンスですね。ただ、利用者が圧倒的に多い分、何かやろうと思った時に調べれば、どこかのユーザが書いた解説ページがすぐ見つかるのは MATLAB にない利点です。

 また、オープンか商用かの違いは、環境設定の複雑さとも関係します。MATLAB はクローズドなエコシステムというか、MathWorks 社が作成したパッケージを使うのみなので、パッケージやバージョンによる依存関係や環境による違いとかもあまり問題にはならないのですが、R や Python は誰でもパッケージを作れるので環境構築で苦戦することが多いです。ただ、これは R や Python の高い拡張性を意味するので、コインの裏表のようなもので一概に悪いというわけではないですね。

「行列演算が標準の R と MATLAB」vs「標準ではない Python」

 行列演算というのは、行列(配列) a から x と一致する要素だけを抜き出した新たな行列を作りたい場合、a[a == x] のようにして書ける記法のことです。一般に、数値演算ではなるべく for ループを避けて、行列演算の形で一気に行った方が遥かに高速なため、この機能は必須となっています。

 この行列演算が標準でサポートされているかどうかで3言語を区分することができます。標準なのが R と MATLAB、標準でないのが Python です。こう書くと Python では行列演算できないみたいに思われてしまうのですが、Python でもできます。ただし、numpy という追加パッケージをインポートする必要があります。

 過去には、numpy は python の言語自体に組み込まれるという話もあったようですが、現在のところ Python の文法とは独立したライブラリとして存在しています。ただし実質的な標準ライブラリに近く、数値演算目的で python を使う人の大半は numpy をインポートすることになるかと思います。

 標準で行列演算がサポートされていないという点は割と大きいです。Python では numpy の配列も Python 標準のリストもほぼ同じ表記で扱うことができるので、コードを見ている分には違いが分からなかったりします。ただ、実際には裏では両者は厳然と区別されています。なので、Python のリスト型に対して、行列演算をするようなコードを書いてしまったり、あるいは逆にリストだと思っていたら numpy の配列だったりして、それでエラーになることも多いです。このあたりの扱いやすさでは、区別がないだけ R や MATLAB の方がすっきりとしているとは思います。

「数値演算に強みをもちつつも汎用性の高い Python」vs「数値演算に特化した R / MATLAB」

 ここまで3言語を並列で扱ってきましたが、Python は数値演算への強みという特性は持ちながらも、それ以外の用途でも使われている言語です。例えば、Web フレームワークの Django などがそうですし、別に機械学習や人工知能に一切関係がなくても、Python を使うことはできます。

 一方で、R や MATLAB を数値演算目的で使う人は殆どいないでしょうね。そういう意味では、比較されやすい3言語といいつつも、Python と R / MATLAB ではユーザの全集団としてみた時には、かなり違っているのではと思います。

なんで Python が伸びてるの?

 さて、ここまで3言語を比較してきましたが、正直なところ、回帰分析・線形判別・SVM・PCA解析だとか、スタンダードな解析目的に使うのであればどれでも大差はないと思います。文法も好みの問題です。どれか1つの言語ができる人は、他もすぐにできるようになると思います。

 ではなぜ今、Python が急激に伸びているのでしょうか? 勉三は「拡張性」「汎用性」の2つに理由があるのではないかと思います。拡張性というのは、オープンで誰でもパッケージを作って公開することができるという点ですね。この点で MATLAB が劣っているのは事実です(上でも書きましたがクローズドなゆえに使いやすいという面もあります)。

 では同じくオープンな R との違いはというと、Python は汎用性が高いという点でしょう。例えば、PHP や Ruby の代わりに、Django などのフレームワークを利用して Python でサーバサイドのプログラミングを書くことができます。機械学習や人工知能などの解析部分を Python で動かすのが一般的になってきた今、PHP や Ruby から Python コードを呼び出すよりは、サーバサイドは全部 Python にしたほうが簡単ですからね。

どれがおすすめなの?

 勉三としては正直どれでもいいと思います。まあ、MATLAB は普通に買うと数十万とかするので、大学や企業で解析されている方でないと難しいとは思いますが。

 ただ、R や MATLAB は情報量が少ない。プログラミング言語としてきちんと解説している本も少ないし古いものが多いです。その点、Python は書籍が多いので勉強しやすいです。なので、初心者の人には Python をおすすめします。

 心配しなくても、どれか1つできれば他は容易いです。少なくとも文法的には。なので、将来的に R や MATLAB を使う可能性がある方も、まずは Python から勉強すればよいでしょう。教材の多さというのは言語習得では非常に重要です。

 ただ注意して頂きたいのは、Python は環境構築が大変。よく日本語の入門書なんかでおすすめされている、Windows や Mac に Anaconda インストールして… みたいなことをやると苦労します。その辺は、当ブログの「AI/機械学習講座」なども参考にして頂ければと思います。

スポンサーリンク



posted by 勉三 at 21:46 | Comment(0) | TrackBack(0) | IT

2019年01月12日

プログラミングに向いている人の特徴

 ども勉三です。プログラミングに向き不向きはあるのか?というテーマはよく議論されます。まあ当たり前ですが、世の中の他のあらゆるものと同じで向き不向きはあるでしょう。もちろん誰でも環境や教材が整えば一定レベルにはできるようになるでしょうけどね。しかしそこから上となると向き不向きは当然あるでしょう。

 勉三はこれまでプログラミングのスキルが素晴らしい人に沢山会ってきました。それはいわゆるシステム屋さんだけでなく、大学や企業の研究所で解析目的にコードを書いている人、ベンチャーを立ち上げてウェブサービスやアプリをがんがんリリースしている人など様々です。

 職種や目的は違えど、プログラミングのスキルを活かして夢を実現しているという点では皆さん共通しています。そんなスターともいえるプログラマーたちと話をしてきて、一定のパターンというか傾向があることに気づきました。今回はそんな「プログラミングに向いている人の特徴」をお伝えしたいと思います。

みな小さい時にプログラミングを始めた

 これ、あまり似たような記事で触れられていなくて意外と盲点だと思うのですが、スタープログラマはだいたい高校生までにプログラミングを始めています。高校生でも遅いぐらい。中学生、中には小学生から始めている強者も。

 勉三自身のことを話すと、中学生でプログラミングを始めました。理由はゲームが作りたかったから。ドラクエやFFのようなゲームを自分で作るのが夢でした。当時、父のPC98でBASICでプログラムが組めることを知り、こっそり内緒で使って簡単なプログラミングをしていたものです。そのパソコンは白黒だったため、カラーが使えるパソコンが欲しくて欲しくてたまらなくなり、中学一年生の時に親にねだってマッキントッシュを買ってもらいました。これが初めてのマイパソコンです。

 勉三は、プログラミングについて、音楽や囲碁将棋のように子供からやっていないとプロにはなれないものだとは思っていません。プログラミングがある程度できるようになるなら何歳からでも遅くはないと思います。ただ、現実としてプログラミングで圧倒的なパフォーマンスを発揮する人は、とにかくプログラミングがしたくてしたくてたまらなくて、自然と子供のうちから始めるのではないでしょうか。

 なお、以前に参加したどこかの学会で伺った話ですが、有名なプリファードネットワーク社の取締役の一人の方は、既に小学生時代から英語論文を読んでプログラミングをしてたりしてたそうです。これも誰に言われずともなさっていたのでしょう。中学生から始めた勉三なんてかわいい部類で、本当のトップスターともいうべき方々はレベルが違うなあと感じたのをよく覚えています。

寝食を忘れてプログラミングする

 プログラミングが好きな方は食事する時間や寝る時間も削ってプログラミングしてたという方が非常に多いです。勉三もそうですね。着手までは割と時間がかかるんですが、いったんやりはじめるとキリのいいところまで仕上げないと気持ち悪くて作業を中断できません。

 とくに設定やバグで詰まったときなんかは、四六時中ずっとその解決策の事を考えますね。寝食忘れてとはよく言ったものです。

 プログラミングって順調に行っている時って時間の3割ぐらいしか占めてないような気がします。7割はトラブルシューティング。自分の書いたコードそのもののバグだったり、あるいはライブラリのバグ、設定のミス、他のソフトやフレームワークの理解不足、などなど要因は沢山ありますが、そういったものに遭遇し解決策を考えてあれこれ試行錯誤している時間が圧倒的に長い。

 で、また一番スキルが伸びるのってそのトラブルシューティングのタイミングなんですよね。問題解決することでようやく知識が知恵になるというか。ですので他の生活を削ってでもそれに打ち込める人は、それだけでプログラミングへの適性があると思います。

新しい言語を覚え始めるや否や、いきなりコードを書き始める

 よくいると思うのですが、「よしっ、Java 勉強しよう」と思って本を一冊買ってきて、本の中のチュートリアルに沿ってコードを入力して、というのだけをして、自分で何も作らない人。

 プログラミングに向いている人は全然違います。本を読み終わる前に、チュートリアルにないプログラムを自分で勝手に作り始める。別にそれが大したものであるかどうかは重要ではありません。自分で考えて創作するというところに、それができない人との大きな壁があるような気がします。

 プログラミングは語学と同じで、本ばっかり読んでて英会話がうまくなる人はいないのと同様に、本ばかり読んでてプログラミングがうまくなった人もいません。読書は最小限にし実践あるのみです。英語で最初はへたくそでも、怖がらずにどんどん外人相手に話しかける人の方が遥かに上達しやすいのと同じですね。

最後に

 いかがでしたでしょうか? 野球選手が野球が好きで好きでたまらない少年だったとか、将棋の棋士がずっと将棋のことばっかり考えてるとかそういう話はよくありますが、プログラマーもハイパフォーマーは同じだと思います。

 とにかく本ばかり読むのは止め、実際に自分でコードを書いてみましょう。それがプログラミング上達の最大の方法です。

スポンサーリンク



posted by 勉三 at 23:22 | Comment(0) | TrackBack(0) | IT

2019年01月08日

囲碁と将棋に見る性差:戦略脳と戦術能の違い

 ども勉三です。囲碁界で小学4年生の仲邑菫(なかむらすみれ)さんが史上最年少のプロ棋士となり、日本最強の井山裕太五冠と引き分けたというのが話題になっています(「囲碁の天才少女、10歳で最年少プロに。名人も手腕評価」)。将棋の藤井聡太氏もそうですが、天才の登場は俄然その競技を盛り上げますよね。みんなそれだけスターの登場に飢えているのかもしれません。

 ところで、しばしば話題になるのが、こうしたボードゲームに見られる男女差。将棋などは特に顕著で今のところプロ棋士として合格した女性は一人もいません(ここでのプロ棋士はいわゆる女流棋士を含まないものです)。一方、囲碁でも男性が圧倒的に多いですが、女性の棋士もいらっしゃいます。

 なお、将棋で女流棋士というと通常のプロとは別枠で採用され、単なる女性棋士という意味ではなく特別な枠のことを指しますが、囲碁で女流棋士というと女性の棋士のことで、この辺の呼称にも違いがあるようです。勉三も調べていて勉強になりました。

 ただ、性差に関しては「将棋は男性のものという風潮が強かったので、興味を持つ女性が絶対数として少なかったためであり、能力に性差はない」と主張する人もいます。これについて勉三の考えを書いていきます。

脳も身体の一部。体を動かすスポーツと同様に能力の性差はある

 勉三の見解は、将棋や囲碁は脳を使うスポーツ。使う部分が違うだけで、他のスポーツと基本的には同じと考えます。ですので、身体能力に男女差があるように、脳にも男女差があると考えるのはごく自然ではないでしょうか。

 これは男性の方が優れているという意味ではありません。例えば、腕力でいえば男性の方が強いですが、柔軟性などは女性の方が優れていることが多いでしょう。性別による向き不向きもあるということです。

 そう考えると、将棋のように同じ土俵で戦って、女性が男性と肩をならべてプロになるのは難しい競技があるというのもそう不思議なことではありません。例えばプロ野球なんかは、男女混同にしたら女性はプロになれないでしょう。

将棋と囲碁で男女比が違うのは何故か?

 ここで新たな疑問として「ボードゲームでも性差があるのは分かったが、なぜ将棋と囲碁とでそこまでプロレベルの男女比が違うのか」という問題が生じます。これについては、もちろん伝統的に将棋はどちらかといえば男性が中心の庶民的なゲームであったという事情も寄与はしているでしょうけど、どちらかといえば二次的な要素だと思います。例えば、研究や文学だって最初は男がするもので、女性がしていたら眉をひそめられる時代もあったでしょう。しかし、元々の能力に絶対的な性差がなければ、必ずトップクラスになる女性は出てくるものです。

 勉三が考えているのは、将棋と囲碁のゲーム性の違いです。将棋は戦術的、囲碁は戦略的要素が強いと考えます。戦術的要素というのは、要は将棋で言えば詰将棋の能力などが代表例です。確実に頭の中で駒を何回も動かして理詰めで推論する力のことです。これは男性の方が圧倒的に強いのではと思います。

 一方で、戦略的要素というのは、将棋で言えば全体を見据えた駒組だとか、囲碁で言えば細かい地ではなく全体の勢力や布石など、理詰めというよりは全体の俯瞰力や直感に支えられている部分ですね。こちらも傾向としては男性の方が強いのだとは思いますが、戦術的要素ほどは男女差は無いと思います。

 同じボードゲームでもこの性質の違いが、プロクラスの男女比になって表れているのではと、仮説レベルですが勉三は考えています。

 なお、将棋の親戚に見えるチェスでも、男女差は将棋ほどではなく、女性のグランドマスターもいますし、女性の愛好者も多いのです。これも「戦術的要素」vs「戦略的要素」のフレームワークで考えることができるでしょう。チェスは中盤以降駒が少なくなり、必然手の連続による即積みというのが少なくなってくるので、より戦略的要素の強いゲームだと思います。この点、むしろチェスは将棋より囲碁に性格の近いゲームなのかもしれません。

スポンサーリンク



posted by 勉三 at 20:25 | Comment(0) | TrackBack(0) | 時事