2019年7月14日日曜日

一般相対性理論 内山龍雄著 の定理9を証明してみた

test.md

はじめに

一般相対性理論 内山龍雄著 裳華房を読んでいると、第4章 重力場の方程式 Einstein の方程式 において Einstein の方程式を導出する過程で 曲率 の 定理9 が重要であることが分かる。しかしこの定理の証明は「読者にまかせよう」となっていて載っていない。

定理9 を引用すると

定理 9. およびその1階、2階の微係数だけからできている2階対称反変テンソルで、 の2階微係数については1次式とする。いまこのテンソルを とするとき、これが恒等式

を満足するならば、それは必ず

という形に表される。

は Einstein の曲率テンソルである。

これを証明無しで「そういう定理が成り立っている」として納得して読んでも、理解にはあまり影響ないかもしれない(まあそういう式はたくさんある)。 しかし結構重要な定理なので個人的に気持ちが悪い。

自力で証明してみる。

証明

証明の方法は本に載っている定理8 と同じ道筋をたどる。

まず Riemann 空間内の1点 において を原点とする局所 Lorentz 系を考え、その系を - 系とする。

したがって では

である。

の代わりに 2階対称共変テンソル を考える。 また の条件については後で考え、ここでは考慮しないでおく。

点Pにおける局所 Lorentz 系において がどのように表現されるのかを考える。 まず の1階微分係数は になるからこの系では考慮しなくて良い。

そうすると を表わす項としては

  1. の2階微係数である4階共変テンソルに2階反変テンソルをかけ、2階共変テンソルに縮約する項。
  2. の2階微係数である4階共変テンソルに2階反変テンソルを2つかけ、スカラーに縮約しさらに2階共変テンソルをかけた項。
  3. スカラー定数に2階共変テンソルをかけた項。

となる。

2., 3. についてはまさしく定理8で示したスカラーに2階共変テンソルをかけた項となる。

定理8(これは本に証明が載っている)を引用すると

定理 8. およびその1階、2階の微係数だけからできているスカラーで、 2階微係数については1次式とする。このようなスカラーの最も一般なものは

である。

はスカラー曲率である。

そこでまず 1. の場合の項のみを考える。

について対称であることを考慮すると

という形になる。 は未定の定数である。

ここである座標系への変換 を考える。いま 系として

とする。 は任意の定数の係数で について対称とする。 これは定理8の場合と同じである。

がテンソルであるためには、この系に変換しても式の形が不変である必要がある。この要請から の関係を求めてみる。

原点 P の近くでは であるから

においては

が成り立つ。

よって - 系でも

となり、これも局所 Lorentz 系の一つである。

一方 の 2階微分については本の定理8の証明を参考に

同様にして

ここまでは定理8と同じである。

これらを用いて - 系の量で をかき表わすと

となる。

、さらに の添字 がそれぞれ対称であることを用いると前式の右辺の { } の中は

となる。

がテンソルであるためには、この項が とならなくてはならないから

となる。

よって

が得られる。

一方、本の (15.8)式によると局所 Lorentz 系では曲率テンソルは、添字を適当に修正して

となる。

の式は について対称であるから入れ替えることができる。 さらに微分の順番や の添字も入れ替えられるから、それらを適当に施すと

となる。 は本の (15.13)式で定義されている Ricci のテンソルである。

これまでは局所 Lorentz 系で考えてきたが、上式の両辺は共にテンソルであるから、この等式はどんな座標系でも成立する。

ここまでは場合分けの 1. の項を考えてきたが、その他の 2. と 3. の項を考える。 これは定理8で示したスカラー

に2階共変テンソルをかけた項となる。

よって の式として

の形を考えるとこれも 2階対称共変テンソルである。

ここで の条件について考える。

両辺に をかけ、 を作用させると

となる。

最後の項が消えるのは による。

この形で共変微分が になるのは Einstein の曲率テンソルで、本の (15.21)式で定義されている。

である。

よって

または反変テンソルの形で

となる。

2016年7月27日水曜日

Android CoordinatorLayoutのAnchor機能のまとめ

Android Design Support Library が提供する CoordinatorLayout は Google が推進している Material Design を実装するために、これまでの Layout と比べると幾つかの新しい機能を実装している。

その1つに Anchor 機能がある。これは CoordinatorLayout 内に配置される複数の子View の相対的な位置関係を指定する機能である。

幾つかの単語を定義する。

Anchor View

基準となるView。CoordinatorLayoutの子View、更にその下の階層のView等任意のViewがなれる。
但し、以下に定義する Anchored View 自身やその子、子孫Viewは Anchor View にはなれない。またCoordinatorLayout自身も Anchor View にはなれない。(Design Support Library 23.1 では CoordinatorLayout は Anchor View になれたが、23.2 又はそれ以上で確認したところ、IllegalStateException が発生するようになっていた。)

