バージョン管理された人

subversionで管理されてます

相対的内部と内部のイメージ

相対的内部は初回だとどんな集合なのかイメージしにくいと思う.
なので, どんな集合をイメージしているのかを簡単に記しておく.

アフィン包

相対的内部ではその定義にアフィン包を利用する.
最初の頃, これが自分にはどんな集合かがイメージしにくかった.

定義だけ述べれば簡単で,集合 S \subseteq \mathbb{R}^nアフィン包 \mathrm{aff}(S)とは Sを含むような最小のアフィン集合のことを指す.
アフィン集合とは線形空間を平行移動や回転させたような集合のことをいう.
イメージにすれば

のような感じだ.

このように集合を包む最小のアフィン集合をアフィン包といっているが, より具体的には

  •  \mathbb{R}^3内の球を含む最小のアフィン集合は \mathbb{R}^3
  •  \mathbb{R}^3内の y = 1という平面を含む最小のアフィン集合は平面 y = 1自身
  •  \mathbb{R}^2内の (x, y) = (1, 1)を含む最小のアフィン集合は (x, y) = (1, 1)を通る直線

 Sのアフィン包 \mathrm{aff}(S)は図のような Sを内包する平面. 平面は縦横に無限に広がっていることに注意
といったようなものが上げられる.

内部

相対的内部の理解を深めるために, まず, 内部について簡単に書いておこう.
 \mathbb{R}^nでは内部を利用するのに開球という集合を用いる.

 x \in \mathbb{R}^nにおける開球とは


  \begin{align}
    B(x, \epsilon) = \{x' : \|x' - x\| < \epsilon\}
  \end{align}
という集合のことをいう.
つまり, ある距離 \epsilon > 0内にある点を集めたもののことをいう.

これを使って内点を定義する.
つまり, 部分集合 S \subseteq \mathbb{R}^n内点とは,


  \exists \epsilon > 0; B(x, \epsilon) \subseteq S
となる x \in Sと定義する.
つまり, 開球を取れる点のことを内点というのである.

より一般には集合 Xの部分集合 S \subseteq Xの内点とは


  \begin{align}
    x \in U_x \subseteq S
  \end{align}
となる開集合 U_xが存在する Sの点 x \in Sのことをいう.

これら内点を集めた集合を S内部 \mathrm{int}(S)という.

これは以外にも厳しい制約で例えば図のような集合の内側の点の集合を集めようとすると,

球が常に Sからはみでている
のようにどんな小さな \epsilon > 0をとっても開球が集合の外側にはみ出してしまうため, 集合の内部を考えることができない.

相対的内部

しかし, 先程の図のような集合にも内部のようなものを考えたい.
そこで登場するのが相対的内部である.

相対的内部を定義するにはアフィン包を用いる.
つまり, 部分集合 S \subseteq \mathbb{R}^nの相対的内点とは


  \begin{align}
    \mathrm{aff}(S) \cap B(x, \epsilon) \subseteq S
  \end{align}
となるような開球が存在することをいい, 相対的内点を集めたものを相対的内部 \mathrm{ri}(S)という.

このままだとどんな集合か分かり辛いと思うので, イメージを載せる.

 Sのヘリ(点線部分)以外が相対的内部となる
このようにすれば上手く内部のようなものが取れていることがわかると思う.

なぜこのようなわかりにくい定義を利用するのかというと, 先程も言ったように例えば \mathbb{R}^3内で平たい集合の内部を考えるときに開球をとろうとするとはみ出してしまうような場合を避けるためである.
アフィン包との共通部分だけを考えれば, 次元を落とし, その落とした次元における開球との交わりだけで考えられるということが発想だろう.
つまり,  \mathbb{R}^3内の平面や直線の内部のような集合は3次元の開球で扱えないので, より次元を落とした \mathbb{R}^2 \mathbb{R}^1の開球だけで議論したいということである.

Pythonのclassの構文について

タイトルのまんま.

