行列システム 答えはここにある

行列でできるシステム解析

数学的な集合を基盤とする内部のテクノロジーにより解析を数式で直感的に表現できます。
また、自動化やソフト資産を駆使した小規模のソフトウェアパッケージの開発・販売も承っています。

概要

OpenAI か? 数式か?

ChatGPT4が話題になり、OpenAIやChatGPTの夢の世界を追いかけるのに少々疲れているこの頃ですが、いかがお過ごしでしょうか?
ChatGPTは夢のような技術である一方で、数学的な論理に弱く、リアルの物理的な世界との距離感がまだあります。
今回、物理的なリアルな世界を補完する手段として数学的な言語処理をして解析を手助けするAPIを開発しました。

プログラムを可能な限り数式表現に近い表現で書けるようにすることで数式による理論化とその実装をスムーズにします。
数式表現に近い記述であるため、ソースコードだけでなく、latex形式の出力もできます。

当システムは、数学的な命題を記述すると解が得られるシステムとして設計されており、解法は自動選択されます。
つまり、問題を設定するとそこに解があることを目指したシステムといえます。
数式表現としては、集合、行列、そして、微分などの作用素に強いシステムとなっています。また、強力なマクロで解析解を取得する方式で機能の実現をします。

行列は私たちの周りのいたるところにあり、物理学のみならず、論理問題、人工知能、経路問題などさまざまな領域の分析に役立ちます。
そして、行列を通じて、さまざまな事実や真実を発見することができます。
残念ながら、この短いコーナーでは行列の全てを説明することはできないため、APIの使用を通じて理解を深めていただきたいと思います。

本システムの特徴

本システムでは、集合形式で表現する特徴があります。可能な限り解析解を求めて式を返す特徴があります。
行列で正規化して解く処理に強いです。
例えば、ベイジアンネットワークは線型、ニューラルネットワークは弱非線型が一般的です。
また、Deep learningでは、正規化線形関数と交差エントロピー誤差関数を使うのが一般的です。
これらは集合や行列形式で統一的に表現することができますので、システムの目標としてそのようなものをまとめて解くような構造となっております。

チュートリアル

式の評価にはEVAL(f(x))を用います。通常はeval(f(x))は定数を返します。

EVAL(sin(0) + 5)
5 // 結果

本システムではeval(f(x))の内部に変数が含まれていても構いません。数式は数式として評価されます。

EVAL((1 + 5) * sin(x) + 6)
((6 * Math.sin(x)) + 6) // 結果

陰形式の式の場合は次のようにSOLVEを用いて解きます。

SOLVE(10 * x + 18 = 8, x)
-1 // 結果

こちらも同様に変数が含まれていても構いません。数式は数式として評価されます。

SOLVE(10 * x + a = 8, x)
(0.1 * (8 - a)) // 結果

連立方程式であれば、行列とベクトルを使います。

SOLVE(MATRIX([[1,2],[3,5]]) * x = VECTOR([1,2]), x)
[-1, 1] // 結果

もちろん、行列やベクトルなどにも変数を指定することができます。

SOLVE(MATRIX([[a,2],[3,5]]) * x = VECTOR([1,2]), x)
[((5 * (1 / ((a * 5) + -6))) + (-4 * (1 / ((a * 5) + -6)))), ((-3 * (1 / ((a * 5) + -6))) + ((a * 2) * (1 / ((a * 5) + -6))))] // 結果

微分を記述することもできます。微分作用素Dを用いて sin(x) をxで微分してみます。

D(sin(x), x)
Math.cos(x)

もう少し複雑な微分をしてみます。

D(sin(cos(x)) + pow(x, 2), x)
(((-1 * Math.cos(Math.cos(x))) * Math.sin(x)) + (2 * x)) // 結果

ラプラス変換をしてみましょう。ここで関数をfとし、tで微分してみます。

LAPLACE(D(f, t)))
(f * s) // 結果

