絵の描き方 3: 行列の掛け算

ストリング図:

  • 行列の掛け算は反図式順なので、右から左に描いてみた。

行列の掛け算:

  • $`a\in X`$ と $`c\in Z`$ を固定して、$`h`$ の $`c`$行$`a`$列成分 $`h(c\leftarrow a) = h_a^c`$ を計算する。
  • 赤いグニョグニョ矢印に沿って、$`y\in Y`$ を同時並行に走らせる。
  • $`y`$ ごとに積 $`f[c\leftarrow y]\, g[y\leftarrow a]`$ を計算
  • 積を全部足す i.e. 積和の計算

ストランド図:

  • $`a\in X`$ から出るストランドと、$`c\in Z`$ に入るストランドが、$`Y`$ 上でうまく繋がるかを見る。
  • 赤いグニョグニョ矢印に沿って、$`y \in Y`$ を走らせる。
  • $`y`$ ごとに、ストランドが中継されているかを見る。
  • ブーリアン係数なら、$`y`$ の左右にストランドがあれば、その時点で値 1 として終わってよい。

数式:

  • 図を写し取っただけ。
  • ブーリアンなら、論理の普通の書き方で $`h(a, c) \equiv \exists y\in Y.\, f(a, y)\land g(y, c)`$
  • 関係の話なら、$`f`$-関係と$`g`$-関係を仲介する誰かがいれば、$`h`$-関係にある。「友達の友達は友達だ」論法。


  1. 絵の描き方
  2. 絵の描き方 2: 基本の描画法
  3. 絵の描き方 3: 行列の掛け算
  4. 絵の描き方 4: テンソルの縮約

絵の描き方 2: 基本の描画法

絵の描き方」の続き、あるいは詳細化。絵の実例を付ける。いつも思うのだが、

  • なんで描かないの?

ベン図が基本:

  • 集合はひろがり
  • 要素は一点

風船図:

  • 集合(ひろがり)がいくつか集まっている。
  • “集まり方”は、直和もあれば、合併もある。
  • 集まりのメンバーにラベル〈インデックス | 添字 | カラム名 | ディクショナリのキー | 引数変数名 | etc.〉が付いていることがある。
  • ファミリー、バンドル、シグマ型など

線分図:

  • ひろがりを最小の次元で表すなら1次元線分
  • 要素は線分上の一点
  • ラベルは線分の名前
  • 線分の向きは便宜上で、実際は向き概念は無いかも知れない。

多次元キューブ/多次元空間:

  • 線分を座標軸だと思う。
  • メンタルには直交座標
  • 3本の軸までは可視化可能
  • 空間は直積集合、一点はタプル、図形は部分集合

ストランド図:

  • ストランド〈紐〉は mapsto を表す。
  • 関数以外では、同一点から複数のストランドも、ストランド無しも許す。
  • 多次元キューブの一点が、一本のストランドに対応
  • 多次元キューブ内の図形は、ストランドの集合=関係 に対応
  • 2次元のひろがりを1次元に潰して描くとコンパクトに描け、使用可能な次元を捻出できる。

ストリング図:

  • ボックス〈ノード〉は関数、関係、テンソルなど。
  • 多次元キューブ内の図形と対応している
  • 脚は座標軸の直線だと思ってよい。直積に組んではなくて、ラベル付き直和のまま。
  • 次元を潰す操作は、脚のバンチ〈一括 | まとめる〉操作。

関数、関係、テンソルなどの計算はどう描くか? → 絵の描き方 3: 行列の掛け算


  1. 絵の描き方
  2. 絵の描き方 2: 基本の描画法
  3. 絵の描き方 3: 行列の掛け算
  4. 絵の描き方 4: テンソルの縮約

トピック 6: 累乗、順列、階乗

$`X, Y`$ を集合として、次のような記法を使う。$`\newcommand{\mrm}[1]{\mathrm{#1} }`$

  • $`\mrm{Map}(X, Y)`$ : $`X`$ から $`Y`$ へのすべての写像の集合
  • $`\mrm{InjMap}(X, Y)`$ : $`X`$ から $`Y`$ へのすべての単射写像の集合
  • $`\mrm{BijMap}(X, Y)`$ : $`X`$ から $`Y`$ へのすべての双射〈全単射〉写像の集合

