「統計学実践ワークブック」 演習問題etc Ch.23 「判別分析」

当記事は「統計学実践ワークブック(学術図書出版社)」の読解サポートにあたってChapter.23の「判別分析」に関して演習問題を中心に解説を行います。フィッシャーの判別分析やSVMなどはよく出てくる手法なので、演習を通して抑えておくと良いと思われました。

本章のまとめ

演習問題解説

問23.1

$[1]$
$2$つの群が直線で分割できない際はフィッシャーの線形判別よりもガウシアンカーネルを用いたSVMの方が良い判別精度を示すと考えることができる。

$[2]$
線形判別の方がテストケースに対して良い結果を示していることから、過学習が生じていることが読み取れる。この対策にあたってはクロスバリデーションなどを行うことで、パラメータを適切な値に調節することなどが考えられる。

問23.2

下記を実行することで分類を行うことができる。

import numpy as np

w1 = np.array([-0.1, -0.1, 0.2, 0.4, 0.9])
w2 = np.array([0.0, 0.2, -0.2, 0.9, -0.3])

ave_x1 = np.array([1.2, 1.4, 0.3, 6.0, 4.6])
ave_x2 = np.array([1.4, 1.4, 0.3, 0.7, 2.1])
ave_x3 = np.array([0.8, 0.3, 1.6, 3.6, 9.2])

vec_x1 = np.array([np.dot(w1,ave_x1), np.dot(w2,ave_x1)])
vec_x2 = np.array([np.dot(w1,ave_x2), np.dot(w2,ave_x2)])
vec_x3 = np.array([np.dot(w1,ave_x3), np.dot(w2,ave_x3)])

new_x = np.array([2.5, -1.1, 0.0, -0.8, 1.0])
vec_new_x = np.array([np.dot(w1,new_x), np.dot(w2,new_x)])

cat_class = ["E", "F", "Q"]

dist2_vec = np.array([np.sum((vec_new_x-vec_x1)**2), np.sum((vec_new_x-vec_x2)**2), np.sum((vec_new_x-vec_x3)**2)])

print("Class: {}".format(cat_class[np.argmin(dist2_vec)]))

・実行結果

> print("Class: {}".format(cat_class[np.argmin(dist2_vec)]))
Class: F

問23.3

参考

・準1級関連まとめ
https://www.hello-statisticians.com/toukeikentei-semi1