ロジスティック回帰分析

ロジスティック回帰分析とは、モデルがlog( \frac{1} {1 - p} ) = a_1 x_1 + a_2 x_2 + a_3 x_3 ...となるような{a_1,a_2,a_3}ベクトルを探すモデルです。(上記pはベクトル、x1..xnは今既知の値です。)

一旦モデルを作成さえすれば、あとは実測値を入れるだけで良いのがポイントで、このあたりは回帰分析と同じとなります。それでは一体何が違うのでしょうか。

ロジスティック回帰分析では、2値のデータの予測をしたいときに利用します。(男か女か、イスラム教かそれ以外か、日本人か外人かなど)。回帰分析では、値の推定に正規分布を利用しているため、正規分布に従わない、たとえば0か1かしか取らないものの推定が出来ないのです。少し専門的な言い方をすると、量的変数の解析には回帰分析、質的変数の解析(ただし2値に限る)にはロジスティック回帰分析を使います。量的変数は連続値のデータで、質的変数は離散的なデータと捉えて問題ありません。

出力が2値ですので、面白い使い方として、たとえばこれをしたら売れるか(1)、売れないか(0)みたいな出力結果を得られます。ですので、例えばマーケッターの方があるターゲットに売れるか売れないかの2値をとる計算などにロジスティック回帰分析が使えます。

以下のような関数を使います。

P = exp( Z ) / ( 1 + exp( Z ) ) =  1 / ( 1 + exp( Z ) )

ここで、上記の中のZは次のように表します。

Z = B_0 + B_1*x_1+ B_2*x_2+ B_3*x_3 …

補足ですがPの式はよくみるとシグモイド関数です。このBの係数(偏回帰係数
とよばれる)を求めるために式を変形します。

ln( P / (1-P )) = Z

この式をみるとわかるとおり、あとは、最小二乗法を用いて偏回帰係数を求めるだけで、回帰分析と全く一緒となります。これにより、ロジスティック回帰分析が出来ます。なお、最尤法(コンピューターをぶん回してフィッティング関数を見つける方法)を利用する方法でも解は求まるのですが、ほとんど最小2乗法を利用した計算法で事が足ります。

参考文献

おすすめの記事

最尤法

最尤法は、ある観察された離散的なデータを、連続的な関数にフィッティング(推定)する事を目的とした方法です。

今観測されたデータを正規分布や二項分布、ガンマ、ポアソンなど何でもいいのですが、連続関数にうまく当てはめてやる。うまく当てはまったということは、その際にその分布のパラメータの推定を行えていることを意味します。

今自分で適当に仮定した確率モデル(例えば正規分布など)があった場合、観測された実際の分布との適合度を示すものを「尤度」と呼びます。

尤度は高ければ高いほど、その仮定した確率モデルのフィッティングがうまく言っている事を表す。(尤度は、ある理論分布(正規分布など)を仮定したとき、現実に得られた実データと 同じ結果がその分布から生じる確率)

仮定する確率モデルのことを「尤度関数」と呼ぶ。(つまり観測結果をフィッティングした関数のこと)

尤度関数は単純に正規分布の場合や、複数の分布の混合の形で表される場合もあります。

最尤推定、最尤法とは、尤度を最大化するような尤度関数を決めてやる(パラメータを推定する)ことです。

参考文献

https://ja.wikipedia.org/wiki/%E6%9C%80%E5%B0%A4%E6%8E%A8%E5%AE%9A

おすすめの記事

主成分分析(PCA)

コンピューターサイエンスで非常に重要な技術の一つです。次元圧縮の定番で「まずはPCAでもしてみるか」的な感じで利用されます。PCAとはPricipal Component Analysisと呼ばれ日本語では主成分分析と呼ばれます。

コンピュータサイエンスを専攻する学生にとっては、必ず学んでおいた方がいい技術の1つです。ただ殆どのサイトは数式を並べていて、結局何なのかがわかりづらいな、と思います。機械学習、統計学にしろ概念が非常に重要です。このブログでは概念を主に説明します。最後に簡単な実装例をおつけしておきます。

PCAとは(概念)

PCAは次元圧縮や特徴抽出というふうに言われます。なぜでしょうか。

それは、たくさんのデータから、そのデータを構成する基礎となるようなデータ(軸)が求まるからです。

少し詳細に説明します。例えば、ものすごい次元のデータが膨大にあったとします。
全部保持するのは容量的に無理です。ここで基礎となるような数個のデータと係数で、その莫大な集合をほぼ表現できるとしたら便利だし、これは次元圧縮と言えるのではないでしょうか。そして基礎となるような数個のデータが膨大なデータの基礎となるなら、これはデータの特徴とも呼べそうです。PCAはそれをするため次元圧縮や特徴抽出と言われています。

