2014年10月27日月曜日

VHDLのnumeric_stdについてのメモ

久々にVHDLを使って回路を記述することになった。これまでVHDLで算術演算をするばあいにはstd_logic_unsigned、std_logic_signed、std_logic_arith パッケージを呼び出して使用していた。

だいぶ前からXILINX社のISEが作成するテンプレートファイルはnumeric_stdパッケージを使用するよう薦めてくる。 そこでnumeric_stdパッケージを使用する際の簡単な覚書をメモしておく。

 まず、numeric_stdパッケージではstd_logic_vectorを使用して四則演算や比較演算などを行うことはできない。
つまりこれまでは

use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
...
signal x : std_logic_vector(31 downto 0);
signal y : std_logic_vector(31 downto 0);
signal z : std_logic_vector(31 downto 0);
 ...
z <= x + y; -- numeric_stdではこれはできない。

のような記述ができたが、numeric_stdを使用する場合はこれができないことになる。
 必ずunsignedかsignedにキャスト(型変換)して使用する。また再度std_logic_vectorに戻すためのキャストも必要になる。

use ieee.numeric_std.all;
...
signal x : std_logic_vector(31 downto 0);
signal y : std_logic_vector(31 downto 0);
signal z : std_logic_vector(31 downto 0);
 ...