$`N, R`$ は有限集合として、その基数〈cardinality〉は小文字 $`n, r`$ とする。

$`\quad \mrm{card}(N) = n\\
\quad \mrm{card}(R) = r
`$

このとき:

  1. $`\mrm{card}(\mrm{Map}(R, N)) = n^r`$
  2. $`\mrm{card}(\mrm{InjMap}(R, N)) = n^{[r]} = {_n P_r}`$
  3. $`\mrm{card}(\mrm{BijMap}(N, N)) = n!`$

$`\mrm{Two}`$ を二元集合として、$`\mrm{Pow}(X) \cong \mrm{Map}(X, \mrm{Two})`$ だから、

  • $`\mrm{card}(\mrm{Pow}(N)) = \mrm{card}(\mrm{Map}(N, \mrm{Two})) = 2^n`$

絵の描き方

抽象的な概念に対してメンタルモデルを作るには、絵を描いたり簡単で親しみやすい事例を見つけたりする。現在の数学における概念的事物は、集合と写像から構成されるから、集合と写像を絵に描く技法は重要。とはいえ、特に変わったやり方があるわけでもなく、みんな知っているだろう。

だがしかし、「みんな知っているはずの基本的なことが実際には忘れられがち」という逆説的事態もある。

  1. ベン図
    1. 集合は広がり(面積を持つ領域)
    2. 要素は点
    3. 写像は矢線
  2. 線分図
    1. 集合は線分
    2. 要素は線分上の点(有限集合ならパラパラな点でよい)
    3. 直積は四角形や直方体(有限集合なら格子でよい)
    4. 写像は矢線〈ストランド | 紐〉
  3. 関数・関係のグラフ
    1. 集合は線分や直線
    2. 直積は四角形や平面
    3. 直積の部分集合がグラフ
  4. 列挙(絵じゃないけど)
    1. 有限集合が域の関数なら、値を全部列挙
    2. 有限集合の直積が域の関数なら、テーブル形式で値を全部列挙
    3. 有限集合のあいだの関係なら、マルバツ・テーブル形式
    4. 有限集合のあいだの関係なら、ペアを全部列挙
    5. 有限集合の自己関数/自己関係なら有向グラフがみやすい


  1. 絵の描き方
  2. 絵の描き方 2: 基本の描画法
  3. 絵の描き方 3: 行列の掛け算
  4. 絵の描き方 4: テンソルの縮約

置換、リネーム、アルファ変換

この記事は書きかけ、書き上がったら本編に投稿してここからは削除。

モノ達を1:1に置き換えることが置換です。モノが名前だとすれば、置換は名前達をリネームすることになります。項・式のなかに登場する名前達を系統的にリネームすることがアルファ変換です。$`\newcommand{\mrm}[1]{\mathrm{#1}}
\newcommand{\cat}[1]{\mathcal{#1}}
\newcommand{\pipe}{\mid }
\newcommand{\ccol}[1]{\boldsymbol{#1} }
%\newcommand{\msf}[1]{\mathsf{#1}}
\newcommand{\twoto}{\Rightarrow }
\newcommand{\In}{\text{ in } }
%\newcommand{\Imp}{ \Rightarrow }
\newcommand{\Iff}{\Leftrightarrow }
\newcommand{\hyp}{\text{-} }
\newcommand{\op}{\mathrm{op} }
%\newcommand{\id}{\mathrm{id} }
%\newcommand{\pto}{ \supseteq\!\to }
\newcommand{\u}[1]{\underline{#1}}
\newcommand{\cpal}[1]{\mathfrak{#1} }
%\newcommand{\msc}[1]{\mathscr{#1}}
`$

内容:

置換の亜群

有限集合のあいだの同型射〈可逆写像 | 双射 | 全単射〉を置換〈permutation〉と呼ぶことにします。

