BigDataやAIなどがアプリケーションを構成する重要部品となってきています。このBigDataやAIをアプリケーションで扱う上で重要な技術要素として行列(matrix)があります。
Kaleidoxでは行列をMatrixオブジェクトとして記述して各種行列演算をすることができます。
入力
Matrixオブジェクトの入力方法として以下の方法について見ていきます。
- Matrixリテラル
- matrix-load関数
Matrixリテラル
Matrixオブジェクトのリテラルは以下のように二重のカギ括弧で囲まれたエリアに改行と空白を区切り記号として記述したものです。
[[ 43.055248 141.345505 8.0 1158 38.254162 140.891403 11.9 1219 35.680909 139.767372 15.3 1460 35.154919 136.920593 14.9 1575 34.702509 135.496505 16.2 1400 34.377560 132.444794 15.0 1603 33.579788 130.402405 16.0 1690 26.204830 127.692398 22.4 2128 ]]
REPLから入力すると以下のようになります。
kaleidox> [[ 43.055248 141.345505 8.0 1158 38.254162 140.891403 11.9 1219 35.680909 139.767372 15.3 1460 35.154919 136.920593 14.9 1575 34.702509 135.496505 16.2 1400 34.377560 132.444794 15.0 1603 33.579788 130.402405 16.0 1690 26.204830 127.692398 22.4 2128 ]] Matrix[4x8] kaleidox> :show Matrix[4x8] ┌ ┐ │43.055248 141.345505 8.0 1158.0│ │38.254162 140.891403 11.9 1219.0│ │35.680909 139.767372 15.3 1460.0│ │35.154919 136.920593 14.9 1575.0│ │34.702509 135.496505 16.2 1400.0│ │34.37756 132.444794 15.0 1603.0│ │33.579788 130.402405 16.0 1690.0│ │26.20483 127.692398 22.4 2128.0│ └ ┘
matrix-load関数
matrix-load関数でCSVファイルの内容からMatrixオブジェクトを生成します。matrix-load関数では内容の中から自動的に行列化可能な数値部分を取り出してMatrixオブジェクトにします。
日本の都市について緯度経度と平均気温、降水量を記述したCSVファイル city.csv を用意します。
都市,緯度,経度,平均気温,降水量 札幌,43.055248,141.345505,8.0,1158 仙台,38.254162,140.891403,11.9,1219 東京,35.680909,139.767372,15.3,1460 名古屋,35.154919,136.920593,14.9,1575 大阪,34.702509,135.496505,16.2,1400 広島,34.377560,132.444794,15.0,1603 福岡,33.579788,130.402405,16.0,1690 那覇,26.204830,127.692398,22.4,2128
matrix-load関数を使うと以下のようにMatrixオブジェクトを取得することができます。
kaleidox> matrix-load file:city.csv Matrix[4x8] kaleidox> :show Matrix[4x8] ┌ ┐ │43.055248 141.345505 8.0 1158.0│ │38.254162 140.891403 11.9 1219.0│ │35.680909 139.767372 15.3 1460.0│ │35.154919 136.920593 14.9 1575.0│ │34.702509 135.496505 16.2 1400.0│ │34.37756 132.444794 15.0 1603.0│ │33.579788 130.402405 16.0 1690.0│ │26.20483 127.692398 22.4 2128.0│ └ ┘
Tableオブジェクト
TableオブジェクトからMatrixオブジェクトを取得することができます。
引き続きCSVファイル city.csv を使用します。
都市,緯度,経度,平均気温,降水量 札幌,43.055248,141.345505,8.0,1158 仙台,38.254162,140.891403,11.9,1219 東京,35.680909,139.767372,15.3,1460 名古屋,35.154919,136.920593,14.9,1575 大阪,34.702509,135.496505,16.2,1400 広島,34.377560,132.444794,15.0,1603 福岡,33.579788,130.402405,16.0,1690 那覇,26.204830,127.692398,22.4,2128
このCSVファイルをtable-load関数を使ってTableオブジェクトとして読み込みます。
kaleidox> table-load file:city.csv Table[5x8] kaleidox> :show:print ┏━━━━━━┯━━━━━━━━━┯━━━━━━━━━━┯━━━━━━━━┯━━━━━━┓ ┃都市 │緯度 │経度 │平均気温│降水量┃ ┣━━━━━━┿━━━━━━━━━┿━━━━━━━━━━┿━━━━━━━━┿━━━━━━┫ ┃札幌 │43.055248│141.345505│8.0 │1158 ┃ ┃仙台 │38.254162│140.891403│11.9 │1219 ┃ ┃東京 │35.680909│139.767372│15.3 │1460 ┃ ┃名古屋│35.154919│136.920593│14.9 │1575 ┃ ┃大阪 │34.702509│135.496505│16.2 │1400 ┃ ┃広島 │34.377560│132.444794│15.0 │1603 ┃ ┃福岡 │33.579788│130.402405│16.0 │1690 ┃ ┃那覇 │26.204830│127.692398│22.4 │2128 ┃ ┗━━━━━━┷━━━━━━━━━┷━━━━━━━━━━┷━━━━━━━━┷━━━━━━┛
Tableオブジェクトを起点にさまざまな操作を行うことができますが、ここではmatrixメソッドを使用してMatrixオブジェクトに変換しています。matrix-load関数と同様に行列化可能なデータを抽出してMatrixオブジェクト化しています。
kaleidox> .matrix Matrix[0x8] kaleidox> :show Matrix[4x8] ┌ ┐ │43.055248 141.345505 8.0 1158.0│ │38.254162 140.891403 11.9 1219.0│ │35.680909 139.767372 15.3 1460.0│ │35.154919 136.920593 14.9 1575.0│ │34.702509 135.496505 16.2 1400.0│ │34.37756 132.444794 15.0 1603.0│ │33.579788 130.402405 16.0 1690.0│ │26.20483 127.692398 22.4 2128.0│ └ ┘
参照
Matrixオブジェクトを参照して各種データを取得することができます。
準備としてcity.csvに入っているデータをMatrix化したものを変数xに束縛します。
kaleidox> setq x (matrix-load file:city.csv) Matrix[4x8] kaleidox> x Matrix[4x8] kaleidox> :show Matrix[4x8] ┌ ┐ │43.055248 141.345505 8.0 1158.0│ │38.254162 140.891403 11.9 1219.0│ │35.680909 139.767372 15.3 1460.0│ │35.154919 136.920593 14.9 1575.0│ │34.702509 135.496505 16.2 1400.0│ │34.37756 132.444794 15.0 1603.0│ │33.579788 130.402405 16.0 1690.0│ │26.20483 127.692398 22.4 2128.0│ └ ┘
行の参照
Matrixオブジェクトの行はrowメソッドで取得することができます。引数に行番号を指定します。行番号は0始まりです。
kaleidox> x.row(0) [43.055248 141.345505 8.0 1158.0]
列の参照
Matrixオブジェクトの列はcolumnメソッドで取得することができます。引数に列番号を指定します。列番号は0始まりです。
kaleidox> x.column(3) [1158.0 1219.0 1460.0 1575.0 1400.0 1603.0 1690.0 2128.0]
データの参照
Matrixオブジェクトのデータはatメソッドで取得することができます。引数に列番号、行番号を指定します。
kaleidox> x.at(2,3) 14.9
演算
準備として2✕2の正方行列を変数xに束縛します。
kaleidox> setq x [[ 1 2 3 4 ]] Matrix[2x2] kaleidox> :show Matrix[2x2] ┌ ┐ │1.0 2.0│ │3.0 4.0│ └ ┘
加算
加算は+メソッドです。
kaleidox>+ x x Matrix[2x2] kaleidox> :show Matrix[2x2] ┌ ┐ │2.0 4.0│ │6.0 8.0│ └ ┘
積算
積算は*メソッドです。
kaleidox> * x x Matrix[2x2] kaleidox> :show Matrix[2x2] ┌ ┐ │7.0 10.0│ │15.0 22.0│ └ ┘
逆行列
逆行列はinvメソッドで行います。
kaleidox> x.inv Matrix[2x2] kaleidox> :show Matrix[2x2] ┌ ┐ │-1.9999999999999996 0.9999999999999998 │ │1.4999999999999998 -0.4999999999999999│ └ ┘
ランク
行列のランクはrankメソッドで取得します。
kaleidox> x.rank 2
出力
Matrixオブジェクトの出力方法として以下の方法について見ていきます。
- matrix-save関数
- Table
準備としてcity.csvに入っているデータをMatrix化したものを変数xに束縛します。
kaleidox> setq x (matrix-load file:city.csv) Matrix[4x8] kaleidox> x Matrix[4x8] kaleidox> :show Matrix[4x8] ┌ ┐ │43.055248 141.345505 8.0 1158.0│ │38.254162 140.891403 11.9 1219.0│ │35.680909 139.767372 15.3 1460.0│ │35.154919 136.920593 14.9 1575.0│ │34.702509 135.496505 16.2 1400.0│ │34.37756 132.444794 15.0 1603.0│ │33.579788 130.402405 16.0 1690.0│ │26.20483 127.692398 22.4 2128.0│ └ ┘
matrix-save関数
Matrixオブジェクトはmatrix-save関数を使ってCSV形式でファイルに保存することができます。
第1引数に保存するファイル名、第2引数にMatrixオブジェクトを指定します。
kaleidox> matrix-save file:output.csv x t
matrix-save関数で保存したCSVファイルoutput.csvには以下のCSVが格納されます。
"43.055248","141.345505","8.0","1158.0" "38.254162","140.891403","11.9","1219.0" "35.680909","139.767372","15.3","1460.0" "35.154919","136.920593","14.9","1575.0" "34.702509","135.496505","16.2","1400.0" "34.37756","132.444794","15.0","1603.0" "33.579788","130.402405","16.0","1690.0" "26.20483","127.692398","22.4","2128.0"
Table
Matrixオブジェクトのtableメソッドで行列データをTableオブジェクトに変換することできます。表のカラム名は1からの連番となります。
kaleidox> x.table Table[4x8] kaleidox> :show:print ┏━━━━━━━━━┯━━━━━━━━━━┯━━━━┯━━━━━━┓ ┃1 │2 │3 │4 ┃ ┣━━━━━━━━━┿━━━━━━━━━━┿━━━━┿━━━━━━┫ ┃43.055248│141.345505│8.0 │1158.0┃ ┃38.254162│140.891403│11.9│1219.0┃ ┃35.680909│139.767372│15.3│1460.0┃ ┃35.154919│136.920593│14.9│1575.0┃ ┃34.702509│135.496505│16.2│1400.0┃ ┃34.37756 │132.444794│15.0│1603.0┃ ┃33.579788│130.402405│16.0│1690.0┃ ┃26.20483 │127.692398│22.4│2128.0┃ ┗━━━━━━━━━┷━━━━━━━━━━┷━━━━┷━━━━━━┛
Tableオブジェクトを起点にMatrixオブジェクトによる行列演算の結果を各種応用に利用していくことができます。
まとめ
今回はKaleidoxで行列を扱うMatrixオブジェクトについて説明しました。
Matrixの演算に加えて、CSVによる外部入出力、Tableオブジェクトとの連携を容易に行うことができます。モデル駆動開発の場合でも、BigDataやAIの応用を考えた場合、アクション言語ではドメインモデルと行列を併用してシームレスに連携できる必要があるはずです。Matrixオブジェクトはこのような応用で便利に使用できると思います。
諸元
- Kaleidox : 0.1.9