もっと複雑なラプラス変換をしてみましょう。

LAPLACE(D(D(f, t),t) + sin(t))
((f * Math.pow(s, 2)) + (1 / (Math.pow(s, 2) + 1)))  // 結果
(a1 + a2) * (b1 + b2)

微分

D(f(x), x)形式で微分式を取得します。

ラプラス変換

LAPLACE(f(t), t, s) 形式でラプラス変換を取得します。

複素数

COMPLEX([x, y]) 形式で x + i y の複素数を生成します。

COMPLEX([10, 20])

複素数の加算や減算

COMPLEX([a, 20]) + COMPLEX([5, 20]) - COMPLEX([10, 4])

ベクトル

VECTOR([v1, v2, ...]) 形式でベクトルを生成します。疎のベクトルであれば、SPARSE_VECTOR([[p1, v1], [p2, v2], ...]) 形式で位置と値を指定します。

行列

MATRIX([[v11, v12, ...], [v21, v22, ...], ...]) 形式で行列を生成します。疎行列であれば、SPARSE_MATRIX([[px1, py1, v1], [px2, py2, v2], ...]) 形式で行、列、値を指定します。

集合

10以下の正の整数の集合は次のように指定します。

SET(x, where(x is uint && x <= 10))

区間で指定する場合は、例えば、-10以上、10以下の整数であれば、次のように指定します。

SET(x, where(x is int && x >= -10 && x <= 10))

2変数の集合であれば、例えば、2つの10未満の正の整数の集合は次のように指定します。この場合、xとyは独立変数となりますので組み合わせは100通りとなります。

SET(x, y, where(x is uint && x < 10 && y is uint && y < 10))

2変数で従属変数であれば、例えば、1つの配列に2変数の値を含める書き方をします。

SET(x, y, where(let i && i is uint && i < 3 && v = [[0, 1], [2, 3], [4, 5]] && x = v[i][0] && y = v[i][1]))

2変数で円のような関数で表される集合であれば、配列の代わりに関数を指定します。

SET(x, y, where(let i && i is uint && i < 360 && x = cos(PI / 180) && y = sin(PI / 180)))

2変数で三角形の領域を指定する場合は次のような不等式で表します。

SET(x, y, where( x is uint && y is uint && x + y < 10 ))

グラフ行列

集合Sから有向グラフの接続行列を作成します。集合の第一フィールドが行、第二フィールドが列です。

ADJACENCY_MATRIX(S)

例えば、次のような集合の結合リストからグラフ行列を作成します。

ADJACENCY_MATRIX(SET(n,m,v, where(let rows && let i && rows = [[0, 1], [1,2], [2,3]] && i is uint && i < 3 && n = rows[i][0] && m = rows[i][1] )))

集合Sから無向グラフの接続行列を作成します。集合の第一フィールドが行、第二フィールドが列です。

CO_ADJACENCY_MATRIX(S)

集合Sから接続行列を生成する方法です。

INCIDENCE_MATRIX(S) : 

集合Sから次数行列を生成する方法です。

DEGREE_MATRIX(S)

集合Sからラプラシアン行列を生成する方法です。

LAPLACIAN_MATRIX(S)

区間演算