Anchored View

基準となるAnchor View に対し、相対的に位置関係を指定して配置される View。CoordinatorLayoutの直接の子Viewのみがなれる。これは Layout は一般的に自分の子Viewの配置のみを決めるためである。さらに下の階層での配置はその階層で決められる。

Design Support Library 以外のこれまでの View も Anchor View 及び Anchored View になれる。
また Anchor機能 は CoordinatorLayout が提供するもう1つの機能 Behavior とは無関係である。 但し Behavior にもレイアウト機能があるので、Behaviorが設定されていて、それがレイアウトを行う場合(より正確には Behavior#onLayoutChild が true を返した時)は Anchor での配置よりそちらが優先される。Behavoior の実装で Anchor を使用している場合もある。

Anchor View と Anchored View の指定はレイアウトファイルでおこなう。
以下は AndroidStudio で New Project を Scrolling Activity をテンプレートとして作成したファイル activity_scrolling.xml を一部抜粋、修正したものである。FloatingActionButton の代わりに普通の ImageButton を使用している。これは従来の普通の View で Anchor が設定できることを示すため。(なおコンパイルできるようにjavaソースコードも適当に変更している。)

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    <!-- 省略 -->
>

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        <!-- 省略 -->
    >
    </android.support.design.widget.AppBarLayout>

    <ImageButton
        <!-- 省略 -->
        app:layout_anchor="@id/app_bar"
        app:layout_anchorGravity="center_horizontal|bottom"
        android:layout_gravity="start|bottom"/>
</android.support.design.widget.CoordinatorLayout>

まず基準となる Anchor View には id をふっておく(android:id="@+id/app_bar")。
そして Anchored View となるViewで app:layout_anchor="@id/app_bar" と Anchor View を指定する。

次に Anchor View のどの場所を配置の基準とするかを app:layout_anchorGravity で決める。

left
基準点を Anchor View の左辺上にする。
right
基準点を Anchor View の右辺上にする。
center_horizontal
基準点を Anchor View の左右の中央にする。
top
基準点を Anchor View の上辺上にする。(指定しない場合のデフォルト値)
bottom
基準点を Anchor View の下辺上にする。
center_vertical
基準点を Anchor View の上下の中央にする。
start
配置の方向が左から右か、その逆かで基準点を Anchor View の左辺上または右辺上にする。(指定しない場合のデフォルト値)
end
配置の方向が左から右か、その逆かで基準点を Anchor View の右辺上または左辺上にする。
center
基準点を Anchor View の上下左右の中心にする。

この例だと app:layout_anchorGravity="center_horizontal|bottom" で基準点を Anchor View の左右中央で下辺上に設定している。

さらにこの基準点に対しどのように View を配置するかを android:layout_gravity で指定する。

left
基準点の左側に配置する。(上下の指定はあるが左右は指定しない場合のデフォルト値)
right
基準点の右側に配置する。
center_horizontal
基準点が View の左右の中心に来るように配置する。
top
基準点の上側に配置する。(左右の指定はあるが上下は指定しない場合のデフォルト値)
bottom
基準点の下側に配置する。
center_vertical
基準点が View の上下の中心に来るように配置する。
start
配置の方向が左から右か、その逆かで View を基準点の左側または右側に配置する。
end
配置の方向が左から右か、その逆かで View を基準点の右側または左側に配置する。
center
基準点が View の上下左右の中心に来るように配置する。(指定しない場合のデフォルト値)

この例では android:layout_gravity="start|bottom" で、基準点に対し左下側(左から右配置を仮定)に View を配置している。
但し、padding や margin も含めた範囲内から View がはみ出る場合はその分移動させられ、強制的に枠内に収まるように配置される。

以下は例に上げたレイアウトファイルの場合の画面。

2016年3月19日土曜日

Linux Mint CinnamonでSystem TrayのDropboxアイコンが無反応になった時の対処法

Linux Mint CinnamonでSystem TrayのDropboxアイコンをクリックしてもコンテクストメニューが出ず無反応になった場合には、以下の設定を試してみましょう。

画面下部のパネルのメニューからシステム設定を立ち上げ、一般を選び、 Enable support for indicators をオフ。

一度ログアウトし、再度ログインする。

副作用があるかどうかは分かりませんので自己責任で。

オリジナルの情報はここ

2015年8月20日木曜日

Javaのアクセス修飾子の使い分け

Javaではアクセス修飾子として可視性の低い順から
  • private: そのクラスからしか見えない
  • package-private(default): 何も指定しない場合。パッケージ内のクラスからしか見えない
  • protected: パッケージ内のクラスと子クラスから見える
  • public: どこからでも見える
がある。これらをどのように使い分けるか個人的な考えを纏めておく。あくまで個人的な指針で正しい考えとは限らない。

その前にアクセス修飾子のことから離れて、継承について考えを纏めてみる。
継承はなるべく使わない方が良い。継承を乱用するとちょっと機能を追加するのに新しいサブクラスを作成したりして、多くのクラスに機能が分散してしまう。
継承が無用と言うわけではない。使う場合は予め継承を前提とした設計を行い計画的に使う必要があるということ。心構えとしては「使わない」程度でちょうど良い。

継承を使う場合としては
  • フレームワークを使用する場合。AndroidでActivityを継承するなど。
に限ったほうが良い。もちろんinterfaceを実装する場合は別である。

このようにクラスは継承しないという前提。
また可視性は最低限に抑えたほうが良いという原則。
 Javaでは継承したクラスのメソッドをオーバライドする場合、またはinterfaceのメソッドを実装する場合には元の可視性より低い可視性は指定できないというルール。
以上をもとに各アクセス修飾子を検討する。

まずトップレベルのクラスまたはインターフェイスに付くアクセス修飾子はpackage-private(つまり何も指定しない)かpublicのどちらかである。
基本的にはpackage-privateで良い。 他のパッケージに見せる、つまり外部パッケージへのインターフェイスとなるクラスにのみpublicを付けるようにする。これは慎重に最低限に抑えるべきである。一度他のパッケージに公開したクラスは削除したり、メソッドを変えたりすると多大な影響を他に及ぼすため非常にやっかいなことになる。
つまりトップレベルのクラスの宣言は
class some_class {
...
}
とアクセス修飾子は付けなくて良い。

以下にクラス内のメンバに対するアクセス修飾子について考える。

private

private指定されたメンバはそのクラスからしか見えない。
クラス外に公開するメンバ以外は全てprivateを指定する。

package-private(default)

アクセス修飾子を付けないとこの可視性になる。これはパッケージ内のクラスからしか見えない。
クラス外に公開するメンバは基本的にこれにすること。
但しinterfaceを実装した場合は例外である。interfaceのメソッドは全てpublicでなければならない。Javaでは親の可視性より低い可視性は指定できないので、interfaceを実装した場合はそのメソッドはpublicとなる。
また継承した場合、package-privateより大きい可視性をもつメソッドをオーバーライドする場合も同様である。

protected

protected指定されたメンバはpackage-privateの可視性に加えてサブクラス(子クラス)からも見えるようになる。
継承を使用しないという前提に立つと、この修飾子を使用することは殆ど無い。例外としてフレームワークからの親クラスのメソッドをオーバーライドする場合、親クラスでの可視性がprotectedであった場合ぐらいである。

public

public指定されたメンバはどこからでも見える。
上述したようにinterfaceを実装した場合はそのメソッドにpublicを指定する。また親クラスのメソッドをオーバーライドする場合、親クラスでの可視性がpublicであった場合もpublicを指定する。
その他、複数のパッケージを使用するような比較的大きい規模のプログラムでは他のパッケージに対してのインターフェイスとなるメソッドにはpublicを指定する(クラス自体もpublicとする)。これは他のパッケージとの依存関係を作るので慎重に最低限に抑えるべきである。安易にpublic指定したメソッドを変更すると他のパッケージなど広範囲の影響を及ぼしてしまう。
mainメソッドは以下のようにpublicにする必要がある。
public static void main(String argv[])

2015年7月8日水曜日

LinuxでのAndroid Emulator使用時のHardware Accelerationの設定

LinuxでAndroid Emulatorを使用する場合、Hardware Accelerationを設定すると起動にかかる時間やレスポンスが改善する。Hardware AccelerationにはGraphics AccelerationとVM(Virtual Machine) Accelerationがある。ここではVM Accelerationの設定方法を示す。
基本的には http://developer.android.com/tools/devices/emulator.html#acceleration に載っていることと同じ。

VM Accelerationを行うには
  • CPUがhardware virtualizationをサポートしていること。
egrep -c '(vmx|svm)' /proc/cpuinfo
とし1以上が返ってくればCPUは対応している。
  • BIOSでhardware virtualization supportがイネーブルになっていること。

が条件となる。

LinuxではKVMをインストールすることでVM Accelerationが可能になる。インストール方法は https://help.ubuntu.com/community/KVM/Installation を参考に行った。

インストールするモジュールは(Ubuntuの場合)
qemu-kvm, libvirt-bin, ubuntu-vm-builder, bridge-utils

sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils
等でインストールする。

インストール後libvirtdのグループに自分を加える。
sudo adduser `id -un` libvirtd
その後一度ログアウトし、再びログインする。

端末で
virsh -c qemu:///system list
とし
 Id    名前                         状態
----------------------------------------------------

と表示されれば、インストールは成功。

EmulatorでVM Accelerationを行うには更に
  • Android SDK ToolsがRevision17以上
  • AVDがx86ベースのシステムイメージで作成されている
である必要がある。
この条件を満たすことを確認したらAndroid Studioのメニューの「Run」-「Edit Configurations...」で表示されたダイアログで「Emulator」タブの「Additional command line options」をチェックし、右側に
-qemu -m 512 -enable-kvm
と記述する。
後はこのx86ベースのEmulatorを立ちあげれば良い。

Emulatorが立ち上がるまで(ロック画面が表示されるまで)の時間を計測してみると

x86ベース、VM Acceleration無し 28秒
x86ベース、VM Acceleration有り 18秒
armベース 6分30秒

となった。
armベースは桁外れに遅い。

2015年7月6日月曜日

Android StudioでEmulatorが立ち上がらない時

LinuxでAndroid Studioを使用している時、Emulatorを立ち上げようとすると

NAND: could not write file /tmp/android-***/emulator-***

などというメッセージがでてEmulatorが立ち上がらない場合がある。

そのような時は /tmp ディレクトリがどうなっているか確かめる。

df -h で

Filesystem              Size  Used Avail Use% Mounted on
...
tmpfs                   256M  110M  147M  43% /tmp
...

等と出た場合はtmpfsでメモリ上に/tmpディレクトリがマウントされている。

Emulatorは500Mバイト以上のファイルサイズを/tmp/android-***ディレクトリ上に要求するので、上のようにサイズが256Mバイトだと容量が足りずあのようなエラーメッセージがでる。

解決方法としては/etc/fstabを編集して

tmpfs /tmp tmpfs rw,size=1024m 0 0

等とし、/tmpのサイズを1Gバイト以上にする。または上記をコメントアウトしてディスク上に/tmpディレクトリが存在するようにする。

ちなみに私は、/tmpは一時的なファイルが頻繁に書き込まれるディレクトリなので、SSDになるべく書き込みが少なくなるようにこの設定を行っていました。LinuxでSSDを使っている人は同じ罠にはまるかも?


Android Studioインストール時のエラー

Androidの新しい開発環境Android StudioをLinux(Linux Mint)にインストールしたら、以下のメッセージがでて進まない。

The following SDK components were not installed:
sys-img-x86-addon-google_apis-google-22 and
addon-google_apis-google-22

何度かリトライしてみたがダメ。
結局


  • ホームディレクトリの.AndroidStudio1.2を.AndroidStudio1.2.oldとリネーム
  • ホームディレクトリの.androidを.android.oldとリネーム
  • 念の為インストールしたandroid-studio以下のファイルも全部削除
  • AndroidStudioを再インストール。今度はインストールできた!

これでOK。
恐らく以前Eclipseで開発していた時から存在していた.androidがなにか悪さをしていた模様だが、何がダメだったのかはっきり分からず気持ち悪い。

2015年4月2日木曜日

国立 大学通りの桜の風景

画像を入れるテストを兼ねて国立の大学通りの桜の写真をアップ。


いい感じの時計と桜。駅から見て紀伊國屋の先のタバコ屋さんと瀬戸物屋さんの前辺りにあります。


あっという間に満開ですな。


国立高校近くの歩道橋の上から。


国立駅のホームから。

2015年3月21日土曜日

XILINX ILAの1ビットprobe(0 downto 0)にsignalを繋ぐ簡単な方法

XILINXのIP Core, ILAは1ビットのprobeを定義しても

    component ila
      port (
        clk : in std_logic;
        probe0 : in std_logic_vector(0 downto 0)
        );
      end component;

のように std_logic_vector になっている。

インスタンスに std_logic の信号を接続するときには

    signal probe0 : std_logic_vector(0 downto 0);

    probe0(0) <= some_signal;

    i_ila : ila
      port map (
        clk => clk,
        probe0 => probe0
      );

のようにしても良いのだけれど、probe0のsignal をいちいち定義するのも面倒。

知っている人には「何を当たり前のことを言っているんだ」かも知れないけど

    i_ila : ila
      port map (
        clk => clk_in,
        probe0 => (0 => some_signal)
      );

のようにすれば probe0 を定義しなくても直接 ILA のインスタンスに接続でき簡単。
意外とこういう接続方法ってやらないので、知っておくとちょっと便利な書き方です。

2015/4/2追記

probe0 => (0 => some_signal)
と書くとVivado 2014.4ではシミュレーション時エラーとなる。Synthesis, ImplementationはOK。

probe0(0) => some_signal
と書けばシミュレーション時も問題なく通る。シミュレーションもかけるならこちらの方が良い。

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日月曜日

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

最近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
補空間 $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
$$ 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\|$ となるのは $(I-P_A)(I-AA^-) = I - P_A - AA^- + P_A AA^-$。 $P_A$ と $AA^-$ は両方共 $S(A)$ への射影行列であるから $P_A AA^- = AA^-$。
よって $(I-P_A)(I-AA^-) = I - P_A - AA^- + 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$ に対し何の制約もないという違いがあった。

P81
系1の(i)の証明で $TA=0$ なのは 補助定理4.1(ii)(a) $A ({Q_B}^* A)^- A'{Q_B}^* A$ を用いて
$(I_n - {Q_B}^* A ({Q_B}^* A)^- A'){Q_B}^* A = {Q_B}^*A - {Q_B}^* A ({Q_B}^* A)^- A'{Q_B}^* A = {Q_B}^*A - {Q_B}^* A = 0$

P81
系2(i)の $C'(CC')^- C$ は P54 の(3.16)式よりS(C')への直交射影行列なので、系1(ii)より明らか。

P81
(4.12)式はP24の定理2.3とほぼ同じことを言っている?

P82
系3の $P_A = A(A'A)^-A'$ は P54 の (3.15)式より。

P83
(4.16)式は(4.15)式の $A$ に $(A,B)$ を代入し P69 の式(3.69) の $Z = 0$ を用いたもの。

P83
(4.17)式の $ \left[ \begin{array}{c,c} A & B \end{array} \right] \left[ \begin{array}{c,c} A'A & A'B \\ B'A & B'B \end{array} \right] ^- \left[ \begin{array}{c} A' \\ B' \end{array} \right] $ は $ \left[ \begin{array}{c,c} A & B \end{array} \right] = C $ と置いた時(3.15)式 $C(C'C)^-C'$ より得られる。
この式がこの定理に直接関係あるわけではないが、この後この形が何度か出てくる。

P84
注意で(4.21b)式の第2項が消去されるのはP81系1の(i)の証明で $TA=0,\, TB=0 \Rightarrow T = 0$ になるのと同じ論理。

P84
(4.24)式は $y \in E^n$ に対し $P_V y \in V$ であるから $P_V y \in V_j$ であるか $P_V y \in V_{(j)}$ であるかのどちらかである。 (4.21b)式より
$P_{j\cdot(j)^*}P_V = A_j({A_j}' Q_{(j)} A_j)^- {A_j}' Q_{(j)} P_V + Z[I_n - (Q_{(j)} A_j) ({A_j}' Q_{(j)} A_j)^- {A_j}']Q_{(j)} P_V$
第2項は $y \in E^n$ に作用させると、 $P_V y \in V_j$ の場合は P81系1の(i)の証明で $TA=0$ の場合と同じようにして 0、 $P_V y \in V_{(j)}$ の場合は明らかに 0 であるから第2項は消える。
よって $P_{j\cdot(j)^*}P_V = A_j({A_j}' Q_{(j)} A_j)^- {A_j}' Q_{(j)} P_V = P_{j\cdot(j)} P_V$
またP31の定理2.11より $V_{(j)} \subset V$ であるから $P_{j\cdot(j)} P_V = P_{j\cdot(j)}$。 よって $P_{j\cdot(j)^*}P_V = P_{j\cdot(j)}$ が得られる。

P85
注意の $P_{(j) \cup B} = P_{(j)} + P_B$ はP31の定理2.10より求まる。

P85〜P88の4.2の節は今後の話にあまり影響しないだろうと想像して、ちゃんと読まず流し読みした。 必要になったら戻ってもう一度読む。

P89
正規方程式 $A'Ax = A'b$ の両辺に $A(A'A)^-$ をかけて、左辺はP54定理3.5(ii)より $A(A'A)^- A'Ax = Ax$。右辺はP69定理3.16(iii)より $A(A'A)^- A'b = A{A_l}^- b$。

P89
定理4.8で $M$ が非負定値行列のとき、 $M = N'N$ となるのはP18より $M = U \Delta U'$ と分解でき、 全ての固有値は非負であるから実数の範囲で $\sqrt{\lambda}$ が存在する。 よって $M = N'N$ なる $N$ が存在する。

P89
定理4.8で $A(A'MA)^- A'MA = A$ となるのは左辺を転置してP54の(3.12)式を用いると $(A(A'MA)^- A'MA)' = A'MA(A'MA)^- A'$。$A'MA(A'MA)^-$ は $S(A'MA)$ への射影行列であるから 仮定の $\mathrm{rank}(A'MA) = \mathrm{rank}(A) = \mathrm{rank}(A')$ と合わせると S(A')への射影行列である。
よって $(A(A'MA)^- A'MA)' = A'MA(A'MA)^- A' = A'$。

P90
系(i)の $\mathrm{rank}(A'Q_B A) = \mathrm{rank}(A)$ はP79の補助定理4.1より。
ちなみにここでは明示していないが $Q_B$ は非負定値行列なので ${Q_B}' = Q_B$ で直交射影行列である必要がある。
また $x' Q_B x = x' {Q_B}' Q_B x = \| Q_B x \|^2$ であるので $Q_B$ は非負定値行列である。

$P_{A \cdot B} = A(A'Q_B A)^- A'Q_B$ は P81の(4.9)式より。

P90
系(ii)は(i)より ${\| b - P_{A \cdot B}b \|_{Q_B}}^2 = (b - P_{A \cdot B}b)'Q_B (b - P_{A \cdot B}b) = (b - P_{A \cdot B}b)'{Q_B}' Q_B (b - P_{A \cdot B}b) = (Q_B b - Q_B P_{A \cdot B}b)'(Q_B b - Q_B P_{A \cdot B}b)$
$Q_B P_{A \cdot B} = Q_B Q_B P_{A \cdot B} = Q_B P_{A[B]}$ であるから(i)式の $P_{A \cdot B}$ を $P_{A[B]}$ に置き換えた(ii)式も成り立つ。

P90
「射影行列 $P_{A \cdot B}$ は擬ノルム $\| x \|_{Q_B}$ をもつ部分空間S(A)への直交射影行列」とは 内積が $(a,b)_{Q_B} = a' Q_B b$ で定義される空間での直交射影行列だと思われる。直交の意味が $a' Q_B b = 0$ となる。

P90
定理4.9の(i),(iii)はP89の定理4.8にも出てきた $A(A'MA)^- A'MA = A$ を用いて証明する。

P91
補助定理4.3の $Cx = d \Rightarrow x = C^- d + Q_{C'}z$ で $Q_{C'}z \in S(C')^\bot = \mathrm{Ker}(C)$ であるので左から $C$ をかければこの項は消える。

P93
(4.51)式はP90 (4.47a)式より。
$P_{A \cdot B}$ 、つまり $S(B)$ に沿った $S(A)$ への射影行列と書けるのはP81の(4.9)式より。

P94
注意の ${A_{l(M)}}^- = A'(A'MA)^-A'M$ とした時、 $A{A_{l(M)}}^- A = A$ となるのは P89 定理4.8 の証明の中の式を用いる。

P96
(4.66)式は $A'(A^-)'$ が $S(C')$ に沿った $S(A')$ への射影行列だから $A'(A^-)' = P_{A' \cdot C'}$。 P81 (4.9)式より $P_{A' \cdot C'} = A'(A Q_{C'} A')^- A Q_{C'}$。

P96
定理4.13の証明
(i)→(ii) $A {A_{m(C)}}^- A = A \Rightarrow A {A_{m(C)}}^- A Q_{C'} = A Q_{C'}$
両辺の転置を求めると $({A_{m(C)}}^- A Q_{C'})' A' = Q_{C'} A'$。
よって ${A_{m(C)}}^- A Q_{C'} A' = Q_{C'} A'$
(ii)→(iii) (ii)式に右から $(A Q_{C'} A')^- A$ をかけると左辺は ${A_{m(C)}}^- A Q_{C'} A' (A Q_{C'} A')^- A = {A_{m(C)}}^- (A' (A Q_{C'} A')^- A Q_{C'} A')'$ (4.3)式から $(A' (A Q_{C'} A')^- A Q_{C'} A')' = (A')' = A$ となるから ${A_{m(C)}}^- A = Q_{C'} A'(A Q_{C'} A')^- A$
(iii)→(i) (iii)式に左から $A$ をかけると右辺は(4.3)式を用いて $A Q_{C'} A'(A Q_{C'} A')^- A = (A' (A Q_{C'} A')^- A Q_{C'} A')' = A$。 よって $A {A_{m(C)}}^- A = A$。
(iii)式に右から $Q_{C'}$ をかけると ${A_{m(C)}}^- A Q_{C'} = Q_{C'} A'(A Q_{C'} A')^- A Q_{C'}$。 右辺は対称であるから左辺も対称となる。

P97
定理4.14の証明の
$P_{A'} (P_{A'} Q_{C'} P_{A'})^- P_{A'} Q_{C'} (Q_{C'} P_{A'} Q_{C'})^- \in \{Q_{C'} P_{A'} Q_{C'}\}^-$ は、左右両方から $Q_{C'} P_{A'} Q_{C'}$ をかけて、(4.3)式と(4.4)式を用いれば証明できる。

P97
(4.73a)式で $Q_{C'} P_{A'} (P_{A'} Q_{C'} P_{A'})^- P_{A'} = Q_{C'} A' (A Q_{C'} A')^- A$ となるのは左辺を転置すると
$P_{A'} (P_{A'} Q_{C'} P_{A'})^- P_{A'} Q_{C'}$
これは(4.9)式との比較から $S(C')$ に沿った $S(P_{A'})$ への射影行列となる。 なお $(P_{A'})' = P_{A'}$ を用いている。
$S(P_{A'}) = S(A')$ であるからこれは $S(C')$ に沿った $S(A')$ への射影行列となる。
これを改めて(4.9)式を使用して書くと
$A' (A Q_{C'} A')^- A Q_{C'}$
転置を戻せば
$Q_{C'} A' (A Q_{C'} A')^- A$
となる。

P98
3番目の注意の $A {A_{m(N)}}^- A = A$ は ${A_{m(N)}}^- = N A' (ANA')^-$ を代入して $ANA'(ANA')^- A$。
$ANA'(ANA')^-$ は $S(ANA')$ への射影行列。また $\mathrm{rank}(ANA') = \mathrm{rank}A$ を満たす$N$を考えると(P89を参照のこと) $S(ANA') = S(A)$。
よって$A {A_{m(N)}}^- A = A$。

P102
定理4.17(i)は $({Q_{C'}}^*)' = {Q_{C'}}^*$ でないと成り立たないように思えるが ${Q_{C'}}^* = I_m - C'(C')^-$ だと一般には成り立たないはず?

P103
定理4.18の証明で $S((\widetilde{P})'\widetilde{P}) = S(A' Q_B A)$ の証明は良く解らなかった。
別に考えると $(\widetilde{P})' = P_{A' \cdot C'}$ なので $S(C')$ に沿った $S(A')$ への射影行列。よって $S((\widetilde{P})') = S(A')$。
一般に $\mathrm{rank}(A) = \mathrm{rank}(A A')$ であるから、 $S((\widetilde{P})'\widetilde{P}) = S((\widetilde{P})') = S(A')$
$S(A' Q_B A) \subseteq S(A')$ は明らかであるから $S((\widetilde{P})'\widetilde{P}) \supseteq S(A' Q_B A)$
イコールを証明しなくても (3.47)式を用いる条件としては十分。

$Q_{C'} A'(A Q_{C'} A')^- A' Q_{C'} \in \{(A'(A Q_{C'} A')^- A)^-\}$ は
$X$ の一般逆行列 $X^-$ は $X X^-X = X$ を満たすのであるから
$A'(A Q_{C'} A')^- A \cdot Q_{C'} A'(A Q_{C'} A')^- A' Q_{C'} \cdot A'(A Q_{C'} A')^- A = A'(A Q_{C'} A')^- A$
を証明すれば良い。さらにこの後の計算も同様の考えで証明できる。

第5章

P112
定理5.1 (iii) の証明の $A'Ax_1 = A'Ax_2$ の $x_1, \, x_2$ は仮定にでてくる $x_1 \in V_2 , \, x2 \in W_2$ ではなく $x_1 \in V_2, \, x_2 \in V_2$。

P114
$A_1$ の零空間は $V_{21} \dot{\oplus} W_2$ では?

P120
$P_F = F(F'F)^{-1}F'$ は P26 の定理2.6 より。

P121
定理5.4の証明は (5.32)式 $A = \mu_1 Q_1 + \cdots + \mu_r Q_r$ を $AA',\,A'A$ に代入すれば良い。

P124
補助定理5.6(i) の証明で $x'x = z'V_2 V_2'z$ となるのは、補助定理5.1の証明から $V = (V_1, V_2)$ とすると $x \in S(V)$。更に $V_1'x = 0$ より $x \in S(V_2)$
$S(V_2)$ への射影行列は $V_2 V_2'$ であるから $V_2 V_2' x = x$
よって $x'x = x'V_2 V_2'x = z'(I-V_1V_1')V_2V_2'(I-V_1V_1')z = z'V_2V_2'z$

P125
系の証明
$x$ は $x = \alpha_1 v_1 + \cdots + \alpha_r v_r$ と表せる。 $B'x=0$ の条件は $s$ 個の方程式が含まれるので $\alpha_1, \cdots \alpha_r$ のうちその方程式で $0$ とできるのは最大 $s$ 個である。 残った$\alpha$ のうち最小の添字を持つものを $\alpha_j$ とすると、これまでの証明と 同様にして
$\mathrm{Max}_{B'x=0}\|x'A'Ax\|/\|x'x\| = \lambda_j(A'A)$
最も値が小さい $\lambda_j$ は $\alpha_1, \cdots \alpha_s$ が全て $0$ の場合であるから $\lambda_{s+1}$ となる。よって
$\mathrm{Max}_{B'x=0}\|x'A'Ax\|/\|x'x\| \ge \lambda_{s+1}(A'A)$

P126
補助定理5.7 $\lambda_j(AB) = \lambda_j(BA)$ は $ABx = \lambda x$ に左から B をかけて $BABx = \lambda Bx$。$Bx = y$ とおけば $BAy = \lambda y$。 よって $y = Bx \neq 0$ の場合、 $\lambda$ は $BA$ の固有値でもある。
固有値 0 を除いているのは $n > m$ の場合を考えると $\mathrm{rank}(AB) \le m$ であるから $|AB| = 0$ となり $|AB|$の固有値の1つは 0 となる。 一方 $\mathrm{rank}(BA) = m$ の場合は $|BA| \neq 0$ であるから 0 は $|BA|$ の固有値とはならない。

P127
補助定理5.8 の $T_r$ は $(m, r)$型の行列。

P127
$$ V'_{[r]}V \Delta^2_r V'V_{[r]} = \Delta^2_{[r]} = \begin{bmatrix} \lambda_1 & & & 0 \\ & \lambda_2 & & \\ & & \ddots & \\ 0 & & & \lambda_r \\ \end{bmatrix} $$ の式で本文で「成立するとき」といっているのは最後の等号のこと。 最初の等号は $\Delta^2_{[r]}$ の定義。

P127
ポアンカレの分離定理の説明で対称行列に限定しているのは対称行列の固有値は実数で 異なる固有値の固有ベクトルは直交するから。

P128
P26の(2.13)式の $P = A(A'A)^{-1}A'$ で $A = (a_1, a_2, \cdots, a_m)$ の各列ベクトルを互いに直交する単位ベクトルとすれば $P = T_k T_k', \, T_k' T_k = I_k$ となる。

P128
系の証明。
$ A'A = B'B + C'C = [B', C'] \begin{bmatrix} B \\ C \\ \end{bmatrix} $
$ B'B = [B', C'] \begin{bmatrix} I & O \\ O & O \\ \end{bmatrix} \begin{bmatrix} B \\ C \\ \end{bmatrix} $
定理5.9(i) より $\lambda_j(A'A) \ge \lambda(B'B)$。

P128
例5.3 は $X_R' X_R = X_R' P_M X_R + X' X \Rightarrow X_R' X_R - X' X = X_R' P_M X_R$。 右辺は $X_R' P_M X_R = X_R' P_M' P_M X_R = (P_M X_R)' (P_M X_R)$ となり P18 定理1.12 より非負定値行列。よって左辺も非負定値行列なので $\lambda_j(X_R' X_R) \ge \lambda_j(X'X)$。

P129
定理5.10(ii)の証明で第2の等号が成立する場合の説明について。
$I_n - P_B = TT', \, T'T = I_{r-k}$ と分解すると $\lambda_j\{A'(I_n-P_B)A\} = \lambda_j\{A'TT'A\} = \lambda_j\{T'AA'T\}$ となり $A = U \Delta V'$ と特異値分解すると
$AA' = U \Delta^2 U' = \lambda_1 u_1 u_1' + \cdots + \lambda_r u_r u_r'$
$T = [u_{k+1}, \cdots ,u_r]$ とすると
$T'AA'T = \begin{bmatrix} \lambda_{k+1} & & 0 \\ & \ddots & \\ 0 & & \lambda_r \\ \end{bmatrix} $
よって $\lambda_j\{A'(I_n - P_B)A\} = \lambda_{k+j}(A'A)$ となる。

P130
$(I_n - U_{(r-k)}U_{(r-k)}') = (UU'- U_{(r-k)}U_{(r-k)}') = u_1 u1' + \cdots + u_n u_n' - (u_{k+1} u_{k+1}' + \cdots + u_r u_r') = u_1 u1' + \cdots + u_k u_k' + u_{r+1} u_{r+1}' + \cdots + u_n u_n'$
$u_{r+1} u_{r+1}', \cdots ,u_n u_n'$ の項は全体の計算のなかで消えてしまうので無視して良い。
よって $(I_n - U_{(r-k)}U_{(r-k)}')A = U_{[k]}U_{[k]}'U \Delta V'$

計算式の途中の $ \begin{bmatrix} I_k & \\ & O \\ \end{bmatrix} $ は $[I_k, O]$ のはず。

この本を読む目的は特異値分解を理解することだったのでこれにて終了。 第6章は応用でありもっと分かりやすい本がありそうなので必要になったら それらを読む。
それにしてもなかなか読むのが困難な本だった… これまで読んだ数学の本の中で一番読みづらかったかも。 良くも悪くもとても考えさせられるという点ではある意味面白かったけど、 人に推められる本ではないな。 まあもう絶版なので入手も困難だが。

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);
}