lazy diary

統計とその周辺

基底関数展開を使った非線形回帰

参考書はこちら

多変量解析入門――線形から非線形へ

多変量解析入門――線形から非線形へ

この第3章非線形回帰モデルの内容です。

今回は基底関数を使った非線形回帰です。
ここで言う基底というのは線形代数で学ぶ基底と同じ意味合いです。ここでは基底"関数"ですので、その基底の要素が関数になっているわけです。

非線形回帰モデルで最も有名な例としてd次元多項式回帰を考えると、その基底関数は\{1,x,x^2,x^3,\dots,x^d\}となります。この関数にデータx_iを入力してd次元のデータを作り線形重回帰モデルを学習させることで多項式回帰は非線形回帰として機能しています。

作用させる関数を変えればより表現能力の高いモデルが可能になるのではということで基底関数として他にも様々なものが考えられています。最も典型なのがガウス型基底関数で

\displaystyle{
\phi_j(x) = \exp{\left (-\frac{\|x - \mu_j\|^2}{2h_j^2}\right )}
}
という関数になります。パラメータとして位置を決める\muとばらつきを決めるhがあります。これはデータから推定します。今回はこの基底関数を用いることにします。具体的には次の手順でモデルを作ります。

1. 基底関数の個数を決めるためにデータに対してk-meansなどでクラスタリングを行なう。このときのクラス数をnとしておく。
2 各クラスに属するデータの平均と距離による分散を求め、合計nクラスぶんのガウス型基底関数を構成する。
3. データにn種類のガウス型基底関数をそれぞれ作用させ、そのデータに対して線形重回帰モデルを学習させる。

この手法は多次元にも適用できるので、今回は可視化することを考えて説明変数は2次元にしておきました。

from sklearn import linear_model
from sklearn.cluster import KMeans
from scipy import stats
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


def create_multidata():
    N = 20
    residual = stats.norm.rvs(N) / 10
    x = np.linspace(-5, 5, N) + residual
    y = np.linspace(-5, 5, N) + residual * 2.0
    return x, y, (1 / 10) * x**2 - x + y + np.sin(x * y * 10) + residual


def gaussian_basis(x, mean, std):
    result = np.empty((x.shape[0], 1))
    for i in range(x.shape[0]):
        temp = (x[i, :] - mean).reshape(-1, 1)
        result[i] = np.exp(-np.linalg.norm(temp) / (2 * std**2))
    return result.flatten()


def gaussian_basis_func_reg(x, y, n):
    kmeans = KMeans(n_clusters=n).fit(x)
    label = kmeans.predict(x)
    mean = np.empty((n, x.shape[1]))
    std = np.empty((n, 1))
    transformed_x = np.empty((x.shape[0], n))
    for k in range(n):
        x_k = x[label == k]
        mean[k, :] = np.mean(x_k)
        std[k, 0] = np.sum([np.linalg.norm(x_k[i, :] - mean[k, :]) for i in range(x_k.shape[0])]) / x_k.shape[0]
        transformed_x[:, k] = gaussian_basis(x, mean[k, :], std[k, 0])
    model = linear_model.LinearRegression().fit(transformed_x, y)
    return model.predict(transformed_x)


if __name__ == "__main__":
    x, y, z = create_multidata()
    X = np.vstack((x, y)).T
    Y = z.reshape(-1, 1)
    model = linear_model.LinearRegression().fit(X, Y)
    non_linear_pred = gaussian_basis_func_reg(X, Y, n=3)
    fig = plt.figure()
    ax = fig.add_subplot(111, projection="3d")
    ax.scatter(x, y, z, label="observed", c="blue")
    ax.plot(x, y, model.predict(X).flatten(), label="linear", c="red")
    ax.plot(x, y, non_linear_pred.flatten(), label="non linear", c="green")
    ax.grid(True)
    ax.legend(loc="upper left")
    plt.show()

f:id:mt19:20190817093312p:plain

モデル選択はモデルの有効自由度を求めてAICを使うか、クロスバリデーションがあるようですが後者のほうが実装しやすいかなとは思います。

ガウス型基底関数以外にはthin plate spline関数とか逆多項式型関数とか色々あるようですが、どれもこれも自分で実装しなければならない(sklearnに無い)上にパラメータの推定法についてもちょっと調べないといけない状況です。あまり人気がないんですかね(カーネル法を使った方が手っ取り早い?)。

