---
title: パターン認識論 #5
tags:  #機械学習 #深層学習 #パターン認識  
author: [Akinori Ito](https://image.docswell.com/user/akinori-ito)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/VJPK4D4XE8.jpg?width=480
description: 東北大学で2023年に開講していた「パターン認識論」のスライドです 本スライドでは、Irisデータセットを取得し可視化した上で、主成分分析やLDAによる次元圧縮を行います。その後、Nearest Neighbor、プロトタイプ法、パーセプトロン、3層ニューラルネット、GMMといった分類アルゴリズムを実装し、精度を比較します。最後に、Titanicデータセットを用いて生存予測を行う演習を提示しています。
published: April 16, 26
canonical: https://image.docswell.com/s/akinori-ito/KWRWDG-2026-04-16-085458
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/VJPK4D4XE8.jpg)

パターン認識論
第５回
伊藤彰則
1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/2EVVX1X3EQ.jpg)

実践編（その１）
これまでの内容から実際にパターン
を認識してみよう
◦Nearest Neighbor法
◦線形識別関数
◦ニューラルネットワーク（３層）
◦GMM
◦＋次元圧縮
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/57GLV2VYEL.jpg)

データセット
Iris データセット
◦ アヤメの花弁と萼のサイズに対する花の種類のデータ
ベース (Fisher, 1936)
Iris setosa
（ヒオウギアヤメ）
Iris versicolor
（ブルーフラッグ）
Iris verginica
（バージニカ）
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/4EQY6P66JP.jpg)

データセット
◦Iris flower data set
◦ https://archive-beta.ics.uci.edu/dataset/53/iris
クラス数
3 (setosa, versicolor, virginica)
サンプル数
150 (50サンプル/クラス)
特徴量
4種類
萼の長さと幅 (sepal length, sepal width)
花弁の長さと幅 (petal length , petal width)
分析に R を利用
(Python民は自力でやってください）
R自体の説明はしません
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/KJ4W4Y4M71.jpg)

データの取得と確認
&gt; data(&quot;iris&quot;)
&gt; head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1
5.1
3.5
1.4
0.2 setosa
2
4.9
3.0
1.4
0.2 setosa
3
4.7
3.2
1.3
0.2 setosa
4
4.6
3.1
1.5
0.2 setosa
5
5.0
3.6
1.4
0.2 setosa
6
5.4
3.9
1.7
0.4 setosa
&gt; summary(iris)
Sepal.Length
Min.
:4.300
1st Qu.:5.100
Median :5.800
Mean
:5.843
3rd Qu.:6.400
Max.
:7.900
Sepal.Width
Min.
:2.000
1st Qu.:2.800
Median :3.000
Mean
:3.057
3rd Qu.:3.300
Max.
:4.400
Petal.Length
Min.
:1.000
1st Qu.:1.600
Median :4.350
Mean
:3.758
3rd Qu.:5.100
Max.
:6.900
Petal.Width
Min.
:0.100
1st Qu.:0.300
Median :1.300
Mean
:1.199
3rd Qu.:1.800
Max.
:2.500
Species
setosa
:50
versicolor:50
virginica :50
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/LE1Y464Y7G.jpg)

可視化
&gt; library(ggplot2)
&gt; ggplot(iris,aes(x=Sepal.Length,y=Sepal.Width,col=Species))+
geom_point()
4.5
Sepal.Width
4.0
3.5
Species
setosa
versicolor
3.0
virginica
2.5
2.0
5
6
7
8
Sepal.Length
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/GEWGXWX1J2.jpg)

可視化２
&gt; ggplot(iris,aes(x=Petal.Length,y=Petal.Width,col=Species))+
geom_point()
2.5
Petal.Width
2.0
Species
1.5
setosa
versicolor
virginica
1.0
0.5
0.0
2
4
6
Petal.Length
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/47ZL656XJ3.jpg)

次元を潰してみる
&gt; model &lt;- princomp(iris[,1:4]) # 主成分分析
&gt; model$sdev^2 # 主成分軸の分散
Comp.1
Comp.2
Comp.3
Comp.4
4.20005343 0.24105294 0.07768810 0.02367619
&gt; barplot(model$sdev^2,col=2,ylab=&quot;variance&quot;)
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/YJ6W292PJV.jpg)

累積寄与率
&gt; total&lt;-sum(model$sdev^2)
&gt; cumm&lt;-Reduce(`+`,model$sdev^2/total,accumulate = TRUE)
&gt; plot(cumm,type=&quot;b&quot;)
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/GJ5M2N2PJ4.jpg)