API

  • expr[expr] : 要素アクセス
  • SET(...) : 集合 SET(x, y, where(x is uint && y is uint && x <= 10 && y <= 10) )
  • SUM(x) : 集計
  • COUNT(x) : 要素数
  • D(f(x)) : 微分 ex) D(2 * sin(x), x)
  • INTEGRATE(f(x,..), S): 積分
  • LAPLACE(f(x), x): ラプラス変換
  • SOLVE(f(x) = 0): 解を求める 制約条件を含む場合 SOLVE(f(x) = 0 && g(x) > 0 && ...)
  • EVAL(f(x)): 式を評価する (変数が未定の場合は変数を残す)
  • VARIABLES(f(x)) : 式の内部の変数を取得する
  • BIND(...) : 式に値や式をバインドする。 ex) BIND(f(x, y), x = g(t), y = h(t))
  • BINDV(...) : 式にベクトルの要素や式の集合をバインドする。 ex) BINDV(f(x), x = v[i], i >= 0, i <= v.length)
  • COEFFICIENT(...) : 係数
  • QUASI(...) : 非多項式部
  • EXPONENT(...) : 多項式の指数(式を返す)
  • COLLECT(...) : 多項式の項をまとめる
  • FLATTEN(f(x)) : 式の平坦化。再帰的に平坦化しません。ex) FLATTEN(x * (y * z)) => x1 * y * z
  • DNF(f(x)) : 選言標準形 (disjunctive normal form, DNF)への変換
  • FIELDS(set) : 集合のフィールド一覧を取得する
  • WHEREEXPR(set) : 集合の条件式を取得する
  • CHECK(set, expr) : 集合をチェックする。 ex) EXISTS(SET(x, name is "test"), EXISTS(name is "test"))
  • ADJACENCY_MATRIX(S) : 有向グラフの接続行列
  • CO_ADJACENCY_MATRIX(S) : 無向グラフの接続行列
  • INCIDENCE_MATRIX(S) : 接続行列
  • DEGREE_MATRIX(S) : 次数行列
  • LAPLACIAN_MATRIX(S) : ラプラシアン行列
  • INVERSE(M): 逆行列、あるいは、逆作用素
  • TRANSPOSE(M) : 転置行列
  • DET(M) : 行列式
  • DIAG(V) : 対角行列
  • IDENTITY(a) : 単位行列
  • MOVE(m, N, M) : 行列を (N,M)方向に移動する。 ex) MATRXI([[...],[...],...]) + MOVE(SPARSE_MATRIX([[...],...]))
  • CLIP(m, x, y, cx, cy) : 行列を一部切り出す
  • POLYGON(p, x, y) : 多角形をポイントから作成する(集合に変換されます)
  • POLYHEDRON(p, x, y, z) : 多面体をポイントから作成する(4(=3+1), 5(=4+1), 6(=3+3), 8(=4+4)) (集合に変換されます)
  • RANGE_SET(x, range1, range2, ...) 区間の集合を定義します。 ex) RANGE_SET(x, [1,2], [3,4])
  • POINT_SET(x, y, point1, point2, ...) 点の集合を定義します。 ex) POINT_SET(x, y, [1,2], [3,4])
  • RECT_SET(x, y, rect1, rect2, ...) 矩形の集合を定義します。 ex) RECT_SET(x, y, [1,2,3,4], [5,6,7,8])
  • BOX_SET(x, y, z, box1, box2, ...) ボックスの集合を定義します。 ex) BOX_SET(x, y, z, [1,2,3,4,5,6], [2,3,4,5,6,7])
  • DISCRETIZE(S): 集合を離散化します。 ex) DISCRETIZE(SET(x, where(x is uint && x <= 5)))
  • SQL(query) : SQLの文字列から集合を作成します。 ex) SQL("SELECT x, y FROM points WHERE id = 10")
  • PHP(code) : PHPの文字列から集合を作成します。(有償版で公開予定)
  • JS(code) : JavaScriptの文字列から集合を作成します。(有償版で公開予定)
  • VB(code) : Visual basicの文字列から集合を作成します。 (有償版で公開予定)
  • NATURAL(text) : 自然言語から集合を作成します。 (有償版で公開予定)
  • SIGMOID_FUNCTION(y) : シグモイド関数
  • ReLU(u) : 正規化線形関数
  • CROSS_ENTROPY_FUNCTION(p, q) : 交差エントロピー誤差関数
  • MAE(x1, x2, i) : Mean Absolute Error
  • MSE(x1, x2, i) : Mean Squared Error
  • RMSE(x1, x2, i) : Root Mean Squared Error(二乗誤差)
  • RMSPE(x1, x2, i) : Root Mean Squared Persentage Error
  • RMSLE(x1, x2, i) : Root Mean Squared Logarithmic Error
  • + : 加算
  • - : 減算
  • * : 乗算
  • / : 除算
  • sin(x)
  • cos(x)
  • tan(x)
  • cot(x)
  • sec(x)
  • csc(x)
  • asin(x)
  • acos(x)
  • atan(x)
  • sinh(x)
  • cosh(x)
  • tanh(x)
  • coth(x)
  • asinh(x)
  • acosh(x)
  • atanh(x)
  • sqrt(x)
  • pow(x, y)
  • log(x)
  • log10(x)
  • log2(x)
  • greatest(x)
  • least(x)
  • degree(x)
  • radians(x)
  • abs(x)
  • floor(x)
  • ceil(x)
  • exp(x)
  • round(x)
  • sign(x)
  • if(c, x, y)
  • RE(c) : 複素数の実部
  • IM(c) : 複素数の虚部
  • CONJUGATE(c) : 複素数の共役
  • ARG(c) : 複素数の角度
  • matrix([[...],[...]]) : 行列
  • complex([x, y]) : 複素数
  • vector([...]) : ベクトル
  • sparse_matrix([[...],[...]]) : 疎行列
  • sparse_vector([...]) : 疎ベクトル
  • range(min, max) : 区間型 (最小値と最大値を保証するのではない)
  • progn(....)
  • let(...)
  • set(...)
  • E : 自然対数
  • PI : 円周率
  • GOLDEN_RATIO : 黄金比
  • GOLDEN_ANGLE : 黄金角
  • EULER_GAMMA : オイラー数
  • INF : 無限
  • expr && expr : 論理積
  • expr || expr : 論理和
  • !expr : 論理否定
  • expr1 in expr2 : expr1がexpr2の中の1つの要素と一致する
  • !(expr in expr) : expr1がexpr2の中の要素と一致しない
  • expr < expr
  • expr <= expr
  • expr > expr
  • expr >= expr
  • expr = expr
  • expr != expr
  • expr is bool : 論理型
  • expr is float : 実数型
  • expr is int : 整数型
  • expr is uint : 正数型
  • expr is string : 文字列型
  • expr is complex : 複素数型
  • expr is vector : ベクトル型
  • expr is sparse_vector : 疎ベクトル型
  • expr is matrix : 行列型
  • expr is sparse_matrix : 疎行列型
  • expr | expr : ビットOR
  • expr & expr : ビットAND
  • expr ^ expr : ビットXOR
  • ~expr : ビットNOT
  • expr >> expr : ビット右シフト
  • expr << expr : ビット左シフト

APIサービス

メールで直接案内させていただきました特別なお客様向けの有料サービスとなります。クラウドファンディング向けサービスは内容が若干異なったものとなります。

料金システム

  • 月間ライセンス 1ユーザ使用 1万円 / 月
  • 年間ライセンス 1ユーザ使用 10万円 / 年

(今後機能拡張に伴い価格が変動する可能性がございますが、 ベータ版の時点で年間ライセンスをお買い上げのお客様には本サービスが持続する間、同じ料金での提供となります。)

JWT

GET /api/mjs2js : 数式からJavaScriptのコードを生成します。

  • username: ユーザ名を指定します
  • token: APIキーを指定します
  • code: 入力する数式を指定します

GET /api/mjs2tex : 数式からlatexのコードを生成します。

  • username: ユーザ名を指定します
  • token: APIキーを指定します
  • code: 入力する数式を指定します

出力の正確さについては、ChatGPTよりは精度が高いが、内容の正確さを保証するほど網羅的ではないという段階です。分析作業を効率化する程度のものであるという位置付けでの利用で、重要なシステムの制御などには使わないようお願いします。内容の正確さについては免責とさせていただきます。

参考文献