$`\quad f \text{ が置換 }\Iff (f :X \to Y \In {\bf FinSet}) \;\land\; f \text{ は同型}`$

$`X = Y`$ の場合だけを置換と呼ぶことも多いですが、ここでは、$`X`$ と $`Y`$ が違う有限集合でもいいとします。

例えば、$`X = \{1, 2, 3\}, Y = \{a, b, c\}`$ で、$`f`$ が次のような対応であるとき、$`f`$ は置換です。

$`\quad 1 \mapsto c\\
\quad 2 \mapsto b\\
\quad 3 \mapsto a
`$

もちろん、$`f`$ の域と余域が同じでもかまいません。次は、$`X = Y = \{1, 2, 3\}`$ である置換の例です。

$`\quad 1 \mapsto 3\\
\quad 2 \mapsto 2\\
\quad 3 \mapsto 1
`$

特別な置換として、何もしない置換があります。例えば:

$`\quad 1 \mapsto 1\\
\quad 2 \mapsto 2\\
\quad 3 \mapsto 3
`$

すべての有限集合達を対象類(類〈class〉は大きな集合)として、置換を射とする圏を構成できます。この圏を $`{\bf Perm}`$ と書きます。圏 $`{\bf Perm}`$ のすべての射は可逆〈同型〉です。すべての射が可逆である圏を亜群〈groupoid〉と呼ぶので、$`{\bf Perm}`$ は亜群です。よって、$`{\bf Perm}`$ を置換の亜群〈groupoid of permutations〉と呼びます。

亜群 $`{\bf Perm}`$ は、有限集合の圏 $`{\bf FinSet}`$ の部分圏です。

$`\quad {\bf Perm} \subset {\bf FinSet} \In {\bf CAT}`$

$`{\bf CAT}`$ は必ずしも小さくない圏達の2-圏です(が、気にしなくもいいです)。

関数のプロファイル記述

関数のプロファイル(入力と出力の仕様)を次のように書くことにします。

$`\quad f: (a: {\bf N}, b: {\bf R}, c:{\bf R}) \to {\bf R}`$

これは単に仕様を書いた(宣言した)だけで、関数 $`f`$ を定義はしていません。定義は、例えば型付きラムダ計算の構文を使えば次のようになります。

$`\quad f := \lambda\, (a: {\bf N}, b: {\bf R}, c:{\bf R}).(\, (b + c)^a \; \in {\bf R}\,)`$

関数のプロファイルの記述では、仮引数名〈formal parameter name〉(今の例では $`a, b, c`$)は不要です。次のプロファイル宣言でも先と同じことです。

$`\quad f: ({\bf N}, {\bf R}, {\bf R}) \to {\bf R}`$

しかし、多くのプログラミング言語では仮引数名も付けます。また、型付きラムダ計算の構文では、仮引数名〈ラムダ変数名〉がないと関数の定義が書けません。

ここでは、「プロファイル宣言でも関数定義でも仮引数名を付けるがリネームしてもよい」というルールを採用します。先の仮引数名 $`a, b,c `$ はリネームしてもよいので、以下のようなプロファイル宣言と関数定義をしても(内容的には)同じことになります。

$`\quad f: (n: {\bf N}, x: {\bf R}, y:{\bf R}) \to {\bf R}\\
\quad f := \lambda\, (n: {\bf N}, x: {\bf R}, y:{\bf R}).(\, (x + y)^n \; \in {\bf R}\,)`$

リネーム

前節の仮引数名のリネームは、次のような置換 $`\sigma`$ です。

$`\quad \sigma: \{a, b, c\} \to \{x, y, n\} \In {\bf Perm}\\
\qquad a \mapsto n\\
\qquad b \mapsto x\\
\qquad c \mapsto y
`$

この置換〈リネーム〉 $`\sigma`$ により、最初の($`a, b, c`$ を使った)定義を書き換えました。

$`\tau`$ を別な置換だとします。

$`\quad \tau: \{a, b, c\} \to \{x_1, x_2, x_3\} \In {\bf Perm}\\
\qquad a \mapsto x_3\\
\qquad b \mapsto x_1\\
\qquad c \mapsto x_2
`$