今回は以上です。


更新履歴
2018/10/11 記事作成
2019/08/17 復習するついでに1次元だった説明変数を多次元に拡張しました。

僕の図書館(2019/09/20更新)

https://www.pakutaso.com/shared/img/thumb/elly20160628465420_TP_V.jpg

ちゃんと読んだもの一覧

Python

Python学習講座~PythonエンジニアによるPython3学習支援サイト~

これで十分。あとは公式のドキュメントを読む。
PythonエンジニアによるPython3学習サイト



・【ゼロから始めるデータ分析】 ビジネスケースで学ぶPythonデータサイエンス入門

Udemyの講座です。分析の一通りの手順を教えてくれます。
実際にSignateに出てくる問題を扱っているので、実践形式で学べるところが良し。
https://www.udemy.com/optworks_1/


機械学習

・Coursera:Machine Learning

この世界なら知らない人はいないであろうAndrew Ng先生の授業です。
内容は機械学習の基礎で、大半は日本語字幕があります。WEEK1-11まであり、各WEEKの最後にはクイズやプログラミングの宿題が課されます。具体的な授業内容は別の記事に書いたので、良ければ参考に。
Coursera:Machine Learningを受講しました - lazy diary
www.coursera.org


・ゼロから作るDeep Learning――Pythonで学ぶディープラーニングの理論と実装

NNをPythonでスクラッチして理論を学んで最終的にCNNまでやってみようという本です。第5章の計算グラフを使ったback propagationの説明は好みが分かれるような気がします。



伝統的な統計学

古典的な統計学。いわゆる〇〇検定とかの本です。

統計学入門 (基礎統計学Ⅰ)

統計の赤本の名で有名な統計学の入門書です。統計学を始めるときの1冊にどうぞ。線形代数だと行列の基本的な扱い、解析だと重積分あたりが前提知識かと思います(要は大学1年生が学ぶ数学です)。日常でも聞く平均などの統計量の説明から始まり、そこに確率変数を導入して分布の説明、次に標本の話と推定や仮説検定を行なったりする話、最後に少しですが回帰分析の話が載っています。
私はこの本を統計検定2級を受験する際の教科書として利用しました。統計検定2級の受験記も良ければ見て下さい。
統計検定2級に合格しました - lazy diary

統計学入門 (基礎統計学?)

統計学入門 (基礎統計学?)


・現代数理統計学の基礎

上にある統計の赤い本より深い内容まで突っ込んだ本です。この本の良い点は誤植や演習問題の解答、補足等を著者がWEBサイトで公開している点だと思います。数学書でこれほどありがたいことはないです。
私はこの本を統計検定1級を受験する際の教科書として利用しました。統計検定1級の受験記も良ければ見て下さい。
統計検定1級に合格しました - lazy diary

現代数理統計学の基礎 (共立講座 数学の魅力)

現代数理統計学の基礎 (共立講座 数学の魅力)



統計モデリング

モデリングの話。ベイズベイズしていない本。

・An Introduction to Generalized Linear Models

GLMの古典的名著です。GLMの構築、パラメータ推定、モデルチェックを具体例とともに一通り理解できます。検定の部分には少し行間があるように感じますが、パラメータ推定は非常に分かりやすかったです。第3版になっておまけ程度にベイズの話題が追加されました。最新版は第4版らしいです。
サポートページにデータセットとstatsmodelsをベースにしたPythonの実装があるのが有り難いです。
An Introduction to Generalized Linear Models - CRC Press Book

An Introduction to Generalized Linear Models, Third Edition (Chapman & Hall/CRC Texts in Statistical Science)

An Introduction to Generalized Linear Models, Third Edition (Chapman & Hall/CRC Texts in Statistical Science)


・多変量解析入門――線形から非線形

線形から非線形への橋渡しに。基底関数展開や判別分析、SVM、主成分分析を丁寧に数式を展開しながら説明しています。最後に教師なし学習が少しだけ説明されています。私好みの数式だらけの本でした。以下、本で紹介されているものをいくつか私がPythonで実装したものです。
基底関数展開を使った非線形回帰 - lazy diary
XORのようなデータを非線形ロジスティック回帰で分類する - lazy diary
ハードマージンSVMによる分類 - lazy diary
ソフトマージンSVMによる分類 - lazy diary
非線形SVMによる分類 - lazy diary

