統計検定準1級 25.因子分析・グラフィカルモデル

因子分析:複数変数の変動メカニズムを、少数の共通の要因によって集約する分析手法。例えば、複数問からなる数学の試験を、複数人の生徒が受験した場合を考える。各問の得点は独立に決定されるわけではなく数学が得意な人はどの問いも得点が高く、苦手な人は低い傾向にある。つまり、「数学の能力」のような直接は観測できない共通の要因が背後に存在し、その影響で各問の得点が決定されれていると考えられる。この共通の要因を共通因子と呼ぶ。
x_{ij}を生徒iの問jの得点とする。x_{ij}は問ごとに平均0、標準偏差に1に標準化されているとする。生徒iの共通因子の値をf_iと書き、生徒i因子スコアという。
x_{ij}=a_{j}f_{i}+d_{j}u_{ij}
V[x_{ij}]=a_j^2+d_j^2=1
のように定まることを想定したモデルを1因子モデルという。このとき、a_j因子負荷量u_ij独自性因子d_{j}独自係数
a_j,d_jは道パラメータであり、最尤推定法を用いて推定する。
K因子分析
x_{ij}=a_{j1} f_{i1}+\cdots a_{jK}f_{iK}+d_{j}u_{ij}
と表される。
X=(x_{ij})_{1\leq i \leq n, 1\leq i \leq p}, F=(f_{ij})_{1\leq i \leq n, 1\leq i \leq p}, A=(a_{ij})_{1\leq i \leq n, 1\leq i \leq p}
U=(u_{ij})_{1\leq i \leq n, 1\leq i \leq p}, D=diag(d_1,...,d_p)
とするとき
X=FA^\mathrm{T}+UD
ここで、TTT^\mathrm{T}の対角成分がすべて1であるようなK \times K正則行列とすると、X=FA^\mathrm{T}+UD=(FT)(T^{-1}A^\mathrm{T})+UD
が成立し、因子スコアと因子負荷行列の取り方は無数に存在することが分かる。
この因子の解釈を容易にするような座標軸を探索する手続きを回転と言い、Tを直交行列に限る場合の開店を直交回転という。また、因子負荷行列の各要素を2乗してできたp \times K行列の各列の分散を最大にするような直交行列をリマックス回転という。

統計検定準1級 22.主成分分析


主成分分析とは、多変量の情報を少数個の主成分と呼ばれる合成変数で記述する方法。情報の縮約や次元圧縮を目的とした手法である。高次元のデータのばらつきが、少数個の主成分からなる低次元空間内で出来るだけ再現できるようにする。したがって主成分の分散最大化と主成分間の無相関化(直行化)が必要である。これは固有値固有ベクトルを求めることにより実現できる。
100点満点のテストのようにデータの単位が揃っている場合は、分散共分散行列と相関行列のどちらを使って主成分分析をしても良い。単位が揃っていない場合は、相関行列を使って無単位化を行った主成分分析が適切である。

標本の分散共分散行列と相関行列

変数をp個、個体数をnとしてデータをXのように表現する。
X=(X_{i,j})_{1\leq i \leq n,1\leq j\leq p}=\begin{pmatrix} x_{1,1} & \cdots & x_{1,p} \\ \vdots & \ddots & \vdots \\ x_{n,1} & \cdots & x_{n,p}  \end{pmatrix}
また、行と列それぞれの和をx_{\cdot j},x_{i \cdot}で表現する。
\displaystyle x_{\cdot j}=\sum_{i=1}^n x_{i,j} \quad (j=1,...,p), \quad x_{i,\cdot}=\sum_{j=1}^p x_{i,j} \quad (i=1,...,n)
この時、変数jの平均は\bar{x_{\cdot j}}=x_{\cdot j}/nとなり、分散はs_{j,j}=\dfrac{1}{n-1}\sum_{i=1}^n (x_{i,j}-\bar{x_{\cdot j}})^2、変数jと変数kの共分散はs_{j,k}=\dfrac{1}{n-1}\sum_{i=1}^n (x_{i,j}-\bar{x_{\cdot j}})(x_{i,k}-\bar{x_{\cdot k}})で表せられる。
さらに変数jと変数kの標本相関係数r_{j,k}r_{j,k}=\dfrac{s_{j,k}}{\sqrt{s_{j,j}s_{k,k}}} = \dfrac{\sum_{i=1}^n (x_{i,j}-\bar{x_{\cdot j}}) (x_{i,k}-\bar{x_{\cdot k}})} {\sqrt{\sum_{i=1}^n (x_{i,j}-\bar{x_{\cdot j}})^2 \times \sum_{i=1}^n (x_{i,k}-\bar{x_{\cdot k}})^2}}