この置換〈リネーム〉 $`\tau`$ により書き換えて、関数のプロファイル宣言と定義を書いてみると以下のようです。

$`\quad f: (x_3: {\bf N}, x_1: {\bf R}, x_2:{\bf R}) \to {\bf R}\\
\quad f := \lambda\, (x_3: {\bf N}, x_1: {\bf R}, x_2:{\bf R}).(\, (x_1 + x_2)^{x_3} \; \in {\bf R}\,)`$

$`x_3`$ が仮引数リスト〈ラムダリスト〉の最初に出現するのが気持ち悪いかも知れません。が、気持ち悪いからといって何か悪いことが起きるわけでもないので、知ったこっちゃねーです。

置換〈リネーム〉は、関数プロファイルとラムダ抽象〈lambda abstraction〉に現れる仮引数リスト〈ラムダリスト〉やラムダ式に作用して、その形を変えます。我々の約束・習慣では、仮引数名のリネームで形が変わっても、内容は変わってないから同じモノとみなします。

型付き変数名の集合と型付け保存のリネーム

前節の「仮引数名をリネームしても同じモノ」をもう少し精密に考えるために準備をしましょう。

まず名前とは何でしょうか? 名前が何であるかに定義はないし、定義する必要もありません。“名前の集合”は単なる(なんでもいい)集合であり、その集合の要素を“名前”と呼ぶだけのことです。

名前の集合(つまり、なんでもいいから集合)を $`X`$ とします。$`X`$ は無限集合でもなんとかなりますが、ここでは有限集合に限定しておきます。型無しラムダ計算なら集合 $`X`$ だけで十分ですが、型付きラムダ計算のときは、名前への型の割り当て〈型付け | typing〉 $`t:X \to \cat{T}`$ も一緒に考えます。ここで、$`\cat{T}`$ は型の集合です。型とは何であるか? の詮索も今は不要です。特定された集合 $`\cat{T}`$ の要素を型と呼ぶだけです。

名前の集合 $`X`$ と型付け $`t:X \to \cat{T}`$ の組 $`(X, t)`$ が型付き変数名の集合〈set of typed variable names〉です。記号の乱用で次のように書きます。

$`\quad X = (X, t)`$

記号の乱用が嫌だという人は、$`X`$ が型付き変数名の集合だとして、次のように書けば正確です。

$`\quad X = (\u{X}, t_X)`$

正確な書き方では、$`\u{X}`$ が“型付き変数名の集合”の台〈underlying thing〉である“名前の集合”、$`t_X`$ が $`X`$ の型付けです。正確な書き方をしないとうまく記述できないこともあります。

名前が何であるかを定義しないので、変数名が何であるかも定義しません。「変数名とは変数に付けられる名前である」なんて言明はナンセンスです。変数名が指す対象物〈referent | denotation〉である“変数そのもの”なんて存在しないし、考える必要もないからです。強いて言えば、「変数名」と「変数」は同義語で、どちらも無定義(集合の要素なだけ)です。

$`X = (\u{X}, t_X), Y = (\u{Y}, t_Y)`$ が2つの型付き変数名の集合のとき、集合のあいだの置換 $`\sigma : \u{X} \to \u{Y}`$ が型付けを保存する〈preserve typing〉とは次のことです。

$`\quad \forall x\in \u{X}.\, t_Y(\sigma(x)) = t_X(x)`$

集合の要素を名前と呼んでいたので、型付けを保存する置換は型付けを保存するリネーム〈typing-preserving rename〉と呼んでもいいでしょう。

型の集合を $`\cat{T}`$ として、型付き変数名の集合を対象として、型付けを保存する置換を射とする亜群が構成できます。その亜群を $`\cat{T}\text{-}{\bf TypedPerm}`$ とします。単元集合を $`{\bf 1}`$ としたときに、次が成立します。

$`\quad {\bf 1}\text{-}{\bf TypedPerm} \cong {\bf Perm} \In {\bf GRPD}`$