多変量解析入門――線形から非線形へ

多変量解析入門――線形から非線形へ



カーネル法入門―正定値カーネルによるデータ解析

8, 9章を除いて読んだ。関数解析の話が結構出てきて半分数学書のようになっていて、個人的には関数解析の講義で受けた内容はこんなにもデータ解析に使えるんだとハッとしました。正定値カーネルはこういうものがありますではなくPropからこうすれば構成できるという点があって好きです。あとMLPシリーズの統計的学習理論(未読ですが)にあるようなVC次元の話もあってお得感があります。カーネル法は赤穂先生の本が有名ですが、数式が多いほうが理解しやすいよという方はこちらがオススメです。

カーネル法入門―正定値カーネルによるデータ解析 (シリーズ 多変量データの統計科学)

カーネル法入門―正定値カーネルによるデータ解析 (シリーズ 多変量データの統計科学)




・続・わかりやすいパターン認識教師なし学習入門―

前半はベイズ統計学の基礎。そのあとEMアルゴリズム、HMM(Viterbiアルゴリズム、Baum-Welchアルゴリズム)、k-means法、凸クラスタリング、最後にノンパラベイズ(ディリクレ過程混合モデル)の説明があります。全体的に丁寧な記述で非常に分かりやすいと思います。ノンパラベイズに関してはムズカシイ。別書を参考にします。

続・わかりやすいパターン認識―教師なし学習入門―

続・わかりやすいパターン認識―教師なし学習入門―




・経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

沖本本の名で有名な時系列解析の本です。この本を含め、時系列の本はもう少し詳細な解説が欲しくなります。

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)

経済・ファイナンスデータの計量時系列分析 (統計ライブラリー)



ベイズモデリング

ベイズモデリングについての本です。

・データ解析のための統計モデリング入門――一般化線形モデル・階層ベイズモデル・MCMC (確率と情報の科学)

みどり本の名で有名な統計モデリングの本です。下記のPyStanに移植したというありがたい記事が参考になりました。人によっては数学的要素が少し物足りないかもしれません。
データ解析のための統計モデリング入門(緑本)の読書メモ(PythonとStanで) - Qiita



ベイズ推論による機械学習入門

須山ベイズ本とか言われるやつです。変分推論偏重とは言われますが、これくらいゴリゴリに変分推論に慣れることが出来るのは和書だとこれくらいしかない(PRMLもこれに近い)と思うのでそういう点では貴重です。事前分布、尤度、グラフィカルモデルから事後分布と予測分布という1連の流れをしっかりと頭に叩き込めるので良いと思います。

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)

機械学習スタートアップシリーズ ベイズ推論による機械学習入門 (KS情報科学専門書)



パターン認識機械学習

PRMLの名で有名な本です。ベイジアンなら読まないとモグリだと思うので読みました。1度読んだだけで理解したとはとても言い切れぬ。

パターン認識と機械学習 上

パターン認識と機械学習 上

パターン認識と機械学習 下 (ベイズ理論による統計的予測)

パターン認識と機械学習 下 (ベイズ理論による統計的予測)


ベイズ統計の理論と方法

渡辺ベイズ本とかベイズの赤本とか言われるやつです。WAICの導出があります。数式は難解かもしれませんが「質問と回答」を読むだけでも十分に価値があるような気がします。

ベイズ統計の理論と方法

ベイズ統計の理論と方法


・StanとRでベイズ統計モデリング (Wonderful R)

ヒル本と呼ばれるやつです。Stanの使い方と緑本や一般化線形モデル入門で扱われているモデリングの良い復習になりました。この本はRで書かれていますが、私は一部を除いて全てPyhonで実装しました。Pythonによる可視化の練習にもなりました。以下の記事が実装で困ったときの参考になりました。
StanとRでベイズ統計モデリング(アヒル本)をPythonにしてみる - 目次 - Qiita



その他

・入門 機械学習による異常検知―Rによる実践ガイド

この分野に興味があったので読みました。あまり行間が飛ぶことなく丁寧に書かれており、著者の親切さ(のようなもの?)をひしひしと感じました。

統計検定2級に合格しました

合格したので感想を。
http://www.toukei-kentei.jp/wp-content/uploads/ToukeiAkari-300x123.png*1

統計検定とは