標本の分散と共分散を並べた行列を標本分散共分散行列S、標本相関係数を並べた行列を標本相関行列Rと表す。
S=\begin{pmatrix} s_{1,1} & \cdots & s_{1,p} \\ \vdots & \ddots & \vdots \\ s_{p,1} & \cdots & s_{p,p} \end{pmatrix}, \quad R=\begin{pmatrix} 1 & r_{1,2} & \cdots & r_{1,p} \\ r_{2,1} & 1 & \cdots & r_{2,p} \\ \vdots & \vdots & \ddots & \vdots \\ r_{p,1} & r_{p,2} & \cdots & 1 \end{pmatrix}
s_{j,k}=s_{k,j},\quad r_{j,k}=r_{k,j}であるため、SとRは共に対称行列である。また、r_{j,j}=1であり、Rの対角成分は1である。

SもしくはRj番目の固有値固有ベクトルをそれぞれ\lambda_j, u_jとする。

j主成分y_jy_j=u_j \cdot x=x_1u_{1,j}+\cdots +x_pu_{p,j}
j主成分c_jc_j=\lambda_j / (\lambda_1+\cdots +\lambda_p)
主成分負荷量:r_{y_j,x_k}=\dfrac{\sqrt{\lambda_j} u_{k,j}}{\sqrt{s_{k,k}}}
で表される。


参考:

統計検定準1級の学習10.検定の基礎と検定法の導出

統計的仮説検定の考え方

 統計的仮説検定とは:データを用いて、数学的背理法と類似した方法により、仮説を検証する手法
 例えば、ある母集団の平均(母平均)がある値とは異なることを示したい場合
 ①「母平均はある値とは異なる」という命題Aを証明したい→対立仮説
 ②まず命題Aを否定し、「母平均はある値と等しい」と仮定する→帰無仮説
 ③「母平均はある値と等しい」と仮定したもとで、データを取り、標本平均を求める。この標本平均が②の仮定の下では、極めて稀にしか得られない値であることを観察する
 ④命題Aの否定「母平均はある値と等しい」はおかしいと判断し、命題A「母平均はある値と等しい」は正しいと判断する

検定法の導出

 確率変数X正規分布 N(\mu,\sigma^2) について、母分散\sigma^2が既知で、母平均\mu\mu_0ではないことを検証する統計的仮説検定を考える。
対立仮説H_1:母平均\mu\mu_0でない
帰無仮説H_0:母平均\mu\mu_0である
互いに独立な確率変数X_1,X_2,...,X_nの標本平均\bar{X}正規分布N(\mu,\sigma^2/n)に従うことから、統計量Z=\dfrac{\bar{X}-\mu}{\sqrt{\sigma^2/n}}は標準正規分布N(0,1)に従う。ここでH_0が正しいと仮定すると、統計量Z_0=\dfrac{\bar{X}-\mu_0}{\sqrt{\sigma^2/n}}は標準正規分布に従う。このZ_0検定統計量と呼ばれる。
帰無仮説H_0のもと稀だと判断する基準を有意水準という。有意水準5%の場合|Z_0|\geq1.96のとき帰無仮説H_0を棄却する、あるいは有意水準5%で有意であるという。
両側検定:上例のようにZ_0の棄却域を分布の両側(|Z_0\geq1.96])に設定している検定
片側検定:対立仮説を\mu\neq\mu_0ではなく、\mu\ge\mu_0\mu\le\mu_0の場合、Z_0\geq1.96Z_0\leq1.96のように分布の片側だけの棄却域が適切な場合がある。
P値:帰無仮説H_0の下で、観察されたデータがどれだけ稀かを示す確率である。P値はデータが観測されて計算される値であり、有意水準とは異なる概念である。