2次元に圧縮
&gt; compressed&lt;-cbind(as.data.frame(model$scores),iris$Species)
&gt; ggplot(compressed,aes(x=Comp.1,y=Comp.2,col=iris$Species))
+geom_point()
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/9E29454Z7R.jpg)

各軸に対する寄与
&gt; model$loadings
Loadings:
Comp.1 Comp.2 Comp.3 Comp.4
Sepal.Length 0.361 0.657 0.582 0.315
Sepal.Width
0.730 -0.598 -0.320
Petal.Length 0.857 -0.173
-0.480
Petal.Width
0.358
-0.546 0.754
Comp.1 Comp.2 Comp.3 Comp.4
SS loadings
1.00
1.00
1.00
1.00
Proportion Var
0.25
0.25
0.25
0.25
Cumulative Var
0.25
0.50
0.75
1.00
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/D7Y4MKMNEM.jpg)

LDAによる次元圧縮
library(MASS)
model.lda &lt;- lda(Species~.,data=iris)
lda.compressed &lt;- predict(model.lda,iris)
result &lt;- data.frame(Dim1=lda.compressed$x[,1],
Dim2=lda.compressed$x[,2],
Species=iris$Species)
ggplot(result,aes(x=Dim1,y=Dim2,color=Species))+geom_point()
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/VENYWRWVJ8.jpg)

分類してみよう
まず全体を学習データと評価データに分ける
&gt; train_index &lt;- sample(1:150,100)
&gt; train_data &lt;- iris[train_index,]
&gt; test_data &lt;- iris[-train_index,]
&gt; table(train_data$Species)
setosa versicolor virginica
34
30
36
&gt; table(test_data$Species)
setosa versicolor
16
20
virginica
14
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/Y79PXMXVE3.jpg)

Nearset Neighbor法
学習データの全てのサンプルをプロトタイプとしたNN法
&gt; library(class)
&gt; result &lt;- knn1(train_data[,-5],test_data[,-5],train_data[,5])
&gt; sum(result==test_data$Species)/nrow(test_data)
[1] 0.94
各クラスの平均ベクトル１つをプロトタイプとしたNN法
&gt; library(dplyr)
&gt; library(foreach)
&gt; species &lt;-c(&quot;setosa&quot;,&quot;versicolor&quot;,&quot;virginica&quot;)
&gt; foreach(s=species,.combine=rbind) %do% {filter(train_data,Species==s) %&gt;%
select(-Species) %&gt;% colMeans} -&gt; proto
&gt; proto
Sepal.Length Sepal.Width Petal.Length Petal.Width
result.1
5.029412
3.438235
1.473529
0.2676471
result.2
5.850000
2.763333
4.213333
1.3200000
result.3
6.605556
2.977778
5.575000
2.0277778
&gt; result &lt;- knn1(proto,test_data[,-5],species)
&gt; sum(result==test_data$Species)/nrow(test_data)
[1] 0.88
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/G78D2L247D.jpg)

分類結果の可視化
◦全学習サンプルをプロトタイプとした
場合
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/L7LM2L2VJR.jpg)

分類結果の可視化
◦各クラス１プロトタイプとした場合
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/4EMY8M8NEW.jpg)

プロトタイプはどこにある
のか見てみる
plot(test_data$Sepal.Length,test_data$Sepal.Width,
pch=16,col=test_data$Species)
points(proto$Sepal.Length,proto$Sepal.Width,
pch=3,cex=5,col=1:3)
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/PER95V54J9.jpg)

線形識別（パーセプトロン）
◦ 準備：2クラスにする(virginicaとそれ以外)
train_2cls &lt;- as.numeric(train_data$Species ==
&quot;virginica&quot;)*2-1
Test_2cls &lt;- as.numeric(test_data$Species ==
“virginica”)*2-1
◦ パーセプトロンの計算
perceptron_test &lt;- function(x,w) {
res &lt;- rep(0,nrow(x))
for (i in 1:nrow(x)) {
xx &lt;- as.numeric(c(1,x[i,]))
z &lt;- w %*% xx; res[i] &lt;- sign(z)
}
res
}
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/P7XQKZKZEX.jpg)

線形識別（パーセプトロン）
◦ パーセプトロン学習
perceptron_train &lt;- function(x,y,rho,niter) {
w &lt;- runif(ncol(x)+1)
corr &lt;- rep(0,niter)
for (k in 1:niter) {
correct &lt;- 0
for (i in 1:nrow(x)) {
xx &lt;- as.numeric(c(1,x[i,])); z &lt;- sign(w %*% xx)
if (z != y[i]) {
w &lt;- w+y[i]*rho*xx
} else {
correct &lt;- correct+1
}
}
corr[k] &lt;- correct/nrow(x)
}
return(list(corr=corr,weight=w))
}
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/37K9585V7D.jpg)