www.toukei-kentei.jp
そもそも統計検定って何?って方もいると思うのでザックリと説明を。

「統計検定」とは、統計に関する知識や活用力を評価する全国統一試験です。
データに基づいて客観的に判断し、科学的に問題を解決する能力は、仕事や研究をするための21世紀型スキルとして国際社会で広く認められています。
日本統計学会は、中高生・大学生・職業人を対象に、各レベルに応じて体系的に国際通用性のある統計活用能力評価システムを研究開発し、統計検定として実施します。

うむ、よく分からんということで具体的な検定内容は次のようになっています。

試験の種別 試験内容
統計検定1級 実社会の様々な分野でのデータ解析を遂行する統計専門力
統計検定準1級 統計学の活用力 ─ データサイエンスの基礎
統計検定2級 大学基礎統計学の知識と問題解決力
統計検定3級 データの分析において重要な概念を身に付け、身近な問題に活かす力
統計検定4級 データや表・グラフ、確率に関する基本的な知識と具体的な文脈の中での活用力
統計調査士 統計に関する基本的知識と利活用
専門統計調査士 調査全般に関わる高度な専門的知識と利活用手法

2/3級については、CBT方式というもので受験が可能です。この方式で申し込みをすれば指定された全国の会場でほぼ毎日受検することが出来ます。
一方で、1級と準1級については受験日が決まっています。1級は11月、準1級は6月に試験が開催されます。全て合格点は60/100点だったと思います。
統計調査士、専門統計調査士についてはよく知らないので略。

この統計検定始まったのは2011年とまだ最近です。

勉強したこと

統計検定2級の範囲をまずチェックしましょう。
私は数学畑の人間とは言っても統計学については素人です。確率分布って何?という状態です。そこで合格した人のブログをいくつか調べて、この本で学ぶことにしました。

統計学入門 (基礎統計学?)

統計学入門 (基礎統計学?)

検定理論あたりで少し苦戦しましたがそれ以外はとても読みやすい本でした。この本をノートにまとめながら読むこと約2週間(※練習問題は飛ばしました)。
これだけでどれくらい点数が取れるのだろうかと過去問を解くことにしました。
日本統計学会公式認定 統計検定 2級 公式問題集[2014〜2016年]

日本統計学会公式認定 統計検定 2級 公式問題集[2014〜2016年]

ギリギリですが合格点を取ることが出来ました。私はこのとき初めてを2級の範囲を見たのですが(最初にチェックしておけよって話ですね)、『統計学入門』にいくつか載っていない項目があったのでそこをググりながら補うことにしました。これに1週間ほどかけました。その後、過去問の再度解き直しに1週間をかけ、安定して合格できるくらいまで知識を確認しました。

受験当日

事前に日程をこちらが決めてCBT方式で受験しました。会場に行ってパソコンの前に着席してから説明を聞いて、すぐに試験開始です。メモ用紙が貰えるでそこでガリガリ計算していきました。偶然かもしれませんが、過去問よりいくぶんか簡単でした。その場で合否が分かるので合格発表をドキドキして待つこともありません。

最後に

ここまで言及していなかったのですが、忘れてはいけないのが電卓です。この試験をサクサク乗り切るためには電卓をうまく使うことが結構重要なのではと過去問を解きながら思っていました。私は電卓といわれるとスマホの電卓しか長らく使っていませんでしたが、スマホの電卓はNGなので今回この試験のために買いました。

カシオ 電卓 時間・税計算 手帳タイプ 8桁 SL-300A-N

カシオ 電卓 時間・税計算 手帳タイプ 8桁 SL-300A-N

あまり使う機会ないですしお金が無い学生にはこれで十分でした。


参考書を選んで学習、最後に過去問で演習という流れで合格できました。参考書は範囲をおおよそカバーしているのものの中から気に入ったのを選べば良いと思います。*2統計学入門』もその1つだと思います。



次は統計検定1級に挑戦してみようと思います。頑張ります。
【追記】
2018年度の統計検定1級試験を受験して合格しました。1級の受験記はこちらです。
mt19.hatenablog.com

*1:統計検定の公式キャラクターらしいです http://www.toukei-kentei.jp/info/toukeiakari/

*2:公式の参考書もありますがAmazonではなかなかの酷評です。私は公式のものを見ていないので評価できません。

Coursera:Machine Learningを受講しました