ここで、$`\cong`$ は圏同型(圏同値より強い)を表し、$`{\bf GRPD}`$ は必ずしも小さくない亜群達の2-圏です。が、圏論的な背景はあまり気にする必要はなくて、「型が1つだけの『型付き』は『型無し』と同じこと」という主張を理解してください。

トピック 5

トピック 4 の続き。直積による$`r`$乗は関数集合〈function set〉だと思ってよい。$`\newcommand{mrm}[1]{\mathrm{#1}}`$

$`X \times \cdots \times X = X^r \cong \mrm{Map}(\bar{r}, X)`$

$`x\in \mrm{Map}(\bar{r}, X)`$ に対して、引数 $`i\in \bar{r}`$ を渡す書き方が下付きなだけ。

$`\text{for } i \in \bar{r}\\
\quad x_i = x(i) \;\in X`$

もし、関数〈写像〉 $`x : \bar{r} \to X`$ が単射なら、「関数の値 = タプルの成分」に重複はない。

$`\quad x \in \mrm{Map}(\bar{r}, X) \text{ が単射}\\
\iff \text{タブルとみなした } x \text{ の成分に重複がない}\\
\iff \forall i, j \in \bar{r}.\, i \ne j \implies x(i) \ne x(i) \\
\iff \lnot
\exists i, j \in \bar{r}.\, i \ne j \land x(i) = x(j)
`$

トピック 4

「一度選んだモノは選ばないとして順番に選ぶ」ことの定義として、

$`\{(x_1, x_2, \cdots, x_r) \in X^r \mid x_1\in X, x_2\in (X\setminus \{x_1\}), \cdots \}`$

これでも意図は汲めるし、間違いではないが、左から右へと時間に沿って新しい集合 $`X\setminus \{x_1, \cdots, x_i\}`$ を作っていくところがアルゴリズム的。

「一度選んだモノは選ばない」なら、選んだモノ達に同じモノは出現しない。言い方を変えると「全部違う」。「成分が全部互いに違うタプル〈リスト〉達の集まり」を書き下すと、

$`\{(x_1, x_2, \cdots, x_r) \in X^r \mid
\forall i, j\in \bar{r}.\, i\ne j \implies x_i \ne x_j \}
`$

ここで、

$`\bar{0} := \emptyset\\
\bar{1} := \{1\}\\
\bar{r} := \{1, \cdots, r\}
`$

トピック 3

何年か前に、twitter上で「確率の定義」でプチ炎上してたことがあったなぁ。

ご本人(当事者、本の著者)のツイートは削除されているようだけど、痕跡は発見。

本を写した写真を読み取ると:

  • 見出し「確率は意外と正しく理解されてない」
  • 質問: 20代女性と30代女性、結婚できる確率が高いのはどちら?
  • 答: 「結婚できる」と「結婚できない」の2つの場合があるから、年齢に関係なく当該の確率は 1/2
  • 確率というものの定義上はこのような解釈になる

似たような「確率の解釈」を2006年のブログ記事に書いたことがある。

このような「確率の解釈」が生まれるのは、

$`\quad 確率 = \frac{問題にしている場合の数}{すべての場合の数}`$

が染み付いているからだろう。

この定義が使えるのは、それぞれの場合(根本事象)が“同様に確からしい”、つまり確率分布が一様分布のときだけ。一様分布という暗黙の前提のもとでの定義を、一般的な定義だと思い込む人がいて、そのなかの一人が確率を解説する本を出版していた、と。

トピック 2

$`\newcommand{\mrm}[1]{\mathrm{#1}}T`$ も $`S`$ も整数の集合 $`{\bf Z}`$ の有限部分集合(おそらく離散区間)、そのあいだの関数の集合は、

$`\quad \mrm{Map}(T, S)`$ (有限集合)

$`S`$ は、$`{\bf Z}`$ から引き継いだ順序 $`\le`$ を持つので、次の命題は意味を持つ。

$`\quad f(t) \le g(t) \; \text{ for }f, g\in \mrm{Map}(T, S), t\in T`$

