独学Common Lisp

線形代数ライブラリの準備

概要

LISPは人工知能用に開発されたため、記号処理は非常に得意な分野ですが、近年の人工知能は機械学習に見られるように大量のデータを流し込んで一定の傾向(相関)を発見することで、将来を予測したり、新しいデータを分類・判断したりすることが多いです。

しかし、実用における人工知能の急速な発展とは裏腹に、経済学的な見地からはそのような「単なる相関を見つけ出す」だけの作業は軽視されがちです。相関関係は因果関係と異なり、ある変数を操作すると別の変数が動くという関係かどうかまでは分からず、ある変数とある変数が同時に動く傾向があるということしか分からないからです。これでは、例えば行動の変化を起こしたり、政策を打ったりするための合理的なエビデンスとはなり得ません。

人工知能、機械学習のライブラリは充実しつつありますが、他方、基本的な統計、あるいは数学の考え方が軽視されがちです。実際にビッグデータを手に入れることができるのはごく少数の企業であり、経済的な分析には集計された統計情報を利用するしかありません。

「Basic Linear Algebra & Statistics」ではそのような観点から、統計及び数値計算の最も基礎的な部分をCommon Lispを通じて学ぶことに主眼を当てます。

線形代数ライブラリ: BLAS & LAPACK

さて、数値計算の世界には、デファクトスタンダードになっているライブラリがあります。BLASLAPACKです。いずれもFortranで記述されており、線形代数を扱うPythonのNumpy(Scipy)や統計専門ソフトウェアRからも参照できるようになっています。

Common LispにはCommon Lispだけで行列計算などができるライブラリもありますが、実用で使う場合はBLASとLAPACKを使うことを推奨します。BLASには参照実装とより最適化された実装が複数存在し、高速な処理が必要になった時に取るべき対処法があります。Fortranはソースコードを最適化しやすく、高速な線形代数ライブラリには様々な最適化が施されています。巨人の肩の上に乗ることはとても重要です。

BLASとLAPACKはFortranで記述されていますから、自分でコンパイルする場合はFortranのコンパイラが必要です。macOSやLinuxではGCCにgfortranが含まれているのでコンパイルしやすいですが、Windowsでは難しいかもしれません。VirtualBoxなどで仮想化し、Linuxを動かした上でインストールする方が簡単でしょう。

BLASとLAPACKは各自の環境に合わせてインストールしてください。

ライブラリ管理ツール: Quicklisp

Common Lispには歴史があるので、様々なライブラリが存在しています。しかし、ある程度メンテナンスされていて、きちんと依存関係を解決してコンパイルできるライブラリは多くありません。

現在、適切にロードできることが保証されるライブラリを管理する方法としてデファクトスタンダードになっているのがQuicklispです。Minimum Common Lispで説明したASDFの上に構築されており、依存関係に基づいてライブラリを自動的にダウンロードしてくれます。また、QuicklispでダウンロードしたライブラリはQuicklispを通じてロードすることができます。

Quicklispの使い方はトップページに掲載されていますので、quicklisp.lispをダウンロードして自分の処理系でインストールしてください。その上で、LLA(Lisp Linear Algebra)をインストールしてください。

(ql:quickload :lla)

LLAは非常に簡素な設計のBLAS & LAPACKバインディングライブラリです。全ての行列計算をカバーするのではなく、転置や要素毎の計算はcl-num-utilsが担当しており、:llaを読み込むことで自動的にロードされます。:cl-num-utilsライブラリはclnu:というニックネームで、:llalla:でアクセスできます。

Common LispにおけるBLAS & LAPACKバインディングは複数存在しますが、LLAは簡素な設計になっていてあまりメンテナンスが必要なく、安定して利用できることと、Common Lispにおける著名な機械学習ライブラリであるMGL及びその行列ライブラリMGL-MATで使われているため、基礎的な線形代数計算よりも先のことをする場合に移行が容易だからです。ただし、このコンテンツで扱う回帰分析については多変量回帰にも対応する行列ベースの最小二乗法フィッティングが用意されているので、LLAを主に使います。

LLAはCommon Lispのmatrixを直接扱いますが、MGL-MATは独自の行列作成関数を用います。ただし、MGL-MATはグラフィックボードを用いた高速な行列演算にも対応しており、行列内の要素は常に数値である必要があります。より高速な演算を必要とする場合はMGL-MATの使用を検討してください。(ただし、本コンテンツでは説明の対象外とします。)


Copyright © 2017- satoshiweb.net All rights reserved.