線形識別（パーセプトロン）
◦ やってみる（学習）
result &lt;- perceptron_train(train_data[,1:4],
train_2cls,0.01,10)
plot(result$corr,type=&quot;b&quot;,xlab=&quot;iteration&quot;,ylab=&quot;accuracy&quot;)
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/LJ3WK21QJ5.jpg)

線形識別（パーセプトロ
ン）
◦学習データに対する性能
result1 &lt;- perceptron_test(train_data[,1:4],result$weight)
plot(train_data$Sepal.Length,train_data$Sepal.Width,
pch=16,col=1+(train_2cls+1)/2)
points(train_data$Sepal.Length,train_data$Sepal.Width,
cex=3,col=1+(result1+1)/2)
識別率89%
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/8JDK3ZXWEG.jpg)

線形識別（パーセプトロ
ン）
◦テストデータに対する性能
&gt; result2 &lt;- perceptron_test(test_data[,1:4],result$weight)
&gt; plot(test_data$Sepal.Length,test_data$Sepal.Width,
pch=16,col=1+(test_2cls+1)/2)
&gt; points(test_data$Sepal.Length,test_data$Sepal.Width,
cex=3,col=1+(result2+1)/2)
識別率74%
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/VEPK4DPX78.jpg)

ニューラルネット（３層）
◦ とりあえず中間１層ユニット数10
&gt; library(nnet)
&gt; nnmax &lt;- max(train_data[,1:4])
&gt; nnmin &lt;- min(train_data[,1:4])
&gt; nntrain_data &lt;- (train_data[,1:4]-nnmin)/(nnmax-nnmin)
&gt; model &lt;- nnet(nntrain_data,train_2cls,size=10,linout=TRUE)
&gt; nntest_data &lt;- (test_data[,1:4]-nnmin)/(nnmax-nnmin)
&gt; result &lt;- predict(model,nntest_data)
&gt; sum(sign(result)==test_2cls)/length(result)
[1] 0.94
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/27VVX1237Q.jpg)

ニューラルネット（３層）
◦ 可視化
&gt; result3 &lt;- sign(result)
&gt; plot(test_data$Sepal.Length,test_data$Sepal.Width,
pch=16,col=1+(test_2cls+1)/2)
&gt; points(test_data$Sepal.Length,test_data$Sepal.Width,
cex=3,col=1+(result3+1)/2)
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/5JGLV2RY7L.jpg)

ニューラルネット（３層）
◦ 中間層のユニット数を変えて様子を見てみる
size_result &lt;- rep(0,20)
for (i in 1:20) {
model &lt;- nnet(nntrain_data,train_2cls,size=i,
linout=TRUE)
res &lt;- predict(model,nntest_data)
size_result[i] &lt;- sum(sign(res)==test_2cls)/length(res)
}
plot(size_result,type=&quot;b&quot;)
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/47QY6PV6EP.jpg)

ニューラルネット（３層）
◦３クラス分類をやってみよう
train_onehot &lt;- matrix(0,nrow=nrow(train_data),ncol=3)
for (i in 1:nrow(train_data)) {
train_onehot[i,as.numeric(train_data[i,5])] &lt;- 1
}
model &lt;- nnet(nntrain_data,train_onehot,size=10)
result &lt;- predict(model,nntest_data)
result &lt;- apply(result,1,which.max)
sum(result==as.numeric(test_data[,5]))/length(result)
[1] 0.98
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/KE4W4YMMJ1.jpg)

ニューラルネット（３層）
◦可視化
plot(test_data$Sepal.Length,test_data$Sepal.Width,
pch=16,col=test_data[,5])
points(test_data$Sepal.Length,test_data$Sepal.Width,
cex=3,col=result)
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/L71Y468YJG.jpg)

GMM
library(mclust)
gmm &lt;- list()
for (i in 1:3) {
dplyr::filter(train_data,as.numeric(Species)==i) %&gt;%
dplyr::select(-Species) %&gt;%
Mclust(modelNames=&quot;EVI&quot;) -&gt; gmm[[i]]
}
result.m &lt;- matrix(0,nrow=nrow(test_data),ncol=3)
for (cl in 1:3) {
result.m[,cl] &lt;- rowSums(cdens(test_data[,1:4], &quot;EVI&quot;,
parameters=gmm[[cl]]$parameters))
}
result &lt;- apply(result.m,1,which.max)
sum(result==as.numeric(test_data$Species))/length(result)
[1] 0.94
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/G7WGXWZ1E2.jpg)

