* $\sigma(a)=\frac{1+\tanh(a/2)}{2} $であるので、
$$y(x,{\bf w})=w_0+\sum_{j=1}^{M}w_j\left(\frac{1+\tanh((x-\mu_j)/(2s))}{2}\right)$$$$=w_0+\sum_{j=1}^M\frac{w_j}{2}+\sum_{j=1}^{M}\frac{w_j}{2}\tanh((x-\mu_j)/2s)$$
# 準備
# slideにした時にlatexが変換されない場合の対処 https://gist.github.com/damianavila/ba6a308bd0e605db0e6e
%matplotlib inline
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from IPython.display import display, Image
# osがDarwinのときはローカルと判定
os = !uname -s
use_local = os == "Darwin"
# ローカルじゃない場合は作者のページから取ってくる
base_url = "./figure" if use_local else "http://research.microsoft.com/en-us/um/people/cmbishop/PRML/prmlfigs-png"
# 図表示用
disp_figure = lambda nfig: display(Image("{0}/Figure{1}.png".format(base_url, nfig), width="500px", embed=True))
本章ではこれら3つのアプローチすべての例について述べていく
* f: 活性化関数(activation function)
* 逆関数は統計学の分野では連結関数(リンク関数; link function)
* ${\bf w}$: 重みベクトル(weight vector)
* $w_0$: バイアスパラメータ(bias parameter)
* 統計学におけるバイアスと異なる
# D=2の場合
disp_figure("4.1")
# D=2の場合
disp_figure("4.1")
disp_figure("4.2a")
disp_figure("4.2b")
* 4.1.1節の2クラスの場合の決定境界と同様の形をしているため類似の幾何学的特性が適用可能
* すべての$j\neq k$に対して$y_k({\bf x}_A)>y_j({\bf x}_A)$, $y_k({\bf x}_B)>y_j({\bf x}_B)$が成り立つので$y_k(\hat{{\bf x}})>y_j(\hat{{\bf x}})$
* 従って任意の点$\hat{{\bf x}}$も決定領域${\cal R}_k$に属し、決定領域${\cal R}_k$は単一結合しており凸領域
disp_figure("4.3")
disp_figure("4.4a")
disp_figure("4.4b")
# 最小二乗解による分類境界
disp_figure("4.5a")
# ロジスティック回帰によるクラス分類
disp_figure("4.5b")
* ここで$m_k={\bf w}^T{\bf m}_k$は${\cal C}_k$から射影されたデータの平均
* この式を最大化する${\bf w}$を選択すれば分離度が最大となる
* ${\bf w}_k$を大きくすれば$m_k$は幾らでも大きくなる問題
* 単位長であるという制約を加えることで回避
# 図4.6左図
# クラス平均を結んだ直線上へ射影しても重なり合う部分が多いことを示す
# クラス分布の非対角な共分散が強いために起こる問題
disp_figure("4.6a")
* 全データ集合に対する総クラス内分散$s_1^2+s_2^2$
* ${\bf S}_B=({\bf m}_2-{\bf m}_1)({\bf m}_2-{\bf m}_1)^T$であるので${\bf S}_B{\bf w}$は常に$({\bf m}_2-{\bf m}_1)$と同じ方向を持つベクトル
* ${\bf w}$の方向だけが重要で大きさは考慮する必要がないので、スカラファクタ$({\bf w}^T{\bf S}_B{\bf w})$と$({\bf w}^T{\bf S}_w{\bf w})$は無視して、左から${\bf S}_W^{-1}$を掛けると
$${\bf w}\propto{\bf S}_w^{-1}({\bf m}_2-{\bf m}_1)$$* クラス内共分散${\bf S}_w$が等方的であるとすると${\bf S}_w$は単位行列に比例し${\bf w}$がクラス平均の差に比例
# 図4.6の左図からwベクトルの方向を分離度が最大となるような方向に修正
disp_figure("4.6b")
時間の都合から断念しました(演習4.6)
* フィッシャーの線形判別と一致
* 射影行列${\bf W}$の明示的な関数として表現すると
$$J({\bf W})={\rm Tr}\{({\bf W}^T{\bf S}_W{\bf W})^{-1}({\bf W}^T{\bf S}_B{\bf W}) \}$$from sklearn.datasets import load_iris
data = load_iris()
features = data["data"]
feature_names = data["feature_names"]
target = data["target"]
target_names = data["target_names"]
labels = target_names[target]
print "150サンプルx4次元の特徴量データ"
print features.shape
print features[0]
print ""
print "特徴量の名前のリスト"
print feature_names # list
print ""
print "正解データ"
print target.shape
print target[0:150]
print ""
print "正解データの名前のリスト"
print target_names[0:150]
print "target_names[target] (target_namesはndarray)"
print labels
150サンプルx4次元の特徴量データ (150, 4) [ 5.1 3.5 1.4 0.2] 特徴量の名前のリスト ['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)'] 正解データ (150,) [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2] 正解データの名前のリスト ['setosa' 'versicolor' 'virginica'] target_names[target] (target_namesはndarray) ['setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'setosa' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'versicolor' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica' 'virginica']
import itertools
# 可視化
fig = plt.figure(1, figsize=(16,16))
for t, marker, c in zip(range(3), ">ox", "rgb"): # 品種ごとに色とマーカを変えてプロット
for (i,j) in itertools.combinations(range(4), 2):
ax = fig.add_subplot(4, 4, 4*i + j + 1)
ax.set_xlabel(feature_names[i])
ax.set_ylabel(feature_names[j])
ax.scatter(features[target == t, i],
features[target == t, j],
marker=marker,
c=c)
# http://scikit-learn.org/stable/auto_examples/decomposition/plot_pca_vs_lda.html
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.lda import LDA
iris = datasets.load_iris()
X = iris.data
y = iris.target
target_names = iris.target_names
pca = PCA(n_components=2)
X_r = pca.fit(X).transform(X)
lda = LDA(n_components=2)
X_r2 = lda.fit(X, y).transform(X)
# Percentage of variance explained for each components
print('explained variance ratio (first two components): %s'
% str(pca.explained_variance_ratio_))
plt.figure()
for c, i, target_name in zip("rgb", [0, 1, 2], target_names):
plt.scatter(X_r[y == i, 0], X_r[y == i, 1], c=c, label=target_name)
plt.legend()
plt.title('PCA of IRIS dataset')
plt.figure()
for c, i, target_name in zip("rgb", [0, 1, 2], target_names):
plt.scatter(X_r2[y == i, 0], X_r2[y == i, 1], c=c, label=target_name)
plt.legend()
plt.title('LDA of IRIS dataset')
plt.show()
explained variance ratio (first two components): [ 0.92461621 0.05301557]