サンプルサイズ設計

第一種の過誤帰無仮説H_0が真であるのに、有意と判定してしまうこと。有意水準\alphaによる制御される。
第二種の過誤:対立仮説H_1が真であるので、有意と判定されないこと。その確率\betaに対し、1-\beta検出力とよぶ。
帰無仮説H_0の時と対立仮説H_1の時の、検定統計量Z_0の分布を考える。帰無仮説H_0の時はZ_0\sim N(0,1)である(分布0)。一方、対立仮説H_1の時は母平均を\mu_1とすると、Z_0\sim N(\dfrac{\mu_1-\mu_0}{\sqrt{\sigma^2/n}},1)となる(分布1)。
これら2つの分布の一部は重なっており、棄却限界値を境として、棄却限界値より大きい分布0の面積を第一種の過誤確率\alphaと、棄却限界値より小さい分布1の面積を第二種の過誤確率\betaとして定義できる。つまり、棄却限界値の値により\alpha\betaトレードオフ関係にある。ただし、分布1の平均値より\mu_1-\mu_0が大きくなるか、\sqrt{\sigma^2/n}が小さくなるつまりnが大きくなる時に2つの分布が離れ、\alpha,\betaの面積がともに小さくなることが分かる。

抜取検査

抜取検査:検査ロットから、あらかじめ定められた抜き取り検査方式に従って、サンプルを抜き取って試験し、その結果をロットの判定基準と比較して、そのロットの合格・不合格を判定する検査
①検査ロットを定め、そのロットを構成する製品の数Nを特定する。
②検査ロットから抽出する標本の大きさnを定める。
③検査ロットの合格・不合格の判定基準を定める。
判定基準を、標本数n中の不良個数kがcより小さいとき合格、大きいとき不合格とする。ここでcは合格判定個数と呼ぶ。
合格ロットの不良率をp_0、不合格ロットの不良率をp_1とすると、本来は合格である検査ロットが不合格になる確率FP
\displaystyle FP=\sum_{k=c+1}^n \begin{pmatrix} n \\k \\ \end{pmatrix} p_0^k(1-p_0)^{n-k} →生産者危険
となり、一方本来は不合格である検査ロットが合格になる確率FN
\displaystyle FP=\sum_{k=1}^n \begin{pmatrix} n \\k \\ \end{pmatrix} p_1^k(1-p_1)^{n-k} 消費者危険

参考:

GCE(google compute engine)インスタンスの自動停止・スケジュール

GCE(google compute engine)で、利用しない時間にインスタンスを停止したい。
そのために、GAE(google app engine)で、起動・停止用アプリケーションを設置し、それらのアプリケーションをGAEのcronで定期実行する。

目次
☆GAEとは
☆必要ファイル
 -crom.yaml
-app.yaml
-実行スクリプト(instance.py)
-libs
☆アプリケーションのデプロイ

―――――――――

☆GAEとは
App Engineはインフラ部分を管理せずにWEBアプリを実装できる仕組み
過去記事を参照
http://tug-uca.hatenablog.com/entry/2018/06/12/182533


☆必要ファイル
cloud shell上で必要ファイルを以下のように配置する。

任意のフォルダ
├─ lib
|   └─ ....
└─ cron.yaml
└─ app.yaml
└─ 実行スクリプト(instance.py)

本記事の大部分は以下の記事を参考にしている。
https://qiita.com/hatappi/items/a756ea8fd29d7d802e13


-crom.yaml
起動時間、停止時間を変えたいときは、このファイルを変更する。
フォーマット:https://cloud.google.com/appengine/docs/standard/python/config/cron#Python_app_yaml_The_schedule_format

cron:
- description: "instance start"
  url: /instance/start
  schedule: every day 09:00
  timezone: Asia/Tokyo
- description: "instance stop"
  url: /instance/stop
  schedule: every day 22:00
  timezone: Asia/Tokyo


-app.yaml

runtime: python27
api_version: 1
threadsafe: true

handlers:
- url: /instance/start
  script: instance.app
  login: admin