GMMの分布を見てみる
library(ellipse)
plot(train_data$Sepal.Length,train_data$Sepal.Width,pch=16,
col=train_data[,5])
for (k in 1:3) {
p &lt;- gmm[[k]]$parameter
for (i in 1:gmm[[k]]$G) {
points(ellipse(p$variance$sigma[1:2,1:2,i]*p$pro[i],
centre=p$mean[1:2,i]),type=&quot;l&quot;,col=k)
}
}
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/4JZL651XE3.jpg)

演習５
◦The Titanic Dataset を使い、これま
で説明した手法のいずれかを使って生
存/非生存の予測を行い、正解率を計算
せよ。
30


# Page. 31

![Page Image](https://bcdn.docswell.com/page/YE6W29LPEV.jpg)

The Titanic Dataset
◦タイタニック号の乗客の情報と、生存/
死亡のデータセット
◦ https://www.kaggle.com/vinicius15098
7/titanic3 より取得、クリーニング済み
◦ クラスルームにアップロードされたCSV
ファイルを利用する
◦ titanic_train.csv 学習用
◦ titanic_test.csv 評価用
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/GE5M2N1PE4.jpg)

The Titanic Dataset
◦データ項目
◦ pclass: 船室等級
◦ age: 年齢
◦ sibsp: 乗船した兄弟の人数
◦ parch: 乗船した親または子の人数
◦ fare: 乗船料
◦ sex: 性別 (0=女 1=男)
◦ survived: 生存/死亡 (0=死亡 1=生存)
32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/9729451ZJR.jpg)

The Titanic Dataset
◦基本情報
◦ サンプル数 1043 （欠損値は除いてあ
る）
◦ 生存数 425 / 死亡数 618
◦ 全てを「死亡」と判定すると６割当たる
33


# Page. 34

![Page Image](https://bcdn.docswell.com/page/DJY4MKZN7M.jpg)

演習５
◦The Titanic Dataset を使い、これま
で説明した手法のいずれかを使って生
存/非生存の予測を行い、正解率を計算
せよ。
◦ モデル学習には titanic_train.csv を利用
◦ 評価には titanic_test.csv を利用
◦ レポートには、使った手法とシステム、
データの分析結果、評価データの正解率を
記載すること
34


# Page. 35

![Page Image](https://bcdn.docswell.com/page/V7NYWR3VE8.jpg)

何を使えばいいのか？
◦何を使っても構いません
◦ ツールを使ってもいいし、自分でプログラ
ムを１から書き起してもよい
◦代表的なツール
◦R
◦ データ分析に使われる代表的なプログラミング言
語/実行環境
◦ 手法が豊富だが言語仕様には癖がある
35


# Page. 36

![Page Image](https://bcdn.docswell.com/page/YJ9PXM9V73.jpg)

何を使えばいいのか？
◦代表的なツール
◦ Python
◦ データ処理・深層学習などで人気のプログラミン
グ言語
◦ 今回の演習にはscikit-learnを使うと良い
◦ Excel
◦ ご存知表計算ツールだが基本的には何でもできる
◦ [Excel 機械学習]でググるとたくさん出てくる
36


# Page. 37

![Page Image](https://bcdn.docswell.com/page/GJ8D2L94JD.jpg)

何を使えばいいのか？
◦ 代表的なツール
◦ MATLAB
◦ 有料だけど強力なツール
◦ 東北大では使い放題
◦ MathWorks のWebサイトにビデオ教材などがある
◦ WEKA
◦ Javaで書かれた機械学習ツール
◦ データを入力して識別器を選ぶだけで識別ができる
◦ https://www.cs.waikato.ac.nz/ml/weka/
37


# Page. 38

![Page Image](https://bcdn.docswell.com/page/LJLM2LWVER.jpg)

何を使えばいいのか？
◦代表的なツール
◦ H2O
◦ Javaで書かれた機械学習ツール
◦ 単体のアプリではなく、Webサーバとして動く
◦ https://github.com/h2oai/h2o-3
◦ ググると日本語の解説が結構出てくる
38


# Page. 39

![Page Image](https://bcdn.docswell.com/page/47MY8M9N7W.jpg)

注意点
◦パターン認識のモデルと実際のツール
との対応付けを目的としている
◦ 性能がいいからといって、中身のよくわか
らないモデルを使わないこと
◦ 使う場合は、モデルの原理についての説明をレ
ポートに含める
◦ 性能の良し悪しは問わない
◦ データの分析、結果の分析をすること
◦ データの可視化は望ましい
39


# Page. 40

![Page Image](https://bcdn.docswell.com/page/P7R95VG4E9.jpg)

ちなみにこれがChatGPTの
答えだ！
*参考*にしてね！
40


