ML2024
機械学習(2024)
https://images-na.ssl-images-amazon.com/images/I/51CPd2KLm4L._SX342_BO1,204,203,200_.jpg
年明け 2025-01-07, 2025-01-21, まとめ:2025-01-28
2024-12-24 第12回
レポート課題2(締切 1/27月) 紹介
https://gyazo.com/326a967c7798fe82d80dc1fe87c560f9
2024-12-17 第11回
第6章 線形判別分析による手書き文字認識
https://gyazo.com/2133c70bad3bddfa716d7faf0e2c9a9e
https://gyazo.com/6b2fd66d7131abb21cd58a7479fcc573
第4章 線形判別分析
https://gyazo.com/924c04842d46af22c4b99614eea263b0
2024-12-10 第10回
第4章 最尤推定法
4.2 ガウスモデル
4.3 カテゴリの事後確率
https://gyazo.com/05bf5ade6453f768f4bd2376b903e033https://gyazo.com/d64e2ec71a74d941d54174828de77096
2024-12-3 第9回
第4章 最尤推定法
code:p57.py
import numpy as np
import matplotlib.pyplot as plt
# 期待値 0, 分散 1 の標準正規分布にしたがう標本を n 個生成.
n = 20
mu = 0.0
sigma = 1.0
xx = sigma*np.random.randn(n) + mu
mu_MLE = np.mean(xx)
sigma_MLE = np.std(xx)
def normal_pdf(x,m,s):
c = 1.0/( np.sqrt(2*np.pi)*s )
retvar = c*np.exp(-0.5*(x-m)*(x-m)/(s*s) )
return retvar
x = np.arange(-4.0, 4.0, 0.1)
y = normal_pdf(x,mu,sigma)
y_MLE = normal_pdf(x,mu_MLE,sigma_MLE)
fig=plt.figure(0)
plt.plot(x, y, color = "red", label="true")
plt.plot(x, y_MLE, color = "blue", label="estimated")
plt.legend(bbox_to_anchor=(0.99, 0.99), loc='upper right', borderaxespad=0, fontsize=14)
plt.title("n={0}".format(n))
plt.xlabel('x')
y = 0*xx
plt.scatter(xx,y, s=30, marker="x", c="blue", alpha=0.5, linewidths=2)
plt.show()
fig.savefig('fig4.3_p57.pdf')
print(mu_MLE, sigma_MLE)
print(mu, sigma)
2024-11-26 第8回
第3章 3.2 最大事後確率則、3.3 最小誤り識別確率則、3.4 ベイズ決定則、3.5 生成モデルに基づくパターン認識
予定より遅れている。
https://gyazo.com/2ac675bf5c5dd7968878fb428dd5b865https://gyazo.com/81d60d62ea496b04e4b34e44baa707c4
https://gyazo.com/199b0731e484d91220d4c4461e61fef2https://gyazo.com/a2eb6ea3f1484ba14a187e3b5dbca6c9
今後の予定
第9回 2024-12-03 第4章 最尤推定法
https://gyazo.com/274206c7b0176f561072d79fc080f060https://gyazo.com/b8a80e832dc1a820cb2f786e3832a349
第10回 2024-12-10
第11回 2024-12-17
第12回 2024-12-24
第13回 2025-01-07
第14回 2025-01-21 (1-14 は金曜時間割)
2024-11-12 第7回
https://gyazo.com/53aa6655474728e549a8d0426c2ad70dhttps://gyazo.com/8ef3127d5ee637ab131847788ce97c2b
https://gyazo.com/99426a3c8178788c1472e503e6924861https://gyazo.com/247608848c9cdfdb3fd9a77d4e73c2d5
https://gyazo.com/b699928ef09219bb52e0f1b56dcf0f5f
https://gyazo.com/95ba798fe1bf84a58026fc3f15619c5c
これならわかる応用数学教室(p.218、金谷健一著)
https://gyazo.com/3708b3a147e6c57fd2134d9581d1fcd6
https://jalammar.github.io/images/numpy/numpy-3d-array-creation.png
2024-11-05 第6回
応用数学の講義資料:2023.1.21土 13:30〜16:30 工学部 A-116
第11, 12回 主成分分析
演習用リンク(Google Colab)主成分分析
杉山先生の教科書では $ 16 \times 16 の画像データを扱っています(digit.mat)
MNIST(広く普及されている) は $ 28 \times 28 の画像データ
https://gyazo.com/62a8e7fa7fc1b42a1e03aa0a44e79423https://gyazo.com/3781ec64c0e7c9e7b523a140b24dc036https://gyazo.com/58a7f1fe98bfeea08e02e6ee64eb9d0bhttps://gyazo.com/b362d43c53e0843001df5161a3963d66
https://gyazo.com/601f5e7baa24170b2c6e55b39b8ae08ahttps://gyazo.com/ce0fee5537d0e752bbdb42e4c0894782
https://gyazo.com/8b8d5655b837a6ea5021f69f17092085https://gyazo.com/2e06d1bfef62dd60ca0bff11c19bada9https://gyazo.com/65be82af016c860d2fbcc088c80ec370
https://gyazo.com/0dfc9cf19418b4f2bde84591a17db4ff
https://gyazo.com/fb59d390af6b6dc407be3638f9c034fc
2024-10-29 第5回
課題説明
教科書 図3.2 の再構成
用語
正規直交基底
正射影
分散共分散行列
対称行列
正値対称行列
固有値・固有ベクトル
対称行列の固有値・固有ベクトル
直交行列,直交変換 (一般の回転) • 無相関
次元削減
再構成
近似のよさ
科学用語の場合、「名は体を表し」ません (例:主成分分析)
漢字や英語の意味などから、科学としての意味を読み取ろうとしてはいけません。
「科学用語は単なる呼び名で、呼び名自体には意味はない」と考えておく方がいい。 「本当はホニャララと呼んでもいいんだけど、かっこいい名前にした」と思っていればいい。
https://gyazo.com/b27aab790a342f2dcbacdd3a47ca8286https://gyazo.com/f4bee2b4f22406b847d9c7674fe5ed10
https://gyazo.com/9ab680fb667abb33bc0e825d5eb99bc2https://gyazo.com/44f0750fe7d916b4aecba4a72b81703d
https://gyazo.com/341f79ab5437146f0d77fef87a952ee8https://gyazo.com/cbe56b896fa51b9e031ea1d3ec131eac
パターン認識とは
与えられたデータ → 表しているものを当てる
code:p42.py
# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import scipy.io
data = scipy.io.loadmat("digit.mat")
type(data) # dict
type(data"X") # numpy.ndarray type(x) # numpy.ndarray
x.shape # (256, 500, 10)
z = x.reshape(d, n*nc)
z.shape # (256, 5000)
# 分散・共分散行列 V の計算
V = np.cov(z)
V.shape # (256, 256)
# 正定値対称行列 V の固有ベクトル・固有値の計算
eigvec.shape # (256, 256)
eigval.shape # (256,)
# ここで固有ベクトルを固有値の大きい順に並べ替える.
index = np.argsort(eigval)::-1 eigvec.shape # (256, 256)
e.shape # (256, 2)
X1 = x:,:,0.T # 数字1の500例.X1は 500x256 行列 X1.shape # (500, 256)
C1 = X1.dot(e) # 第1,2主成分方向の座標,500例.C1は 500x2 行列
X2 = x:,:,1.T # 数字2の500例.X2は 500x256 行列 X2.shape # (500, 256)
C2 = X2.dot(e) # 第1,2主成分方向の座標,500例.C2は 500x2 行列
C2.shape # (500, 2)
fig = plt.figure()
# fig.patch.set_facecolor(’silver’) # 背景をシルバー
# plt.subplot(1, 5, 1)
# プロット
plt.scatter(C1:,0,C1:,1,s=10, c="red",label="digit 1") plt.scatter(C2:,0,C2:,1,s=10, c="blue",label="digit 2") # 凡例の表示
plt.legend()
# 描画した内容を画面表示
plt.show()
plt.subplot(1, 5, 2)
X3 = x:,:,2.T # 数字3の500例.X3は 500x256 行列 img = np.reshape(X30,:,(16,16)) plt.imshow(img, cmap=plt.cm.gray_r)
plt.subplot(1, 5, 3)
e1.shape # (256,1)
img = np.reshape(e1,(16,16))
plt.imshow(img, cmap=plt.cm.gray_r)
plt.subplot(1, 5, 4)
img = np.reshape(X23,(16,16))
plt.imshow(img, cmap=plt.cm.gray_r)
plt.subplot(1, 5, 5)
s = np.zeros(256)
for i in range(10):
a = X23.dot(eigvec:,i) # 第i主成分の重みを内積で求める. img = np.reshape(s,(16,16))
plt.imshow(img, cmap=plt.cm.gray_r)
# 描画した内容を画面表示
plt.show()
code:show_digits.py
# -*- coding: utf-8 -*-
#
# google colab を使う場合は,下の2行をコメントアウトし.ファイルをアップロード
# from google.colab import files
# f= files.upload()
import numpy as np
import matplotlib.pyplot as plt
import scipy.io
# 手書き数字のデータをロードし、変数digitsに格納
data = scipy.io.loadmat("digit.mat")
# x.shape # (256, 500, 10)
X3 = x:,:,2.T # 手書き数字3の500例.X3は 500x256 行列 fig = plt.figure()
nx=25
ny=20
# 手書き数字3の画像を縦nx枚,横ny枚ずつ,計 nx*ny 枚描画
for i in range(ny):
for j in range(nx):
plt.subplot(ny, nx, i + ny*j + 1)
plt.axis('off') # 軸は描画しない
plt.imshow(img, cmap=plt.cm.gray_r) # 白黒を反転し描画
plt.savefig('lots_of_3.pdf')
plt.show() # 描画した内容を画面表示
2024-10-22
https://gyazo.com/3ce48a8e3657d57865024b3e5327d17e
https://gyazo.com/10af5e3c644407d1f5d79ab647068e1f
code:g2_pdf.py
import numpy as np
import matplotlib.pyplot as plt
def g2_pdf(x,y,mu,Sigma):
a = 1.0/(2.0*np.pi*np.sqrt(np.linalg.det(Sigma)))
v = np.array(x],[y) - mu
retvar = a*np.exp(-1.0/2.0*(v.T).dot( (np.linalg.inv(Sigma)).dot(v) ))
return retvar
mu = np.array(0],[0)
Sigma = np.array(2,1],[1,2) # 分散・共分散行列
x = np.arange(-3,3,0.1)
y = np.arange(-3,3,0.1)
nx = len(x)
ny = len(y)
z = np.zeros((nx,ny))
for i0 in range(nx):
for i1 in range(ny):
plt.figure(figsize=(3.5,3))
plt.jet()
plt.pcolor(z)
plt.colorbar()
plt.show()
https://gyazo.com/1454b915ee4a10018d1b25c224d88fb9
code:g2_pdf_mesh.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
def g2_pdf(x,y,mu,Sigma):
a = 1.0/(2.0*np.pi*np.sqrt(np.linalg.det(Sigma)))
v = np.array(x],[y) - mu
retvar = a*np.exp(-1.0/2.0*(v.T).dot( (np.linalg.inv(Sigma)).dot(v) ))
return retvar
mu = np.array(0],[0)
Sigma = np.array(2,1],[1,2) # 分散・共分散行列
x = np.arange(-5,5,0.2)
y = np.arange(-5,5,0.2)
nx = len(x)
ny = len(y)
z = np.zeros((nx,ny))
for i0 in range(nx):
for i1 in range(ny):
xx,yy = np.meshgrid(x,y)
plt.figure(figsize=(5, 3.5))
ax = plt.subplot(1,1,1, projection='3d')
ax.plot_surface(xx,yy,z,rstride=1,cstride=1,alpha=0.1,color='blue',edgecolor='black')
# ax.set_zticks((0,0.08))
ax.view_init(30,-30)
plt.show()
https://gyazo.com/563349ff28cc9de90cdf4c204c187fc6
演習 2.2
分散共分散行列を変化させると確率密度関数の形がどのように変化するか調べよ。
$ V = \lambda_1 \bm{e}_1\bm{e}_1^\top + \lambda_2 \bm{e}_2\bm{e}_2^\top
行列
$ V \begin{pmatrix} \bm{e}_1 & \bm{e}_2 \end{pmatrix} = \begin{pmatrix} \lambda_1 \bm{e}_1 & \lambda_2 \bm{e}_2 \end{pmatrix}
$ VP = P \Lambda
$ V = P\Lambda P^{-1}
ここで $ P^{-1} は、$ P が直交行列の場合、$ P^{\top}とかける。
$ V = \begin{pmatrix} \lambda_1 \bm{e}_1 & \lambda_2 \bm{e}_2 \end{pmatrix} \begin{pmatrix} \bm{e}_1^\top\\ \bm{e}_2^\top \end{pmatrix}
$ V = \lambda_1 \bm{e}_1\bm{e}_1^\top + \lambda_2 \bm{e}_2\bm{e}_2^\top
45度方向に傾けたければ、固有ベクトルを、そのように設定すればいい
code:xxx
mu = np.array(0],[0)
e1 = np.array(5],[1) # 任意の方向を指定
e1 = e1/np.linalg.norm(e1, ord=2) # 長さを1にする
A = np.array(0, -1],[1,0)
e2 = A.dot(e1) # e1 を90度回転
lambda1=9
lambda2=1
# Sigma = np.array(2,1],[1,2) # 分散・共分散行列
x = np.arange(-3,3,0.1)
y = np.arange(-3,3,0.1)
nx = len(x)
ny = len(y)
z = np.zeros((nx,ny))
for i0 in range(nx):
for i1 in range(ny):
plt.figure(figsize=(3.5,3))
plt.jet()
plt.pcolor(z)
plt.colorbar()
plt.show()
2024-10-15
行列
https://gyazo.com/8682f42bf6b404ccccc53a72c082bc69
https://gyazo.com/788ebdfd5d05fc8649bf697e8438bdb6
https://gyazo.com/fd81740d003665927f91e61fdc769167
https://gyazo.com/581eaf9d770aae004260e62165e5c12d
https://gyazo.com/6eb8adf4cfbb2a3024a149b1e9e3738e
2024-10-08
https://gyazo.com/db2298dded5a2c29052d02e053b530bc
2024-10-01
シラバスの説明
第1章 パターン認識の基礎
用語
明確には定義できない用語:「機械学習」、「パターン認識」、
「データサイエンス(数理統計学、データに基づく科学的推論の学)」
数学的に記述(定義)できる用語:「平均」、「分散」、「主成分分析」、「最尤法」、「固有ベクトル」、「固有値」
その用語が意味するところは、数式とは別で、自分で考えて納得する
理解の深さ
https://gyazo.com/5f768226d711cca917a03c0387f55611
参考書
https://www.oreilly.co.jp/books/images/picture_large978-4-8144-0059-1.jpeg