- url: /instance/stop
  script: instance.app
  login: admin

-実行スクリプト(instance.py)

扱うインスタンスを追加・変更するときは[インスタンス名のリスト]を変更する。

#!/usr/bin/python
# -*- coding: utf-8 -

import sys
sys.path.insert(0, 'libs')
import webapp2
from oauth2client.client import GoogleCredentials
from googleapiclient.discovery import build

project = 'プロジェクトID'
zone = 'インスタンスのあるゾーン'
instance_names = [インスタンス名のリスト]

credentials = GoogleCredentials.get_application_default()
compute = build('compute', 'v1', credentials=credentials)

# 開始用のHandler class
class InstanceStartHandler(webapp2.RequestHandler):
    def get(self):
        print 'instance start process start'

        for instance_name in instance_names:
            # project, zone, instance名からインスタンスの情報を取得
            instance = compute.instances().get(project=project, zone=zone, instance=instance_name).execute()
            print '%s is %s' %(instance['name'], instance['status'])
            # インスタンスが停止している場合は開始処理を行う
            if instance['status'] == 'TERMINATED':
                print 'instance %s start......' %(instance['name'])
                compute.instances().start(project=project, zone=zone, instance=instance['name']).execute()

            print 'instance start process end'

# 停止用のHandler class
class InstanceStopHandler(webapp2.RequestHandler):
    def get(self):
        print 'instance stop process start'

        for instance_name in instance_names:
            # project, zone, instance名からインスタンスの情報を取得
            instance = compute.instances().get(project=project, zone=zone, instance=instance_name).execute()
            print '%s is %s' %(instance['name'], instance['status'])
            # インスタンスが動いている場合は止める処理を行う
            if instance['status'] == 'RUNNING':
                print 'instance %s stop......' %(instance['name'])
                compute.instances().stop(project=project, zone=zone, instance=instance['name']).execute()
            print 'instance stop process end'
                  
# app.yamlで設定したURLと実行するclassのセットを配列で定義する
app = webapp2.WSGIApplication(
        [
            ('/instance/start', InstanceStartHandler),
            ('/instance/stop', InstanceStopHandler)
        ],
        debug=True
        )


-libs
標準のライブラリ以外はディレクトリlibsに入れておく必要がある。
https://qiita.com/cocodrips/items/3bc82b1136a2bd7a7997

pip install -t libs google-api-python-client
pip install -t libs oauth2client


☆アプリケーションのデプロイ

cloud shell上で以下のコマンドを実行する
アプリケーションのデプロイ

gcloud app deploy app.yaml

cronのデプロイ

gcloud app deploy cron.yaml

成功していれば、タスクキューのcronジョブが設定される。
f:id:Tug-uca:20180615154543p:plain

Google App Engine事始め

App Engine 入門 (Python)

基本的には、上記の公式チュートリアルをやってみると分かるが補足的な覚書を以下に記す。

  • App Engineはインフラ部分を管理せずにWEBアプリを実装できる仕組み
  • アプリケーションは(おそらく)ひとつのプロジェクトに対して1つ
  • 操作は、基本的にコンソール中、右上部にあるGoogle Cloud Shellで行う
  • 一度、Google Cloud Shell上で環境構築、動作を確認し、プロジェクトにデプロイする
  • 複数回デプロイしていくと、過去のバージョンも自動的に管理される

将棋AI進化の変遷(盤面評価の方法について)

盤面評価とはある盤面が自分にとってどれだけ有利な状態であるかを判断することである。
AIが行うには、盤面が入力、評価値が出力となる、評価関数をAIが持つ必要がある。
将棋AIに盤面の評価関数の変遷について下図のようにまとめられる。
徐々に人の手を介さず、AI自身で評価関数を獲得していっていると言える。

f:id:Tug-uca:20171226114100p:plain

今後、様々な対象に対してAIが実装されていくと予想されるが、初めから完全なものができるとは考えづらい。
AI進化の一例として参考になるかもしれない。


※似たような考え方で自動運転のレベル(http://standards.sae.org/j3016_201609/)があるがこちらはまだ最後まで到達していない。

参考:
www.bizcompass.jp