Pythonのclass構文はJavaなどのように特殊な構文解析を実装しているわけではないらしい. python-history-jp.blogspot.com 単純にclass:の後ろに書いてある文を無名関数に入れて, クラス辞書というクラスの情報を管理するための辞書に, クラス変数やメソッドの情報を入れているだけ. Python的に正しい文であれば(returnを除いて)valid. なので, 次のような例もOK.

class Double:
    a = []

    for i in range(10):
        if i % 2 == 0:
            a.append(i * 2)

print(Double.a) # [0, 4, 8, 12, 16]が表示される

wandbox.org

あまり使うとは思わないけど, 例えば環境変数によって用意するクラスやメソッドを変えたいとか, withimport時にファイルの中身を利用してなにかしたいときとかに使える...のだろうか.

ちなみにクラスをインポートしたものはdelで削除できる(例えばimport randomとしたものをdel randomでアンインポート(?)できる). これを使って, withとか環境変数とかで何かできるかもしれない. ただ, これはこの挙動を知っているものでしか通用しないので, あまり使わない方が良いのかもしれない.

ルベーグ外測度のイメージ

外測度, 特にルベーグ外測度についてのイメージを記しておく.

準備

ルベーグ外測度自体の定義の述べる前にいくつか準備をしておく.

まず, 区間 とは n次元ユークリッド空間 \mathbb{R}^nの部分集合 I = \prod_{i = 1}^{n} [a_i, b_i]のことをいう.
ただし,  \prod_{i = 1}^n S_i = S_1 \times S_2 \times \cdots \times S_n を指す.
これはどういうことかというと,


    \begin{align}
      \prod_{i = 1}^1 [a_i, b_i] = [a_1, b_1] = \{x : a \leq x \leq b\}
    \end{align}

  •  n = 2のとき, 空間上の x軸と y軸に平行な四角の形をした閉領域


    \begin{align}
      \prod_{i = 1}^2 [a_i, b_i] &= [a_1, b_1] \times [a_2, b_2] \\
        &= \{(x, y): a_1 \leq x \leq b_1, a_2 \leq y \leq b_2\} \\
    \end{align}

  •  n = 3のとき, 空間上の x軸と y軸,  z軸に平行な直方体の形をした閉領域


    \begin{align}
      \prod_{i = 1}^3 [a_i, b_i] &= [a_1, b_1] \times [a_2, b_2] \times [a_3, b_3] \\
        &= \{(x, y, z): a_1 \leq x \leq b_1, a_2 \leq y \leq b_2, a_3 \leq z \leq b_3\}
    \end{align}

を指している.
より高次元では直方体のような形をしたものを区間と称している.

この区間の体積を


  \begin{align}
    \left|\prod_{i = 1}^n[a_i, b_i]\right| = (b_1 - a_1) \times (b_2 - a_2) \times \cdots \times (b_n - a_n)
  \end{align}

と定義する.
これは3次元や2次元の場合を考えてもらえれば直感的だろう.
なので, この定義は直方体や四角形の面積を計算する計算式を3次元よりも高次元な場合へ拡張しているものであることがわかることと思う.

外測度

集合 X上の外測度とは次の公理を満たす集合関数 m: 2^X \to \mathbb{R} \cup \{+\infty, -\infty\}のことをいう.

1. 空集合 \emptysetに対し,


    \begin{align}
      m(\emptyset) = 0
    \end{align}
2.  Xの部分集合 A,  Bに対し,

    \begin{align}
      A \subseteq B \implies m(A) \leq m(B)
    \end{align}
3.  Xの部分集合列 \{E_1, E_2, \cdots\}に対し,

    \begin{align}
      m\left(\bigcup_{i = 1}^\infty E_i\right) \leq \sum_{i = 1}^\infty m(E_i)
    \end{align}

ルベーグ測度

このままでは抽象的すぎるので, ルベーグ外測度 m^*: 2^{\mathbb{R}^n} \to \mathbb{R} \cup \{+\infty, -\infty\} \mathbb{R}^nに対し, 公理を満たすように体積 |\cdot|: 2^{\mathbb{R}^n} \to \mathbb{R} \cup \{+\infty, -\infty\}を用いて定義される.