機械学習を勉強している人ならどこかで聞いたことはあるであろう(たぶん?)
あの有名なAndrew Ng先生のMachine Learningを受講しました。
www.coursera.org

何を学んだのかの振り返りの意味も込めて、この記事を書いていきます。

1.受講動機

機械学習をざっくりと学びたく、当初市販の本を手にとってはみたのですがどうもしっくり来ませんでした。なぜその手法を使うのかといった所謂motivationの部分の話が無くて分かりづらかったです。そこで評判の良いCourseraの講義に手を出してみました。
(追記:統計的学習理論を1年ほど学んだ今でも市販の本で学び始めるのは難しいと思っています。)

2.講義内容

散々色んなブログでまとめられているとは思いますが、振り返りの意味も込めて自分で作ったノートを見ながら講義内容をざっくりここに箇条書きにします。

Week1

機械学習の一般的な定義と教師あり学習教師なし学習について
MATLABOctaveアルゴリズムの簡単な実装には便利
・線形単回帰
最急降下法とは何か?

市販の本で分かりづらかった最急降下法がとても分かりやすく、あぁ教えるのがお上手でと思いながら動画を見てました。

Week2

・線形重回帰
・特徴量のスケーリングの効果とその実装
多項式回帰
・正規方程式の利用

Week3

・線形ロジスティック回帰
・マルチクラスの分類問題への対応の仕方
過学習の恐ろしさとその対策方法(特徴量選択、正則化項の追加、可視化etc)

Octaveの便利さをこのあたりで実感。

Week4

・ロジスティック回帰の欠点
ニューラルネットワークの概要とその素晴らしさ

Week5

・forward propagationとback propagation
ニューラルネットワークにおける最急降下法とエラーチェック(gradient checking)

ニューラルネットワークは線形回帰やロジスティック回帰に比べてかなり難しかったです。特にback propagationがなぜ必要なのかがなかなか理解できませんでした。このMachine Learningの講義で私が一番大変だと思ったWeekです。

Week6

・交差検定の理解
正則化係数λの決定方法
・学習曲線から分かること
・評価指標(F値

ここではアルゴリズム云々ではなく、モデルの改善にはなにが必要なのかが学べます。

Week7

・サポートベクターマシーン(SVM)の実装とその良さ
カーネルトリック
・ロジスティック回帰とSVMの使い分けについて

Week8

教師なし学習の応用例
・K-means法
・クラス数Kの決め方
・次元削減の必要性と主成分分析の概要
機械学習での主成分分析の組み込み方

Week9

ガウス分布を用いた異常検知アルゴリズム
・異常検知アルゴリズムが適している問題
・レコメンデーションシステムの概要
協調フィルタリングの実装と実際のレコメンドの仕方

項目はたくさん並んでしまいましたが、ガウス分布等は統計では定番なので、統計を少し学んだ人は苦労しないと思います。レコメンデーションシステムは機械学習の定番なので知れてよかったです。

Week10

最急降下法(バッチ急降下法)のデメリット
・確率的急降下法とミニバッチ最急降下法の実装
・オンライン処理の特徴
・データが膨大にあるときに使われるMap Reduceについて

データをたくさん持っていることは強い(オーバーフィッティングしているとき)というのは動画内で何度も説明されます。その膨大なデータを計算コストの面からどのように扱うかが説明されます。

Week11

機械学習の応用例としてのOCRの説明
・アプリケーションのパイプラインを用意することの重要性
・現実で直面するデータ量の問題と人工データ合成の概要
・シーリング分析の概要
・受講に対する感謝の言葉

機械学習を実際のアプリケーションに組み込む際の注意事項がたくさん説明されています。
最後の受講に対する感謝の言葉はなかなか嬉しいものがあります。

3.受講してみて

受講して本当に良かったです。とにかく分かりやすいの一言です。
1ヵ月を使って学びましたが、勉強していて楽しかったです。動画なので本と違って行間埋める必要もありませんのでとっつきやすいです。

もし

前提条件
機械学習の基礎を学んでみたい
・英語が少し読める
歓迎条件
・行列演算、微分偏微分を知っている(これらは知らなくても動画内で簡単な説明がありますが、この先どこかで深い知識が必要になるでしょうから事前に数学書で学ぶことをオススメします)
・巷の機械学習入門書が難しすぎる

という方がいたら私はこの講義をオススメします。