基礎となるようなデータは主成分ベクトルとよばれます。主成分ベクトルが面白いのは基底ベクトルであることです。基底ベクトルは、互いに独立で直交しているという特性をもっているベクトルで、その座標系での軸となるベクトルです。

実はPCAにより算出される主成分ベクトルはすべて基底ベクトルです。PCAにより算出された基底ベクトルが織り成す特徴量空間は元データがよく見える空間となります。(分散してみえるようになる)。こうした基となる軸のベクトル(データ)がPCAにより求まるのです。

ちなみに、基底ベクトルであれば掛け合わせるだけで簡単にその基底ベクトルを軸とした空間に変換が出来ます。線形代数の話になりますが、直交する基底ベクトルのみで構成されている行列を直交行列といい、その直交行列をデータにかけると、直交行列を系とした座標系に変換ができます。

PCAにより得られる主成分ベクトル同士は直交しており、それぞれの軸からでも分散をが大きくみえますが、その量は軸別で分散値が異なります。このどれくらい分散しているか(よく見えるか)というのは、寄与率で判断ができます。寄与率が高いほど主成分ベクトルがどれくらい重要かが判定できます。

蛇足で、別に直交していなくてもよく見える軸で見ればいいではないのか、というようなアイディアがあり、これはICA(独立成分分析)とよばれ音声処理などで活躍しています。

PCAの具体的な処理手順の

主成分分析とは、以下の手順をするだけで求まります。

・共分散行列を求めて固有値問題を解く

これがPCAです。従って、問題は以下の2つになります。

  1. 共分散行列を求める。
  2. 固有値問題を解く。

この二つのプロセスで解けるということで、わかってしまえば非常に簡単です。

共分散行列とは

共分散行列は、分散共分散行列とも呼ばれています。共分散行列の求め方については以下の具体例で示します。今、N次元のV1, V2, V3, V4のベクトルがあるとするとします。

そしてV1,V2,V3,V4の平均ベクトルV_avrを求めます。

V_{avr} =\frac{ V_1 + V_2 + V_3 + V_4 }{ 4}

続いて、V1, V2, V3, V4それぞれの共分散行列を作ります。例えば、V1の分散行列は次のようにして作成されます。

(V_1 - V_{avr}) \times (V_1 - V_{avr})^T ( ^Tは転置行列を表します。結果的にNxNのマトリックスが作成されます。)

例えば、V1が[ 2, 3, 4]という行列で平均ベクトルが[1, 1, 1 ] だったとすれば、V_1 - V_{avr}を行い[1,2,3]というベクトルを得ます。後は式にならって、


{MAT}_1 = \begin{bmatrix}1 & 2 & 3 \\ 2& 4&6\\3&6&9\end{bmatrix}

となり、V1の共分散行列MAT1が求まりました。V2, V3, V4についても同様のことを行います。

最終的な共分散行列をもとめるには、それぞれの共分散行列を全て足し、ベクトルの数(4つ)で割ればそれで終わりです。

共分散行列=(MAT1 + MAT2 + MAT3 + MAT4)/4 

これで目的の共分散行列を作ることができました。意外と簡単です^^;

固有値問題とは

固有値問題は以下のようなベクトルと値を求める操作です。

Ax = λx

ここで、λは固有値とxは固有ベクトルと呼ばれます。ここでAは行列を表します。 ここでいうAが先程のNxNの行列(共分散行列)となります。

固有値問題を解く方法はこの範囲を超えますので、様々なサイトをご覧ください。

PythonのLinear Algebraのライブラリを使って解く擬似コードを紹介します。

import numpy
from numpy import array
from numpy import linalg
def PCA(X):
  # 共分散行列の計算
    x_mean = array( map( sum, X.T) ) / len( X )
    X_ = X - x_mean  
    X_t = numpy.dot( X_.T, X_ ) / len(X)
    #固有値、固有分解
    lam, vec = linalg.eig( X_t ) # <== 固有値、固有分解が求まる!!
    ans = zip( lam, vec.T )
    ans.sort( reverse = True ) # <= 固有値が高い順にソート

linalg.eigにより固有値分解、固有値ベクトルを算出します。固有値分解の方法については興味があれば自分で調べてみてください。このように、固有値分解のライブラリさえ手に入っている状態であれば簡単にPCAを行うことができます。

ランク落ち

固有値分解を行う上で一つ注意がRANK落ちに注意してください。ランクがFULLでないと(つまり4x4の行列であれば、4つの独立したベクトルにより、その行列が構成されていないと)不正な値が出ます。(使うライブラリや実装方法によりますが)

そうした場合、正則化させてランク落ちをなくすことや、行列のランクがFULLでないのであれば特異値分解により求める必要があります。

参考文献

https://ja.wikipedia.org/wiki/%E4%B8%BB%E6%88%90%E5%88%86%E5%88%86%E6%9E%90

おすすめ記事