z <= std_logic_vector((unsigned(x) + unsigned(y));

unsigned、signedはnumeric_std内で以下のように定義されていてこれはstd_logic_arithの場合と同じ。

type UNSIGNED is array (NATURAL range <>) of STD_LOGIC;
type SIGNED is array (NATURAL range <>) of STD_LOGIC;

四則演算は基本的にはstd_logic_arithパッケージで定義されているものと同じだがstd_logic_arithは戻り値がstd_logic_vectorになる関数も定義しているのに対し、numeric_stdパッケージでは戻り値はsignedまたはunsignedのみである。
つまりnumeric_stdはより型に厳格になったパッケージと言えるだろう。必要な場合はユーザーが明示的にキャストする必要がある。
例として足し算はstd_logic_arithでは

function "+"(L: UNSIGNED; R: UNSIGNED) return UNSIGNED;
function "+"(L: SIGNED; R: SIGNED) return SIGNED;
function "+"(L: UNSIGNED; R: SIGNED) return SIGNED;
function "+"(L: SIGNED; R: UNSIGNED) return SIGNED;
function "+"(L: UNSIGNED; R: INTEGER) return UNSIGNED;
function "+"(L: INTEGER; R: UNSIGNED) return UNSIGNED;
function "+"(L: SIGNED; R: INTEGER) return SIGNED;
function "+"(L: INTEGER; R: SIGNED) return SIGNED;
function "+"(L: UNSIGNED; R: STD_ULOGIC) return UNSIGNED;
function "+"(L: STD_ULOGIC; R: UNSIGNED) return UNSIGNED;
function "+"(L: SIGNED; R: STD_ULOGIC) return SIGNED;
function "+"(L: STD_ULOGIC; R: SIGNED) return SIGNED;

function "+"(L: UNSIGNED; R: UNSIGNED) return STD_LOGIC_VECTOR;
function "+"(L: SIGNED; R: SIGNED) return STD_LOGIC_VECTOR;
function "+"(L: UNSIGNED; R: SIGNED) return STD_LOGIC_VECTOR;
function "+"(L: SIGNED; R: UNSIGNED) return STD_LOGIC_VECTOR;
function "+"(L: UNSIGNED; R: INTEGER) return STD_LOGIC_VECTOR;
function "+"(L: INTEGER; R: UNSIGNED) return STD_LOGIC_VECTOR;
function "+"(L: SIGNED; R: INTEGER) return STD_LOGIC_VECTOR;
function "+"(L: INTEGER; R: SIGNED) return STD_LOGIC_VECTOR;
function "+"(L: UNSIGNED; R: STD_ULOGIC) return STD_LOGIC_VECTOR;
function "+"(L: STD_ULOGIC; R: UNSIGNED) return STD_LOGIC_VECTOR;
function "+"(L: SIGNED; R: STD_ULOGIC) return STD_LOGIC_VECTOR;
function "+"(L: STD_ULOGIC; R: SIGNED) return STD_LOGIC_VECTOR;

と定義されているのに対しnumeric_stdでは

function "+" (L, R: UNSIGNED) return UNSIGNED;
function "+" (L, R: SIGNED) return SIGNED;
function "+" (L: UNSIGNED; R: NATURAL) return UNSIGNED;
function "+" (L: NATURAL; R: UNSIGNED) return UNSIGNED;
function "+" (L: INTEGER; R: SIGNED) return SIGNED;
function "+" (L: SIGNED; R: INTEGER) return SIGNED;

のみが定義されている。
これをみると符号の有り無しの型を混在させることもできない。行う場合は符号有り無しどちらに合わせるかをユーザーが明示的にキャストで指示する必要がある。
一方符号の有り無しが一致すればintegerやnaturalといったVHDLの標準データ型と混在させることはできる。

比較演算も同様でstd_logic_arithでは許された符号有り無しの型の混在はnumeric_stdでは許されない。行う場合は符号有り無しどちらに合わせるかをユーザーが明示的にキャストで指示する必要がある。

例えばstd_logic_arithでは

function "<"(L: UNSIGNED; R: UNSIGNED) return BOOLEAN;
function "<"(L: SIGNED; R: SIGNED) return BOOLEAN;
function "<"(L: UNSIGNED; R: SIGNED) return BOOLEAN;
function "<"(L: SIGNED; R: UNSIGNED) return BOOLEAN;
function "<"(L: UNSIGNED; R: INTEGER) return BOOLEAN;
function "<"(L: INTEGER; R: UNSIGNED) return BOOLEAN;
function "<"(L: SIGNED; R: INTEGER) return BOOLEAN;
function "<"(L: INTEGER; R: SIGNED) return BOOLEAN;

なのに対し、numeric_stdでは

function "<" (L, R: UNSIGNED) return BOOLEAN;
function "<" (L, R: SIGNED) return BOOLEAN;
function "<" (L: NATURAL; R: UNSIGNED) return BOOLEAN;
function "<" (L: INTEGER; R: SIGNED) return BOOLEAN;
function "<" (L: UNSIGNED; R: NATURAL) return BOOLEAN;
function "<" (L: SIGNED; R: INTEGER) return BOOLEAN;

のみとなる。

またintegerやnaturalといったVHDLの標準データ型とsigned, unsigned間の変換は

function TO_INTEGER (ARG: UNSIGNED) return NATURAL;
function TO_INTEGER (ARG: SIGNED) return INTEGER;
function TO_UNSIGNED (ARG, SIZE: NATURAL) return UNSIGNED;
function TO_SIGNED (ARG: INTEGER; SIZE: NATURAL) return SIGNED;

が定義されている。
同じく符号の有り無しの型の混在は無い。

その他の演算子(関数)についてはネットで検索してnumeric_std.vhdlを見ると良い。コンパクトなのですぐに理解できる。

2014年8月11日月曜日

「射影行列 一般逆行列 特異値分解」の読書メモ第2〜4章

最近Computer Vision関連の技術をAndroidアプリに使えないか色々調べているが、 Computer Visionの技術をある程度理解するには数学的には行列や統計の知識が 必要である。最適なパラメータを最小二乗法で求めるには特異値分解で〜等の台詞 がよく出てくる。ざっとそのあたりの知識を押さえておこうと色々本を読んでみたが 数学好きの悪い癖で数学自体にどっぷりとはまり込んでいる(^_^;)
そんなわけで大昔に購入した(だけだった) 「射影行列 一般逆行列 特異値分解 柳井晴夫・竹内啓著 東京大学出版会」 を最近読んでいるが第2章 射影行列の途中から早くもつまづく箇所が多くなってきた。 理解力不足はもちろんだろうけどどうも誤植や暗黙の仮定等も多い様子である。 明らかな誤植はほとんど問題ないんだけど誤植・間違いなのかどうか考えこむものも多い。 以下に疑問に思った点、必要と思われる仮定が省略されている部分で多分こうなのではと 考えた事などのメモ。証明が省略されているところも自力での証明ができたものはメモ しておく。つまづきが多くなってきた第2章の途中から。それ以前にも疑問など有ったが 忘れた(^_^;)。もちろんこれらが正しいとは限らない。

2017/5/23追記。
仕事が忙しくて途中で挫折したが最近また最初から読み始めた。 なんと3年ぶり?それに伴って第1章もこのメモに加える。

上記の本を持っていない人にはほとんど意味のない内容。自分へのメモともしかして 同じ箇所でつまづいている方の役に立てばと思い公開しておく。
ちなみに数式を表示する方法はMathJaxをGoogle Bloggerのレイアウト設定画面で ガジェットとして埋め込んでいる。MathJaxはLaTeX形式で数式を記述できるので大変便利。 そう、MathJaxを使ってみたいというのもhtmlでこのメモを書いた大きな動機だな。 どうせhtmlで書くなら公開しようと。

第1章

P7
定理1.2の証明。
P6 の次元の定義、すなわち「線形部分空間 W においてその中に r 個の1次独立な ベクトルが存在し $ r+1 $ 個のベクトルは1次従属になるとき、Wの次元は r である。」から $$\boldsymbol{a_{1}}, \dots, \boldsymbol{a_{r}}, \boldsymbol{b}$$ は一次従属。よって $$\alpha_{1} \boldsymbol{a_{1}} + \dots + \alpha_{r} \boldsymbol{a_{r}} + \beta \boldsymbol{b} = 0$$ とすると $\alpha_1, \dots, \alpha_n, \beta$ の中で0でないものが存在する。 この時 $\beta \neq 0 $。 なぜなら $\beta = 0 $ とすると、 $$\alpha_{1} \boldsymbol{a_{1}} + \dots + \alpha_{r} \boldsymbol{a_{r}} = 0$$ において $\alpha_1, \dots, \alpha_n$ の中で0でないものが存在することになり、これは $\boldsymbol{a_1}, \dots ,\boldsymbol{a_n}$ が1次独立であることに反する。 よって $$ \boldsymbol{b} = \alpha_1 / \beta \, \boldsymbol{a_1} + \dots + \alpha_r / \beta \, \boldsymbol{a_r}$$ として表せる。

P8
$V-S(A)$ とは? $V=S(A)$ の誤植?
補空間 $W = S(A)^C$ は無数にあるのか? 一つでは? 基底のとり方なら無数にあるが。
補空間は無数にあるで正しい。2次元の場合を考えてみれば解りやすい。デカルト座標を考える。 $V$ としてx軸方向のベクトルで張られる1次元の空間を考える。$W$ を張るベクトルとしては x軸方向のベクトル以外ならどんなベクトルでも良い。
補空間が一つだけと感じた理由は、

  • 集合だとある集合の部分集合の補集合は一つだけなのでそれと混同した。
  • 例えば2次元空間で直交座標系を考えてx軸方向のベクトルで張られる部分空間の補空間は 残りのy軸方向だけじゃないかと考えてしまった。

P10 (1.43)式の(iii)の証明
$(V \cap W)^\bot = V^\bot + W^\bot$
$V \cap W$ は $V$ 及び $W$ の部分空間。よって $V^\bot$ 及び $W^\bot$ は $(V \cap W)^\bot$ の部分空間。
$$V^\bot + W^\bot \subseteq (V \cap W)^\bot$$ 一方 $V^\bot$ 及び $W^\bot$ は $V^\bot + W^\bot$ の部分空間。よって $(V^\bot + W^\bot)^\bot$ は $(V^\bot)^\bot = V$ 及び $(W^\bot)^\bot = W$ の部分空間。 $$(V^\bot + W^\bot)^\bot \subseteq V \cap W$$ 両辺の補空間を取れば $$V^\bot + W^\bot \supseteq (V \cap W)^\bot$$ よって $$V^\bot + W^\bot = (V \cap W)^\bot$$ となる。
$(V^\bot)^\bot = V$ は暗黙のうちに直交補空間は一つだけと仮定している。
証明は $x \in W,\, y \in W^\bot$ とすると、$(x,\,y) = 0$ 。これは $y$ からみると、$x$ は $W^\bot$ の直交補空間の要素であるから $$x \in (W^\bot)^\bot \to W \subseteq (W^\bot)^\bot$$ $E^n = W \dot{\oplus} W^\bot = W^\bot {\oplus} (W^\bot)^\bot$ であるから $$dim W = dim (W^\bot)^\bot$$ よって $$W = (W^\bot)^\bot$$

P11
変換行列 $A$ と表現表列 $B$ の関係が把握しづらかったので纏めておく。
ベクトル $h \in E^m$ をベクトル $f \in E^n$ に写像するのが $A$。 $$ f = Ah $$ $A$ を $(n,m)$型行列と言っていることから $h$ と $f$ はそれぞれ $m$個と $n$ 個の数字の列として 表されていると思われる。つまりなんらかの暗黙の基底をとっているということ?
$h$ を $E^m$ の基底 $V=(v_1,\, \dots ,\,v_m)$ の一次結合、 $f$ を $E^n$ の基底 $U=(u_1,\, \dots ,\,u_n)$ の一次結合として表した時 $$h = x_1 v_1 + \dots + x_m v_m$$ $$f = y_1 u_1 + \dots + y_n u_n$$ 係数のベクトル $(x_1,\dots ,x_m)$ と $(y_1, \dots ,y_n)$ の間の関係を表したのが $B$。 $$ y = Bx$$ この時 $$AV = UB$$ という関係が $A$ と $B$ にあることを言っている。
つまり基底を定めてベクトル $h, f$ を数ベクトル空間のベクトル $x, y$ に写像した時、 線形変換 $A$ がどのように数ベクトル空間に写像されるかを示している。

P11
$\phi(\boldsymbol{v_i}) = b_{i1} \boldsymbol{u_1} + b_{i2} \boldsymbol{u_2} + \dots b_{in} \boldsymbol{u_n} \quad (i=1,2,\dots,m)$ の式は($i=1,2,\dots,n$ は $i=1,2,\dots,m$ の誤記) $$ \phi(\boldsymbol{v_i}) = (\boldsymbol{u_1}, \dots \boldsymbol{u_n}) \begin{pmatrix} b_{i1}\\ b_{i2} \\ \vdots \\ b_{in}\end{pmatrix}$$ なので、 $$(\phi(\boldsymbol{v_1}, \phi(\boldsymbol{v_2}), \dots, \phi(\boldsymbol{v_m}) = (\boldsymbol{u_1}, \dots \boldsymbol{u_n}) \begin{pmatrix} b_{11} & b_{21} & \dots & b_{m1} \\ b_{12} & b_{22} & \dots & b_{m1} \\ \vdots & \vdots & & \vdots \\ b_{1n} & b_{2n} & \dots & b_{mn} \\ \end{pmatrix}$$ これを $UB $ と置くと $B$ の要素の添字の行と列の位置が通常と逆になってしまう。 間違いではないが混乱のもとかな?

P13
系(1.56)について。
$Ax=0$ なら $A'Ax=0$。一方 $A'Ax=0$ なら $x'A'Ax=0 \Rightarrow (Ax)'Ax = 0 \Rightarrow Ax = 0$。よって $\mathrm{Ker}(A) = \mathrm{Ker}(A'A)$。
これと定理1.9 と 定理 1.8 より $\mathrm{rank}(A) = \mathrm{rank}(A'A) = \mathrm{rank}(AA')$

P13の(1.57)式。 $\mathrm{Ker}(B) \subseteq \mathrm{Ker}(AB)$ より $dim(\mathrm{Ker}(B)) \le dim(\mathrm{Ker}(AB))$ 。 よって定理1.9より $\mathrm{rank}(AB) \le \mathrm{rank}(B)$ 。
また $\mathrm{rank}(AB) = \mathrm{rank}(B'A') \le \mathrm{rank}(A') = \mathrm{rank}(A)$ 。

一方、A, B を $(n, p), (p, q)$ 型行列としたとき $\mathrm{rank} A + \mathrm{rank} B - p \le \mathrm{rank}(AB)$ は
$AB = (A\boldsymbol{b_1}, \dots ,A\boldsymbol{b_q})$ 。$\mathrm{rank}B = r$ と置いて $\boldsymbol{b_1}, \dots ,\boldsymbol{b_q}$ の中から1次独立な r個のベクトルを選びそれを改めて $\boldsymbol{b_1}, \dots ,\boldsymbol{b_r}$ とする。
$A\boldsymbol{b_1}, \dots ,A\boldsymbol{b_r}$ を考える。これらのうち $A\boldsymbol{b_1}, \dots ,A\boldsymbol{b_{s}}$ が1次独立なベクトルとする。 すると、 $$A\boldsymbol{b_j} = \beta_1 A\boldsymbol{b_1} + \dots + \beta_{s} A\boldsymbol{b_{s}} \Rightarrow A(\boldsymbol{b_j} - \beta_1 \boldsymbol{b_1} - \dots - \beta_{s} \boldsymbol{b_{s}}) = 0 \quad(j = s+1, \dots ,r)$$ よって $$r-s \le \mathrm{dim}(\mathrm{Ker}(A))$$ $\mathrm{dim}(\mathrm{Ker}(A)) = \mathrm{dim}(S(A')^\bot) = p - \mathrm{rank}(A') = p - \mathrm{rank}(A)$ であるから $$ r - \mathrm{dim}(\mathrm{Ker}(A)) = r - p + \mathrm{rank}A = \mathrm{rank}B - p + \mathrm{rank}A \le s = \mathrm{rank}(AB)$$ よって $$ \mathrm{rank}A + \mathrm{rank}B - p \le \mathrm{rank}(AB)$$

P13の(1.58)式。
(1.57)式より $\mathrm{rank}(UAV) \le \mathrm{rank}(A)$。
一方 $U, V$ は正則だから逆行列が存在するから $A = U^{-1}UAVV^{-1}$ 。よって $\mathrm{rank}(A) = \mathrm{rank}(U^{-1}UAVV^{-1}) \le \mathrm{rank}(UAV)$ 。 よって $\mathrm{rank}(UAV) = \mathrm{rank}(A)$ 。

P13の(1.59)式。
$A = (\boldsymbol{a_1, \dots , a_n}), \, B = (\boldsymbol{b_1, \dots , b_n})$ とすると $A + B = (\boldsymbol{a_1 + b_1, \dots , a_n + b_n})$
よって $z \in S(A + B)$ の時 $z = x + y \quad(但し x \in S(A), \, y \in S(B))$ と分解できるから $z \in S(A) + S(B) \Rightarrow S(A + B) \subseteq S(A) + S(B)$
$\therefore \mathrm{rank}(A + B) \le \mathrm{rank}(A) + \mathrm{rank}(B)$

P13の(1.60)式。
$$ \mathrm{rank}(ABC) \ge \mathrm{rank}(AB) + \mathrm{rank}(BC) - \mathrm{rank}B$$ これは自力では証明できなかった。色々調べてみるとこれは Frobenius inequality という式で、ググれば 証明方法が出てくる。例えばここ等。

P17の(1.68a)、(1.68b)式。
異なる固有値の右固有ベクトルと左固有ベクトルが直交することの証明。
まず $(u_i, v_j) = 0 \quad (i \neq j)$ の証明。
$v_j'(Au_i) = v_j' \lambda_i u_i = \lambda_i v_j' u_i, \quad (v_j' A)u_i = \lambda_j v_j' u_i$ より $\lambda_i v_j' u_i = \lambda_j v_j' u_i$ 。
よって $\lambda_i \neq \lambda_j$ なら $v_j' u_i = 0$
$(u_i, v_i) \neq 0$ の証明。
$U = (u_1, \dots , u_n)$ とする。 $\lambda_i$ は全て異なるから$u_1, \dots , u_n$ は1次独立。よって $U$ は逆行列を持つ。これを $W$ とし、その行ベクトルを $w_i'$ とする。 $$ W = \begin{pmatrix} w_1' \\ w_2' \\ \vdots \\ w_n'\end{pmatrix}, \quad w_i' u_i = 1, \, w_i' u_j = 0 \, (i \neq j) $$ $w_i' A u_i = w_i' \lambda_i u_i \Rightarrow (w_i' A - \lambda_i w_i') u_i = 0$。 $u_i \neq 0$ であるから $w_i'A = \lambda_i w_i$ であるか $(w_i' A - \lambda_i w_i')$ が $u_i$ に直交する場合が考えられるが、 $(w_i' A - \lambda_i w_i') u_j = w_i' A u_j - \lambda_i w_i' u_j = \lambda_j w_i' u_j - \lambda_i w_i' u_j = 0 \, (i \neq j)$ であるから、$u_i$ と直交する場合は $(w_i' A - \lambda_i w_i')$ は全ての $u_1, \dots, u_n$ と直交することになり矛盾が生じる。 よって $w_i'A = \lambda_i w_i'$ 。この場合 $w_i$ は $\lambda_i$ に対する左固有ベクトル。 全ての固有値は異なるから $\lambda_i$ に対する固有空間は $w_i$ によって張られる1次元の空間である。 よって固有値 $\lambda_i$ に対する左固有ベクトルは $v_i = c w_i$、但し$c$は0以外の任意の定数。 $w_i' u_i = 1$ であるから $v_i' u_i \neq 0$ となる。

P18 の定理1.12
定理にある正方行列Aは文脈からすると対称行列Aの誤記?そうだと仮定して対称行列の固有値は実数であるから 実数の範囲で考える。というか本ではサラッと「対称行列 $A$ の固有値が全て正のとき」とか書いていて、 固有値は一般には複素数なので混乱しそうだが。まあこの本を読むレベルなら問題ないのか。 $$ U' A U = \Delta = \left( \begin{array}{cccc} \lambda_1 & & & O \\ & \lambda_2 & & \\ & & \ddots & \\ O & & & \lambda_n \\ \end{array} \right) $$ とできる。 $A = B'B$ とすると $U' A U = U'B'BU = (BU)'BU$ であるから $BU = (x_1, \dots , x_n)$ と置くと $(BU)'BU$ の対角成分は $x_i' x_i \ge 0$ 。よって $\lambda_i \ge 0$ 。
一方、$\lambda_i \ge 0$ とすると $$ \Delta = \Delta^{1/2} (\Delta^{1/2})' \quad 但し \Delta^{1/2} \equiv \left( \begin{array}{cccc} \lambda_1^{1/2} & & & O \\ & \lambda_2^{1/2} & & \\ & & \ddots & \\ O & & & \lambda_n^{1/2} \\ \end{array} \right) $$ とできるから $$A = U \Delta U' = U \Delta^{1/2} (\Delta^{1/2})' U' = (U \Delta^{1/2})(U \Delta^{1/2})'$$ となる。

第2章

P23
この図2.1、図2.2 は良いな。$W$ に沿った $V$ への射影という言葉の「沿う」という意味が 分かる。今まで直交座標系に慣れすぎていて単に $V$ へ垂直に垂線を降ろしての射影を 考えてしまうが、それは一般的じゃないのが分かる。

P24〜25
補助定理2.2の $\mathrm{rank}(T \Delta_r T^{-1}) = \mathrm{rank}(\Delta_r)$ は正則行列をかけても rank は変わらないから。
$\mathrm{tr}(T \Delta_r T^{-1}) = \mathrm{tr}(\Delta_r)$ は $\mathrm{tr}(AB) = \mathrm{tr}(BA)$ を使う。

P26
定理2.6の $A\alpha = A(A'A)^{-1}A'x_1$ は $A\alpha = A(A'A)^{-1}(A'A)\alpha$ より。

P28
補助定理2.3の証明の最後の方の「 $V_2 \subset W_2$ のときは」は「 $V_2 \subset W_1$ のときは」の誤記。

P29
定理2.8の別証明。
定理2.7と定理2.8の(iii)式を比べると $V_2$ と $W_2$ が入れ替わっているだけである。 もともとの仮定である $E^n = V_2 \oplus W_2$ はこれらが入れ替わっても不変である。 この入れ替えで変わるのは $P_2$ が $Q_2$ に入れ替わる。 これらを考慮して定理2.7を書き換えると
(i) $P_1 + Q_2 = I - (P_2 - P_1)$ は $W_1 \cap V_2$ に沿った $V_1 \oplus W_2$ への射影。 よって $P_2 - P_1$ は $V_1 \oplus W_2$ に沿った $W_1 \cap V_2$ への射影。
(ii) $P_1 Q_2 = P_1 (I_n - P_2) = P_1 - P_1 P_2 = 0 \Rightarrow P_1 P_2 = P_1$
$Q_2 P_1 = (I_n - P_2) P_1 = P_1 - P_2 P_1 = 0 \Rightarrow P_2 P_1 = P_1$
(iii) $V_1 \subset V_2, \, W_2 \subset W_1$

P30
定理2.9 で(2.20a)式を前提条件とするのは余分ではないか? また(2.20a)式の前提条件で $E^n = (V_1 \cap V_2) \oplus (W_1 \oplus W_2)$ は成り立たない。

P31
$$ E^n = V_1 \dot{\oplus} V_2 \dot{\oplus} \dots \dot{\oplus} V_m $$ の直交直和記号 $ \dot{\oplus} $ は単なる直和記号 $ \oplus $ のはず。

P31
(iii)→(i),(ii) $\mathrm{dim}(V_1 + \dots + V_m) = \mathrm{dim}V_1 + \dots + \mathrm{dim}V_m$ となるには定理1.3(i)より $\mathrm{dim}V_{i \cap j} = 0 \,(i \neq j)$ となり互いに素だということ。

P33
定理2.14の (ii),(iii)→(iv) は $\mathrm{rank}(P) = \mathrm{tr}(P)$ (補助定理2.2)も考慮すると 解りやすい。

P33
定理2.15 (ii)の証明で $ P_{j-1} P_j = P_{j-1} $ となるには $ W_j \subseteq W_{j-1} $ となる必要があるはず(定理2.8の注意より)。 よってこれは仮定する必要があると思われる。

P34
定理2.16でも $P_1 P_{1+2} = P_1, \; P_2 P_{1+2} = P_2$ を暗黙に仮定している。 つまり $ W_1 \supseteq V_3, \; W_2 \supseteq V_3 $ となる必要がある。
(i)の 「$P_{1+2} = P_1 + P_2 - P_1 P_2$ が成立するための必要十分条件は $V_{1+2} \cap W_2 \subseteq V_1 \oplus V_3$ 」の必要条件の証明の詳細。まず $$ (P_{1+2}-P_1)(P_{1+2}-P_2) = P_{1+2}^2-P_{1+2}P_2-P_1 P_{1+2}+P_1 P_2 \\ = P_{1+2}-P_2-P_1+P_1 P_2 = O$$ (ここで $P_1 P_{1+2} = P_1$ が必要。)である。
一方 $V_{1+2} \supseteq V_1$ (並びに暗黙の仮定として上記の $V_3 \subseteq W_1$ が必要)であるから定理2.8より $P_{1+2}-P_1$ は $V_1 \oplus V_3$ に沿った $V_{1+2} \cap W_1$ への 射影行列となる。同様に $P_{1+2}-P_2$ は $V_2 \oplus V_3$ に沿った $V_{1+2} \cap W_2$ への 射影行列となる。
よって定理2.7の $P_1,\;P_2$ を $ P_{1+2}-P_1,\; P_{1+2}-P_2$ で置き換えれば $V_{1+2} \cap W_2 \subseteq V_1 \oplus V_3$ となる。
十分条件の方も $V_{1+2} \cap W_2 \subseteq V_1 \oplus V_3$ が成り立てば定理2.7 より $ (P_{1+2}-P_1)(P_{1+2}-P_2) = O$ が成り立つ。

P35
定理2.16の系「 $ E^n = V_1 \oplus W_1 = V_2 \oplus W_2 $ の分解が存在する場合、 $P_1 P_2 = P_2 P_1 $ が成立するための必要十分条件は (2.34)式及び(2.35)式が 成立することである。」の証明。
十分条件は $ P_{1+2} = P_1 + P_2 - P_1 P_2, \; P_{1+2} = P_1 + P_2 - P_2 P_1 $ が成り立てば $ P_1 P_2 = P_2 P_1 $ なのは明らか。
必要条件は $ P_1 P_2 = P_2 P_1 $ なら $(P_{1+2} - P_1)(P_{1+2} - P_2) = (P_{1+2} - P_2)(P_{1+2} - P_1) $ であるからこれは定理2.9により $ (V1 \oplus V3) \oplus (V2 \oplus V3) = V1 \oplus V2 \oplus V3 $ に沿った $ (V_{1+2} \cap W_1) \cap (V_{1+2} \cap W_2) = (V_1 + V_2) \cap W_1 \cap W_2 $ への射影となる。 $V_1 = V_{11} \oplus V_{12},\;V_2 = V_{22} \oplus V_{12}$ (但し $V_{12} = V_1 \cap V_2$) と分解できると仮定すると $$ (V_1 + V_2) \cap W_1 \cap W_2 = (V_{11} \oplus V_{22} \oplus V_{12}) \cap W_1 \cap W_2 =\\ V_{22} \cap W_1 \cap W_2 = (V_{22} \cap W_2) \cap W_1 = \{0\}$$ よって $(P_{1+2} - P_1)(P_{1+2} - P_2) $ は $\{0\} $ への射影演算子となるから $(P_{1+2} - P_1)(P_{1+2} - P_2) = (P_{1+2} - P_2)(P_{1+2} - P_1) = O $ となる。

P35
定理2.17は $$E^n=(V_1+V_2) \oplus V_3 = ((V_{11} \oplus V_{12})+(V_{22} \oplus V_{12})) \oplus V_3 \\ = ((V_{11} \oplus V_{12}) \oplus V_{22}) \oplus V_3 = (V_1 \oplus V_{22}) \oplus V_3 = V_1 \oplus (V_{22} \oplus V_3) $$ 同様に $ E^n=V_2 \oplus (V_{11} \oplus V_3) $ とするとどの射影行列が $E^n$ をどのように分解した場合の射影行列かが分かる。

P35
定理2.18の証明の(ii) $\to$ (iii) は定理2.16の証明の時に検討したように $P_{1+2}-P_1$ は $V_1 \oplus (V_{1+2})^{\perp}$ に沿った $V_{1+2} \cap V_1^\perp$ への 射影行列、 $P_{1+2}-P_2$ は $V_2 \oplus (V_{1+2})^{\perp}$ に沿った $V_{1+2} \cap V_2^\perp$ への射影行列であるから、 $(P_{1+2} - P_1)(P_{1+2} - P_2) = (P_{1+2} - P_2)(P_{1+2} - P_1) = O $ なら定理2.10より $V_{1+2} \cap V_1^\perp$ と $V_{1+2} \cap V_2^\perp$ は直交する。
$V_{1+2} \cap V_1^\perp$ は $V_1+V_2=V_{11} \oplus V_{22} \oplus V_{12}$ のうち $V_1$ 部分空間に属さないもの、すなわち $V_{22}$ である ( $V_{22} \subset V_1^\perp$ として良いのか?これも仮定する必要がある?)。 同様に $V_{1+2} \cap V_2^\perp$ は $V_1+V_2$ のうち $V_2$ 部分空間に属さないもの、 すなわち $V_{11}$ である。 よって $V_{11}$ と $V_{22}$ は直交する。

P38
補助定理2.4は以下の点に注意すると分かりやすい。
$V_1 + V_2$ が $(P_1, P_2)$ の列ベクトルで張られる部分空間であること、 すなわち $S(P_1, P_2)$ 。
$(P_1, Q_1 P_2) = (P_1, P_2)T$ より $(P_1, Q_1 P_2)$ の列ベクトルは $(P_1, P_2)$ の列ベクトルの一次結合で表せること。そしてrankが等しいことから $S(P_1, Q_1 P_2) = S(P_1, P_2)$ 。同様に $S(Q_2 P_1, P_2) = S(P_1, P_2)$ 。

P39
定理2.21の「 $P_j$ は $V_j$ への直交射影行列としたとき」は 「 $P_j$ は $V_j$ への射影行列としたとき」の誤記?

定理2.21は補助定理2.4 から $V_1 + V_2 = V_1 \oplus V_{2[1]} = V_{1[2]} \oplus V_2$ となるので $E^n = V_{2[1]} \oplus (V_1 \oplus W) = V_{1[2]} \oplus (V_2 \oplus W)$ となることを考えるとどの射影行列がどの分解に対応しているか分かる。
また $x \in E^n$ に対して $P^* x (\in V_1+V_2) = x_1(\in V_1) + x_{2[1]}(\in V_{2[1]})$ と分解できるから $P^* x (\in V_1+V_2) = P_1^* x(\in V_1) + P_{2[1]}^* x(\in V_{2[1]})$ となり $P^* = P_1^* + P_{2[1]}^*$ が成り立つ。 $P^* = P_{1[2]}^* + P_2^*$ も同様。

P39
定理2.21の系は $V_1$ と $V_2$ が直交すれば $V_1 \subseteq V_2^\perp = W_2,\; V_2 \subseteq V_1^\perp = W_1$ が成り立つ。よって $V_{1[2]} = V_1,\; V_{2[1]} = V_2$ となる。

P39
定理2.22の必要性の証明では $\|x\| = x'x,\; \|Px\| = (Px)'Px = x'P'Px$ であるから $\|x\| - \|Px\| = x'x - x'P'Px = x'(I_n - P'P)x \geq 0$ である。
$\displaystyle \sum_{j=1}^n \lambda_j^2 \leq \sum_{j=1}^n \lambda_j$ なら $\mathrm{tr}\{(P'P)^2\} \leq \mathrm{tr}(P'P)$ は正則行列 $A$ について $\displaystyle \mathrm{tr}A = \sum_{j=1}^n \lambda_j$ と $Ax = \lambda x \to A^2 x = A \lambda x = \lambda Ax = \lambda^2 x$ に注意すれば 分かる。
またtraceの中では正方行列どうしの掛け算の順番を入れ替えられることに注意して $$(\mathrm{tr}(P'P))^2 = (\mathrm{tr}(P'P^2))^2 = (\mathrm{tr}(P(P'P)))^2 \leq \\ \mathrm{tr}(PP') \mathrm{tr}\{(P'P)'(P'P)\} = \mathrm{tr}(P'P) \mathrm{tr}\{(P'P)^2\} $$ であるから $\mathrm{tr}(P'P) \leq \mathrm{tr}\{(P'P)^2\} $ となる。

P40
定理2.22の系の証明で正定値行列 $M$ を $M=U \varDelta^2 U'$ と分解できるのは、 実対称行列(正定値行列は実対称行列)$A$が直交行列$P$によって $$ P^{-1}AP = P'AP = \left( \begin{array}{cccc} \lambda_1 & & & O \\ & \lambda_2 & & \\ & & \ddots & \\ O & & & \lambda_n \\ \end{array} \right) $$ (但し$\lambda_1,\; \lambda_2, \dots ,\lambda_n$ は行列Aの固有値) と対角化できることを用いれば分かる。

P41
定理2.23 (ii) の証明は $P_1 P_2 = P_2$ より $P_2 P_1 = P_2$ を用いた方が適切。

P42
補助定理2.6の(ii)はそれ程明らかでないので証明。
$CA$ の $(i, j)$ 成分は、$\displaystyle \sum_k c_{ik} a_{kj} $ 。 シュバルツの不等式より $\displaystyle (\sum_k c_{ik} a_{kj})^2 \leq \sum_k c_{ik}^2 \sum_k a_{kj}^2 $ 。 全要素の2乗和がユークリッドノルムだから左辺を $i$ と $j$ で和を取ったものが ノルムとなる。 $\displaystyle \|CA\| \leq \sum_i \sum_j (\sum_k c_{ik}^2 \sum_k a_{kj}^2) =(\sum_i \sum_k c_{ik}^2)(\sum_j \sum_k a_{kj}^2) = \|C\|\|A\|$ 。
(iii)は $$\|A+B\|^2 = \mathrm{tr}\{(A+B)'(A+B)\} = \mathrm{tr}(A'A+B'B+A'B+B'A) = \\ \mathrm{tr}(A'A) + \mathrm{tr}(B'B) + 2\mathrm{tr}(A'B) = \|A\|^2 + \|B\|^2 + 2\mathrm{tr}(A'B)$$ となり(1.18a)より $\mathrm{tr}(A'B) \leq \sqrt{\mathrm{tr}(A'A)\mathrm{tr}(B'B)} = \sqrt{\|A\|^2\|B\|^2} = \|A\|\|B\|$ であるから $\|A+B\|^2 \leq \|A\|^2 + \|B\|^2 + 2\|A\|\|B\| = (\|A\| + \|B\|)^2$ となる。

P43
補助定理2.7の(ii)の証明は $\|A\widetilde{P}\|^2$ は $A\widetilde{P}$ の 全要素の2乗和だから $\mathrm{tr}(A\widetilde{P}\widetilde{P}'A')$ とも書ける。こちらを使ったほうが分かりやすい。

P44
定理2.25の(i)の証明では 「 $(I_n-P_B)(A-BX)=A-BX-P_BA+BX=A-P_BA=(I_n-P_B)A,\;(I_n-P_B)$ は直交射影行列であるから〜」とするのが正しく、本の方は,(カンマ)の位置が間違っている。

P44
定理2.25の最小2乗法による等号条件の証明はちょっと良く分からないが第4章に 最小2乗法に関する節があるのでとりあえず感覚だけ掴む。 なおここでは定理2.6の $P=A(A'A)^{-1}A'$ を用いている。

P47
問題5(i)の回答(P196)では定理2.8を使ってとあるが、定理2.7の誤記と思われる。

P47
問題6はちょっと良くわからない。後にする。

第3章

P51
$\widetilde{V} \to V$ への対応が1対1となる説明は $y_1 = A x_1,\; y_2 = A x_2$ ( $x_1,\;x_2 \in \widetilde{V}$ 但し $x_1,\;x_2 \neq 0$ 、 $y_1,\;y_2 \in V = S(A)$ ) の時、 $y_1 = y_2$ なら $A(x_1 - x_2) = 0$ 、 $x_1,\;x_2 \notin Ker(A)=\widetilde{W}$ より $x_1 - x_2 = 0$ 。よって $y_1 = y_2$ なら $x_1 = x_2$ となり $\widetilde{V} \to V$ への対応は1対1となるとした方が分かりやすいのでは。 本に書いてあることはちょっと意味不明だった。

P52
定理3.3の(ii) $\to$ (iii)の証明は(i) $\to$ (iii)では?

P54
定理3.5(iii)において、 $H'H = O$ となるのは $(A'ASA' - A'A(A'A)^-A')' = ASA'A - A(A'A)^-A'A = A - A = O$ となるから。
これより $ASA' = A(A'A)^-A'$ となり左辺は対称行列なので右辺もそうなる。

P54
定理3.5の系の証明。
(i)は $E^n = S(A) \dot{\oplus} S(A)^\bot$ として $x \in E^n$ に対し $x=x_1+x_2,\; (x_1 \in S(A),\; x_2 \in S(A)^\bot)$ とすると、 $x_1 = A \alpha$ と表せるから、左から $A(A'A)^-A'$をかけると定理3.5(ii)より $A(A'A)^-A'x_1 = A(A'A)^-A'A\alpha = A\alpha = x_1$ となる。 また $x_2 \in S(A)^\bot = \mathrm{Ker}(A')$ であるから $A(A'A)^-A'x_2 = 0$ となる。 よって定理2.2より $A(A'A)^-A'$ は $S(A)$ への直交射影行列となる。
(ii)も $(A')' = A$ であるから (i)の $A$ と $A'$ を入れ替えれば同様に証明できる。

P55
定理3.6の十分性の証明で $P=AA^-$ とおくと $P^2 = P$ より、 $\mathrm{rank}(AA^-) + \mathrm{rank}(I_n - AA^-) = n$ とあるのは定理2.4を参照。

P55
補助定理3.3(iii)は $\widetilde{W} = \mathrm{Ker}(A) = \mathrm{Ker}(AA^{-})$。 $(AA^{-})^2 = AA^{-}$ と補助定理2.1から $E^n = S(AA^{-}) \oplus \mathrm{Ker}(AA^-) \Rightarrow E^n = S(AA^{-}) \oplus \mathrm{Ker}(A)$ となる。

P59
定理3.12の(ii)の証明の最後で $(A+B)(A+B)^-A(A+B)^-B = A(A+B)^-B$ となるのは $(A+B)(A+B)^-A(A+B)^-B = (A+B)(A+B)^-B(A+B)^-A$ で $S(A+B) \supset S(B)$ であるから 定理3.11より $(A+B)(A+B)^-B = B$ となるので $(A+B)(A+B)^-B(A+B)^-A = B(A+B)^-A = A(A+B)^-B$ となるから。

P59
定理3.12の(iii)の証明で 「 $A(A+B)^-B = B(A+B)^-A$ より、$S(A(A+B)^-B) \subset S(A) \cap S(B)$ は明らか」 とあるのは、 $A(A+B)^-B$ は $A\{(A+B)^-B\}$ であるから各列ベクトルは $A$ の列ベクトルの一次結合 で表せるので $S(A(A+B)^-B) \subset S(A)$ 。同様に $B(A+B)^-A$ の各列ベクトルは $B$ の列ベクトルの一次結合 で表せるので $S(A(A+B)^-B) \subset S(B)$ ということ。
また$S(A) \cap S(B)$ の空間のベクトルは $A$ の 列ベクトルの一次結合で表せ 、かつ $B$ の列ベクトルの一次結合でも表せるので $S(A) \cap S(B) = S(AX|AX=BY)$ と表せる。 $AX = BY$ を満たす $X,\;Y$ は(i)より $X = (A+B)^-B,\; Y = (A+B)^-A$ であるから $S(A) \cap S(B) = S(A(A+B)^-B)$ と表せる。
$S(A) \cap S(B) \subset S(AX) \cap S(BY)$ となるのはよく分からない。

P61
(3.46)式は $F= \left[ \begin{array}{cc} C_1 & C_2 \\ C_2' & -C_3 \end{array} \right] $ の誤記?

P62
3.3の節で「(iii) $\widetilde{W}$ の部分空間 $\widetilde{W}_r$ の選び方と次元数 $r$ の定め方」と突然 $\widetilde{W}_r$ が出てくるがこれは次のページで説明される $S\{(I-A^-A)A^-\}$ のこと。

P65
3.3.2 ノルム最小型一般逆行列の節で「補助定理3.1と3.2より」となっているのは 「補助定理3.3より」の誤記?

P65
(3.57)式の $(A^-A)'(I-A^-A) = O \Rightarrow (A^-A)' = A^-A$ は $(A^-A)'(I-A^-A) = O$ より $(A^-A)' = (A^-A)'(A^-A)$ 。右辺は対称行列だから 左辺も対称行列となり $(A^-A)' = A^-A$ 。

P66
2つ目の「注意」のところで $\mathrm{rank}{A_m}^- = \mathrm{rank}A$ となるのは 定理1.9の系で $\mathrm{rank}(AB) \leq \mathrm{Min}(\mathrm{rank}A,\;\mathrm{rank}B)$ だから ${A_m}^- = A'(AA')^-A$ より $\mathrm{rank}{A_m}^- \leq \mathrm{rank}A$ 、 また(3.10)式より $\mathrm{rank}{A_m}^- \geq \mathrm{rank}A$ 、よって $\mathrm{rank}{A_m}^- = \mathrm{rank}A$ 。
また ${A_m}^- = A'(AA')^- + Z[I_n - AA'(AA')^-]$ より ${A_m}^-A = A'(AA')^-A + Z[A - AA'(AA')^-A]$ 。 この第二項は $Z[A - AA'(AA')^-A] = Z[A - A{A_m}^-A] = Z[A-A] = O$ となるから ${A_m}^-A = A'(AA')^-A$ となる。

P68
${A_{mr}}^- = A'(AA')^- = \frac{1}{3} \left[ \begin{array}{rrr} 1 & 1 & 0 \\ 0 & -1 & 0 \\ -1 & 0 & 0 \end{array} \right] $ は反射型一般逆行列の一つで実際には一つには定まらない。 実際 $(AA')^- = \left[ \begin{array}{ccc} a & b & c \\ b & d & e \\ c & e & f \end{array} \right] $ と置いて $AA'(AA')^-AA' = AA'$ を解き、 $A'(AA')^-$ を求めると $$A'(AA')^- = \left[ \begin{array}{ccc} 6c-3e-3f+1 & 6c-3e-3f & 6c-3e-3f \\ -3c+6e-3f & -3c+6e-3f+1 & -3c+6e-3f \\ -3c-3e+6f-1 & -3c-3e+6f-1 & -3c-3e+6f \\ \end{array} \right] $$ となり $$A'(AA')^-b = \left[ \begin{array}{ccc} c+e-2f+\frac{1}{3} & c+e-2f+\frac{1}{3} & c+e-2f \\ c-2e+f & c-2e+f-\frac{1}{3} & c-2e+f \\ -2c+e+f-\frac{1}{3} & -2c+e+f & -2c+e+f \end{array} \right] \left[ \begin{array}{r} 2 \\ -1 \\ -1 \end{array} \right] = \left[ \begin{array}{r} \frac{1}{3} \\ \frac{1}{3} \\ -\frac{2}{3} \end{array} \right] $$ となる。本の例は $c=e=f=0$ の場合となる。

P69
$\|(I-P_A)(I_n-AA^-)y\| = \|(I-P_A)y\|$ となるのは $E_n = S(A)^\perp \dot{\oplus} S(A) = S(I_n-AA^-) \oplus S(A)$ とした時、定理2.8において $P_1 = I - P_A$ 、 $P_2 = I_n - AA^-$ として、 $W_1 = W_2\;(W_2 \subseteq W_1)$ であるから $P_1 P_2 = P_1$ 、よって $(I-P_A)(I_n-AA^-) = I-P_A$ となる。

P71
定理3.18の $G$ は $A^+$ に対応させると分かりやすい。 (i)の $AG=P_A$ は $AA^+=P_A$ に対応し、$GA=P_G$ は $A^+A=P_{A^+}$ に対応する。 (ii)の $G$ は定義3.5のうち(ii)の $A^+AA^+=A^+$が成立しない場合に対応する。
(i)の証明は
$\Rightarrow$
$AG=P_A$ の右から $A$ をかけると $AGA=P_AA$ 。$P_A$ はS(A)への直交射影行列であるから $P_AA = A$ 。よって $AGA=A$ 。
$GA=P_G$ の右から $G$ をかけると $GAG=P_GG$ 。$P_G$ はS(G)への直交射影行列であるから $P_G = G$ 。よって $GAG=G$ 。
$P_A$ は直交射影行列であるから $P_A = P_A'$ 。よって $(AG)' = AG$ 。 同様に $P_G$ は直交射影行列であるから $P_G = P_G'$ 。よって $(GA)' = GA$ 。
$\Leftarrow$
$(AG)^2=AGAG=AG$ より $AG$ は $S(AG)$ への射影行列。 さらに $(AG)'=AG$ より直交射影行列となる。
一方 $A=AGA$ より $\mathrm{rank}A \leq \mathrm{rank}(AG)$ 。 $\mathrm{rank}(AG) \leq \mathrm{rank}A$ は明らかであるから、 $\mathrm{rank}A = \mathrm{rank}(AG)$ 。さらに $S(AG)$ の基底ベクトルは $A$ の列ベクトルで表せるから $S(AG) = S(A)$ 。よって $AG$ は $S(A)$ への 直交射影行列となる。
同様に $(GA)^2=GAGA=GA$ より $GA$ は $S(GA)$ への射影行列。 さらに $(GA)'=GA$ より直交射影行列となる。
一方 $G=GAG$ より $\mathrm{rank}G \leq \mathrm{rank}(GA)$ 。 $\mathrm{rank}(GA) \leq \mathrm{rank}G$ は明らかであるから、 $\mathrm{rank}G = \mathrm{rank}(GA)$ 。さらに $S(GA)$ の基底ベクトルは $G$ の列ベクトルで表せるから $S(GA) = S(G)$ 。よって $GA$ は $S(G)$ への 直交射影行列となる。
(ii)の証明は
$\Rightarrow$
$GAG=G$ 以外は(i)と同様。
$\Leftarrow$
$AG=P_A$ は(i)と同様。
$(GA)^2=GAGA=G(AGA)=GA$ より $GA$ は $S(GA)$ への射影行列。 さらに $(GA)'=GA$ より直交射影行列となるのは(i)と同様。
一方 $G=GAG$ とは限らないので言えるのは $\mathrm{rank}(GA) \leq \mathrm{rank}G$ のみ。 よって $S(GA) = S(G)$ とは言えない。
そこで $GA = (GA)' = A'G'$ を考えると $A'=A'G'A'$ より $\mathrm{rank}A' \leq \mathrm{rank}(A'G')$ と $\mathrm{rank}(A'G') \leq \mathrm{rank}A'$ 。 よって $\mathrm{rank}A' = \mathrm{rank}(A'G')$ 。さらに $S(A'G')$ の基底ベクトルは $A'$ の列ベクトルで表せるから $S(GA) = S((GA)') = S(A'G') = S(A')$ 。 よって $GA$ は $S(A')$ への直交射影行列となる。

P71
定理3.19の十分性の証明で $x = A^+b+(I_m-A^+A)z$ とあるのは $A^+$ は最小2乗型逆行列でもあるから $A^+b$ は $\|Ax-b\|$ を最小にする$x$ の一つの解。 さらに $x$ には左から $A$ をかけると $0$ になる任意の項が追加できて、結局 $x = A^+b+(I_m-A^+A)z$ となる。
次に(3.22)式にあるように任意の逆行列 $A^-$ によって $E^m = S(A^-A) \oplus S(I_m - A^-A)$ と表せる。 一方 $A^+$ は反射型であることから $A^+=A^+AA^+$ より $\mathrm{rank}A^+ \leq \mathrm{rank}(A^+A)$ 。 $\mathrm{rank}(A^+A) \leq \mathrm{rank}A^+$ は明らかであるから、 $\mathrm{rank}A^+ = \mathrm{rank}(A^+A)$ 。さらに $S(A^+A)$ の基底ベクトルは $A^+$ の列ベクトルで表せるから $S(A^+A) = S(A^+)$ 。 よって $E^m = S(A^+) \oplus S(I_m - A^+A)$ と表せる。 さらにノルム最小型であるから $\widetilde{V}$ と $\widetilde{W}$ は直交するので $E^m = S(A^+) \dot{\oplus} S(I_m - A^+A)$ となる。

必要性の証明は混乱してしまった。 $\|Ax-b\|$ を最小にする $A^-$ 、すなわち最小2乗型逆行列で、かつ $\|x\|^2$ が最小になる $A^-$ 、すなわちノルム最小型逆行列を仮定すると $A^+ A A^+ = A^+$ 、すなわち反射型逆行列となるように読めた。 これは定理3.18に見る最小2乗型逆行列で、かつ、ノルム最小型逆行列でも 反射型逆行列ではない場合、すなわち(ii)の場合と反しているように見えた。
結局この定理が言っているのは最小2乗型逆行列を決めても $x = A^- b$ は $\|Ax-b\|$ を最小にする $x$ の一つに過ぎず、(3.74)式 $x = A^+b+(I_m-A^+A)z$ のように任意の $z$ のとり方で無数にある。それらの $x$ のうち、$x = A^- b$ が $x$ のノルムを最小にする条件として $A^+ A A^+ = A^+$ 、すなわち反射型逆行列の条件が 必要になる。 $A^+ A A^+ = A^+$ の条件が無いと $x = A^+b+(I_m-A^+A)z$ の元で $\|x\|$ を最小にする 0 でない $z$ が存在するということかな?

P72
定理3.21の証明にでてくる正規方程式は最小2乗法の問題を解くときにでてくる方程式。 または次の「注意」に出てくる式の変形で求まる式と考えても良い。
その後の証明はよく分からなかったが、要は、 ラグランジュ未定乗数法によって求めた $x = A'A\lambda$ と正規方程式 $A'Ax=A'b$ の連立方程式を解くと前者を後者に代入して $A'AA'A\lambda = A'b$ 。 よって $\lambda = (A'AA'A)^-A'b$ だから $x = A'A(A'AA'A)^-A'b = A^+b$ より $A^+ = A'A(A'AA'A)^-A'$ となる。
この後の「注意」用いる $A'AA^+ = A'$ は定理3.16(ii)より得られる。 なおこの「注意」は誤記が多い。一々訂正しないが注意して式を追うこと。

P75
(3.78)式導出の過程で $B'(BB')^-B,\;C(C'C)^-C'$ がそれぞれ単位行列というのは、 $C$ の方に注目すると(3.13)式より $C(C'C)^-C'C=C$ で左辺の前半 $C(C'C)^-C'$ は $(r,r)$ 型行列、残りの $C$ は $(r,m)$ 型行列。 $\mathrm{rank}C=r$ より $C(C'C)^-C'$ の階数も $r$ であるから 正則行列となり、これを $M$ とする。 $C$ の列を適当に並べ替えて独立なr個の列ベクトルを 前半に持ってくる。並べ替えたものを $\widetilde{C}$ とすると $\widetilde{C} = [C_1 \; C_2]$ 。 但し $C_1$ は正則。すると $M \widetilde{C} = [M C_1 \; M C_2] = [C_1\; C_2] $ 。 $M$ と $C_1$ は正則だから $M = C(C'C)^-C'$ は単位行列となる。 $B$ の方も同様に証明 できる。
$(BB')^-B(CC')^-B'(BB')^- \in {(BCC'B')^-}$ は $BCC'B'\;(BB')^-B(CC')^-B'(BB')^-\;BCC'B' = BCC'B'$ を計算して証明すれば良い。 $(C'C)^-C'(B'B)^-C(C'C)^- \in {(C'B'BC)^-}$ も同様。

P75
定理3.22の証明は(i)は前述の $A = BC$ において $B = I_n,\; C = A$ とおいて (3.78)式より $A^+ = A'(AA')^- = A^-_{mr}$ となる。
(ii)は $B=A,\; C=I_m$ とおいて $A^+ = (A'A)^-A' = A^-_{lr}$ となる。

P75
最後の「注意」のところの式の変形はよく分からない。

P76
問4(ii)の回答(P198)はよく分からなかった。自分での証明は
$\Rightarrow$
$\mathrm{rank}(CAD) = \mathrm{rank}(A)$ より $\mathrm{rank}(CA) = \mathrm{rank}(A)$ 。 よって $\mathrm{rank}\{(CA)'\} = \mathrm{rank}(A'C') = \mathrm{rank}(A')$ から $S(A'C') = S(A')$ 。 これより $A'$ の列ベクトルは $A'C'$ の列ベクトルで表せるから $A' = A'C'K$ なる $K$ が存在する。よって $A = K'CA$ 。
同様に $\mathrm{rank}(AD) = \mathrm{rank}(A)$ より $A = ADL$ と表せる。 これより $$A\{D(CAD)^-C\}A = K'CA\{D(CAD)^-C\}ADL = \\ K'CAD(CAD)^-CADL = K'CADL = ADL = A$$ となり、 $D(CAD)^-C \in \{A^-\}$ となる。
$\Leftarrow$
$AD(CAD)^-CA = A$ より左から $C$ をかけて $CAD(CAD)^-CA = CA$ 。よって $\mathrm{rank}(CAD) = \mathrm{rank}(CA)$ 。 $AD(CAD)^-CA = A$ より $\mathrm{rank}(CA) = \mathrm{rank}(A)$ 。 よって $\mathrm{rank}(CAD) = \mathrm{rank}(CA) = \mathrm{rank}(A)$ 。

P76
問題5(iii)の自分での証明。
まず $B^- \in \{(Q_A B)^-\}$ を証明する。
$Q_A BB^-Q_A B = Q_A P_B Q_A B = Q_A Q_A P_B B = Q_A B$ より $B^- \in \{(Q_A B)^-\}$ 。
よって $P_B - P_A P_B = (I - P_A) P_B = Q_A B B^- = Q_A B (Q_A B)^-$
$P_B$ が直交射影行列の場合は $P_B = B B_l^-$ であるから $P_B - P_A P_B = Q_A B (Q_A B)_l^-$

P77
問題12の回答(P200)で $P_{1+2} P_2 = P_2 = P_2 P_{1+2}$ は定理2.8より得られる。
$ P_{1+2} = \left( \begin{array}{cc} P_1, & P_2 \end{array} \right) \left( \begin{array}{c} P_1 \\ P_2 \end{array} \right) \left\{ \left( \begin{array}{cc} P_1, & P_2 \end{array} \right) \left( \begin{array}{c} P_1 \\ P_2 \end{array} \right) \right\}^+ $ となるのは任意の $x \in S(P_{1+2})$ のベクトルは $P1$ 及び $P2$ の列ベクトルの 線型結合で表せるから $x \in S\{(P_1,\; P_2)\}$ とできる。 $\mathrm{rank}(A) = \mathrm{rank}(AA')$ よりこれは $$ S\{(P_1,\; P_2)\} = S\{(P_1,\; P_2)(P_1,\; P_2)'\} = S \left\{ \left( \begin{array}{cc} P_1, & P_2 \end{array} \right) \left( \begin{array}{c} P_1' \\ P_2' \end{array} \right) \right\} = S \left\{ \left( \begin{array}{cc} P_1, & P_2 \end{array} \right) \left( \begin{array}{c} P_1 \\ P_2 \end{array} \right) \right\} $$ とできる。
$S(A)$ への直交射影行列は $AA_l^-$ であるから $P_{1+2} = (P_1 + P_2)(P_1 + P_2)_l^-$ となる。
後はちょっとよく分からなかった。後に回す。

第4章

P80
系1 は $C'(CC')^- C$ はP54の(3.16)式より $S(C')$ への直交射影行列であるから、 補助定理4.1(i)の $A$ を $A'$ に、$B$ を $C'$ に置き換えて $$\mathrm{rank}(A') = \mathrm{rank}(Q_{C'} A') = \mathrm{rank}(A Q_{C'} A')$$ $\mathrm{rank}(A) = \mathrm{rank}(A')$ で ${Q_{C'}}' = Q_{C'}$ であるから $$\mathrm{rank}(A) = \mathrm{rank}(A Q_{C'}) = \mathrm{rank}(A Q_{C'} A')$$ 同様に補助定理4.1(ii)の $A$ を $A'$ に、$B$ を $C'$ に置き換えて P54 (3.12)式を使い \begin{equation*} A'(A Q_{C'} A')^- A Q_{C'} A' = A' \Rightarrow \\ A Q_{C'} A' {(A Q_{C'} A')^-} A = A \end{equation*}

P80
定理4.1の証明で
${P_{A \cdot B}}^* B = O \Rightarrow {P_{A \cdot B}}^* = K{Q_B}^*$ となるのは
${P_{A \cdot B}}^* B = O$ より ${P_{A \cdot B}}^*$ の行ベクトルは $B$ の列ベクトルに直交するから $S(({P_{A \cdot B}}^*)') \subseteq S(B)^\perp$ 。
一方、 ${Q_B}^*B = O$ より $S(({Q_B}^*)') \subseteq S(B)^\perp$ 。
${Q_B}^*$ は $S(B)$ の補空間への射影行列だから $\mathrm{rank}({Q_B}^*) = \mathrm{dim}(S(B)^\perp)$ 。
よって $S(({Q_B}^*)') = S(B)^\perp$ となるから $S(({P_{A \cdot B}}^*)') \subseteq S(({Q_B}^*)')$ となり $({P_{A \cdot B}}^*)'$ の列ベクトルは $({Q_B}^*)'$ の列ベクトルの一次結合で 表すことができる。
よって $({P_{A \cdot B}}^*)' = ({Q_B}^*)'W$ なる正方行列 $W$ が存在する。 両辺の転置をとって $W' = K$ とすれば ${P_{A \cdot B}}^* = W'{Q_B}^* = K{Q_B}^*$ となる。
$K{Q_B}^* A = A$ なら $K = A({Q_B}^* A)^- + Z[I_n - ({Q_B}^* A)({Q_B}^* A)^-]$ の第2項は右から ${Q_B}^* A$ を作用させれば $O$ になる。
第1項は右から ${Q_B}^* A$ を作用させると
$A({Q_B}^* A)^- {Q_B}^* A$ 。
${Q_B}^* = I_n - B B^-$ より ${Q_B}^* A = (I_n - B B^-) A = A - B B^- A$
$S(A) \cap S(B) = \phi$ であるから $B B^- A = 0$ なので ${Q_B}^* A = A$ よって $A({Q_B}^* A)^- {Q_B}^* A = A A^- A = A$
$(A'Q_B A)^-A'$ が ${Q_B}^* = Q_B$ のとき ${Q_B}^* A$ の一般逆行列であることの証明は ${Q_B}^2 = Q_B,\; {Q_B}' = Q_B$ と(3.13)式を用いて $Q_B A \{(A'Q_B A)^-A'\} Q_B A = Q_B A \{(Q_B A)'Q_B A\}^-(Q_B A)'Q_B A = Q_B A$

ここでの議論とは直接関係ないが、 補助定理4.1に出てくる $Q_B = I_n - P_B$ と定理4.1にでてくる ${Q_B}^* = I_n - B B^-$ の違いが良く解らなかった。
P52の定理3.3(ii)によれば $B B^-$ はS(B)のある補空間に沿ったS(B)への射影行列で $P_B$ と どこが違うのかが解らなかった。
結局は $B B^-$ が沿う補空間 $W$ は $W$ の要素 $y \in W$ に対し $B^- y \in \mathrm{Ker}(B)$ という条件が付くのに対し $P_B$ の方は沿う補空間 $W$ に対し何の制約もないという違いがあった。

続く...

2014年3月30日日曜日

Googleアナリティクスでイベントを用いてダウンロード数を計測する方法

Googleアナリティクスを用いてファイルのダウンロード数を計測したい場合、イベントを用いて計測する方法があります。

色々ぐぐってみると

 <a href="download/some_file" onclick="ga('send', 'event', 'download', 'click', 'some file');">何かファイルをダウンロードします。</a>

なんてやり方が載っています。ga関数については適当にぐぐってみてください。

ところがこのやり方では私の場合はまったくトラッキングできませんでした。

そこでさらに色々調べたところ(ぐぐったところ)以下のサイトに正解が載っていました。ありがとうざいます。助かりました。


要はトラッキングの処理が完了する前に別のページ(この場合はdownload/some_file)に飛ぶことでトラッキング処理が中断されてしまうためうまく動かないようです。hitCallback関数を使うことでトラッキング処理が終わってからダウンロードが開始することが保証されるようです。
先のサイトでは旧来のGoogleアナリティクス(ga.jsを使うもの)のようですので、ここではユニバーサル・アナリティクス(analytics.jsを使うもの)の例を簡単に紹介します。
<a href="download/some_file" onclick="ga('send', 'event', 'download', 'click', 'some file', {hitCallback: function() {document.location.href='download/some_file';}}); return false;">なにかファイルをダウンロードします。</a>

要点は

  • hitCallbackを使用する。
  • onclickでは最後に return false; とし <a href=... のhrefに飛ばないようにする。代わりにhitCallback関数内で同じ場所を指定する。
  • 念の為javascriptに対応していないブラウザのために <a href=... のhref指定も残しておきましょう。

2014年3月19日水曜日

Android向けAdMob SDKからGoogle Play 開発者サービス SDKへの移行

2014年8月1日でこれまで利用してきたAndroid向けAdMob SDKのサポートが終了する
これに伴って旧来のAdMob SDKを利用しているアプリはGoogle Playへの新規登録やアップデートができなくなる。但し引き続き広告配信は可能。
GoogleはGoogle Play開発者サービスへの移行を推奨している。ここでは移行の手順を簡単に纏めておく。なお以下はEclipseで開発していることを前提にしている。Android Studio等他の環境を使用している場合は参考先を確認すること。

Google Play Services SDKのインストール


Google Play開発者サービスを使用するにはまず開発環境にGoogle Play Services SDKをインストールする必要がある。

  • Android SDK Managerを立ちあげる。Eclipseからならメニューのwindow → Android SDK Manager を選択。
  • ExtrasのGoogle Play servicesをインストール。対象端末はAndroid 2.3以上。
  • Buildに使用するSDKのバージョン(EclipseならPackage ExplorerのProperties - Android - Project Build Targetで指定するSDKのバージョン)のGoogle APIsもインストールする。
  • メニューの File → Importを選択しダイアログを表示させる。
  • Android → Existing Android Code into Warkspace を選択し Next ボタンをクリックしダイアログを表示する。
  • AndroidのSDKをインストールしたディレクトリの下に sdk/extras/google/google_play_services/libproject/google-play-services_lib/ があるはずなので、Root Directoryにこのディレクトリを記入する。
  • Copy projects into workspaceをチェックする。これによって現在のワークスペースにライブラリのコピーが作成される(これ大事らしい)。
  • Finishボタンをクリックしてワークスペースへライブラリプロジェクトをインポートする。

Google Play Servicesのライブラリを自分のプロジェクトから参照する


Google Play Services SDKをインストールしたら、自分のプロジェクトからそれを利用できるようにライブラリを参照する。
なおlibディレクトリに入っている古いAdMob用ライブラリ(GoogleAdMobAdsSdk-*.*.*.jar)は衝突するので削除しておく。

  • Package ExplorerでAdMobを利用するプロジェクトを右クリックしPropertiesを選択しダイアログを表示させる。
  • Androidを選択し下段のLibraryのAddボタンをクリック。
  • google-play-services_libを選択しOKボタンを押す。
  • Applyボタンをクリック(必要?)。
  • OKボタンを押し、ダイアログを閉じる。

Manifestファイルを編集


Manifestファイルを開き<application>エレメントの子エレメントとして以下の記述を追加する。

<application>
省略...
    <activity android:name="com.google.android.gms.ads.AdActivity"   android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScreenSize"/>
    <meta-data android:name="com.google.android.gms.version"
                            android:value="@integer/google_play_services_version" />
省略...
</application>

Proguardの設定


(参考:Set Up Google Play Services SDK)
Proguardが必要なクラスを削除しないようにプロジェクトディレクトリ下にproguard-project.txtを作成する。これは google-play-services_lib ライブラリプロジェクトの下にあるものをコピーしてくれば良い。


ソースコードの修正


AdMobの使い方は様々なのであくまで一例。
import com.google.android.gms.ads.AdRequest;
import com.google.android.gms.ads.AdSize;
import com.google.android.gms.ads.AdView;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.GooglePlayServicesUtil;

// 省略

// なにかの関数の中。onResumeが良い?

// Google Play servicesが利用可能か確認。
int res = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
if (res == ConnectionResult.SUCCESS) {
    // Google Play service使用可能
  // adView を作成する
  adView = new AdView(this);
    // MY_ADD_UNIT_IDには自分の広告ユニットIDを入れる。
  adView.setAdUnitId("MY_ADD_UNIT_ID");
  adView.setAdSize(AdSize.BANNER);
   
  // LinearLayout をルックアップする
  LinearLayout layout = (LinearLayout)findViewById(R.id.my_layout);

  // adView を追加
  layout.addView(adView);

  // 広告のリクエストを行い広告を表示する。
  // またテストデバイス(ここではエミュレータ)では
    // 広告が表示されないようにする。
  AdRequest adRequest = new AdRequest.Builder()
  .addTestDevice(AdRequest.DEVICE_ID_EMULATOR)
  .build();
  adView.loadAd(adRequest);
}