$`F\subseteq \mrm{Map}(T, S)`$ として、$`t\in T`$ を固定したときに、集合 $`\{f(t) \in S \mid f \in F\}`$ は確定する。この集合をもっと丁寧に書けば:

$`\quad \{ s\in S \mid \exists f \in F.\, s = f(t) \}`$

この集合は、全順序集合 $`S`$ の有限部分集合なので、最小値と最大値(下)を持つ。

$`\quad \mrm{min}\{f(t) \in S \mid f \in F\} \;\in S\\
\quad \mrm{max}\{f(t) \in S \mid f \in F\} \;\in S
`$

$`t \in T`$ を動かせば、次の関数〈写像〉が定義できる。

$`\quad T\ni t \mapsto \mrm{min}\{f(t) \in S \mid f \in F\} \;\in S\\
\quad T\ni t \mapsto \mrm{max}\{f(t) \in S \mid f \in F\} \;\in S
`$

これらの関数を短く次のように書く。

$`\quad \mrm{Min}_F : T \to S\\
\quad \mrm{Max}_F : T \to S
`$

$`F \in \mrm{Pow}(\mrm{Map}(T, S))`$ ($`\mrm{Pow}`$ はベキ集合)も動かすと、次の関数〈写像〉が定義できる。

$`\quad \mrm{Pow}(\mrm{Map}(T, S)) \ni F \mapsto \mrm{Min}_F \in \mrm{Map}(T, S)\\
\quad \mrm{Pow}(\mrm{Map}(T, S)) \ni F \mapsto \mrm{Max}_F \in \mrm{Map}(T, S)
`$

つまり、

$`\quad \mrm{Min} : \mrm{Pow}(\mrm{Map}(T, S)) \to \mrm{Map}(T, S)\\
\quad \mrm{Max} : \mrm{Pow}(\mrm{Map}(T, S)) \to \mrm{Map}(T, S)
`$

反カリー化してもよい。(反カリー化した関数も同じ名前を使って書いている。)

$`\quad \mrm{Min} : \mrm{Pow}(\mrm{Map}(T, S))\times T \to S\\
\quad \mrm{Max} : \mrm{Pow}(\mrm{Map}(T, S))\times T \to S
`$

$`S`$ は、$`{\bf Z}`$ から引き継いだ引き算を持つ。が、次は保証されない

$`\quad s, s'\in S \implies s - s' \in S`$

したがって、関数の引き算(二項演算)は次のような写像とみなす。

$`\quad \text{関数の引き算} : \mrm{Map}(T, S)\times \mrm{Map}(T, S) \to \mrm{Map}(S, {\bf Z})`$

$`\mrm{Max}_F`$ と $`\mrm{Min}_F`$ は、上記の意味の引き算ができるので、次の関数を定義できる。

$`\text{For }F \in \mrm{Pow}(\mrm{Map}(T, S))\\
\quad T\ni t \mapsto (\mrm{Max}_F(t) - \mrm{Min}_F(t)) \;\in {\bf Z}`$

この“最大値と最小値の差”の関数(定義より非負値)が、次の話題になる(続く)。

トピック 1

$`\newcommand{\mrm}[1]{\mathrm{#1}}f_\mrm{The}`$ は、ひとつの確定したThe・関数とする。The・関数は、離散時間変数 $`t`$ の関数で整数値を値とする。$`t`$ が走る域〈domain〉は $`{\bf Z}`$ の有限部分集合 $`T \subset {\bf Z}`$ とみなせる。したがって、The・関数は

$`\quad f_\mrm{The} : T \to {\bf Z}`$

あるいは、

$`\quad f_\mrm{The} \in \mrm{Map}(T, {\bf Z})`$

なんらかの方法で作った関数 $`g \in \mrm{Map}(T, {\bf Z})`$ を考えて、$`e \in \mrm{Map}(T, {\bf Z})`$ を次のように定義する。

$`\text{For } t\in T\\
\quad e(t) := (g(t) - f_\mrm{The}(t))^2`$

この $`e\in \mrm{Map}(T, {\bf Z})`$ を調べる(続く)。