具体的には部分集合 A \subseteq \mathbb{R}^nを被覆するように選んだ任意の区間 I = \{I_1, I_2, \cdots\}, すなわち,


  \begin{align}
    A \subseteq \bigcup_{i = 1}^\infty I_i
  \end{align}
を満たす Iの体積の和の下限がルベーグ外測度となっている.


  \begin{align}
    m^*(A) = \inf\left\{\sum_{i = 1}^\infty |I_i|: A \subseteq \bigcup_{i = 1}^\infty I_i\right\}
  \end{align}

ルベーグ測度のイメージ

上の定義だけだと何だかよくわからないと思うので, イメージを記す.
なお, 簡単のため1次元の場合で書くが, より次元の高い場合も同じ.

そもそも図のように重なっているような場合は無駄が発生している.

重なっている部分がある場合
もちろん,  Aを被覆できる区間列ならなんでも良いので,その和がAより大きい, つまり図の Aではない部分を含んでいるようなものや \mathbb{R}^nそのものであっても構わないが,  \infが付いているのでその中でも最小のものを選択しなければならない.

なので, 無駄なく区間のヘリの部分のみが共通部分となるように区間を用意して(図では閉区間の始点と終点のみを共有するように)やるのが最も値が小さくなることがわかると思う.

重なる部分がないのが最小
このようにすれば問題なく測度を計算することができる.
ただ, 上のは無限個の閉区間を足していることに注意して欲しい.
これは図のように Aを被覆する有限個の閉区間と無限個の空集合が並んだ区間列をとればよい(空集合は閉かつ開)と考えるとわかりやすいと思う.
つまり, 空でない閉区間 I_1から I_mとして


  \begin{align}
    A &= \bigcup_{i = 1}^\infty I_i \\
      &= I_1 \cup I_2 \cup \cdots \cup I_m \cup \emptyset \cup \cdots \cup \emptyset \cup \cdots \\
      &= I_1 \cup I_2 \cup \cdots \cup I_m \\
      &= \bigcup_{i = 1}^m I_i
  \end{align}

となるような区間列をとっていると考えればよいとおもう.

psqlのバージョン違いによる挙動

psqlコマンドはメジャーバージョンが違うとパスワードに認証などを通さなくなるみたい。 例えば、PostgreSQL 9.6な環境にPostgreSQL 10.5のpsqlを利用しようとしても弾かれる。 事前に入るPostgreSQLのバージョンはちゃんとチェックしておこう。

Firestoreをウェブアプリで使う

まだドキュメント化されていないっぽいところもあったので、メモしておく。

まず、Cloud Firestoreのルールを次のように変更しておく。

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

肝はallow read, write: if request.auth.uid != null;のところ。 デフォルトだと

allow read, write: false;

となっていて、全ての書き込み/読み込みが制限されているので、 認証したアカウントのみ書き込み/読み込みをさせたい場合は falserequest.auth.uid != nullと書き換えなければならない。

次にコードを書かなければならないわけだけど、まだ日本語の スタートガイド には書いてないところがあるっぽくて罠だった。 まずはプロジェクトのトップindex.tsとかに Firestoreの初期化コードを埋め込んでおく必要がある。

const firestore = firebase.firestore();
const firestoreSettings = {
  timestampsInSnapshots: true,
};
firestore.settings(firestoreSettings);

この初期化コードは全てのFirestore`関連のメソッドを実行する前に実行しなければならない。 以上をやっておかないと画像のように怒られる。 f:id:moba1:20180923013506p:plain

あとはデータを書き込めばOK。

database.collection('users').doc('user_id_1').set({
  username: 'test',
  email: 'test@example.com',
});

例ではusersコレクションに

{
  'user_id_1': {
    'username': 'test',
    'email': 'test@example.com'
  }
}

というデータを追加している。

firebaseでのwarning

TypeScriptで

import firebase from 'firebase';

とかしたらwarning吐かれた。

f:id:moba1:20180922173208p:plain
warning内容

今時は

import firebase from 'firebase/app';

してから個別に必要なパッケージを入れろとのことらしい。

// 個別に必要なものをインポート
import 'firebase/auth';
import 'firebase/database';
import 'firebase/firestore';
import 'firebase/messaging';
import 'firebase/functions';