第3回

知能情報工学
第3回
k最近傍法
2016年4月26日
吉川雅博
1
プロトタイプによるNN法の流れ
音声や画像
(アナログ信号)
AD変換
前処理部
特徴抽出部
・標本化
・量子化
・ノイズ除去
・正規化
識別が容易な
特徴を抽出
識別部
識別
結果
プロトタイプと比較
学習
識別辞書
(プロトタイプ)
2
AD変換
アナログ信号
一定区間で区切って
サンプルをとる
標本化(サンプリング)
サンプリング周波数
音楽CD 44.1kHz
音声認識 16kHz
データを何段階の
数値で表現するか
量子化
量子化ビット
音楽CD 16bit
(65536段階)
3
前処理部
音声・・スペクトルサブトラクションによるノイズ除去
画像・・平均値フィルタやメディアンフィルタによるノイズ除去
対象の特徴に合わせて適切に処理する必要がある
4
特徴抽出
特徴抽出は識別に役立つ情報を取り出す処理
音声認識:個人の声の性質や声の大きさ
文字認識:文字の大きさや色
識別には無意味
識別に必要な特徴のみを取り出す
5
特徴ベクトル
特徴抽出後は特徴を並べた𝑑次元のベクトルで表現
𝑥𝑑
𝒙 = (𝑥1 , 𝑥2 , … , 𝑥𝑑 )𝑡
𝑥𝑗
𝑥1
𝑥2
𝑥3
𝑑次元空間を特徴空間,𝒙を特徴ベクトルと呼ぶ
6
学習(プロトタイプの決定)
𝑐種類のクラスをそれぞれ𝜔1 , 𝜔2 , … , 𝜔𝑐 とし,
各クラスのプロトタイプを𝒑1 , 𝒑2 , … , 𝒑𝑐 とする
𝑥𝑑
𝒑1
𝒑𝑖
𝒑2
𝒑𝑐
𝑥1
𝑥𝑗
𝑥2
𝑥3
プロトタイプは学習データから決定する
7
プロトタイプによるNN法
各プロトタイプとの距離を計算し最も近いプロトタイプ𝒑𝑖 に決定する
→最近傍決定則,最近傍法(Nearest Neighbor法:NN法)
𝑥𝑑
𝒙
𝒑1
𝒑2
𝒑𝑖
𝒑𝑐
𝑥1
𝑥𝑗
𝑥2
𝑥3
8
NN法の定式化(1)
𝑐種類のクラスをそれぞれ𝜔1 , 𝜔2 , … , 𝜔𝑐 とする
クラスωi のプロトタイプ𝒑𝑖 を𝑑次元の特徴ベクトルで定義
𝒑𝑖 = 𝑝𝑖1 , 𝑝𝑖2 , … , 𝑝𝑖𝑑
𝑡
(𝑖 = 1, … , 𝑐)
未知データ𝒙を𝑑次元の特徴ベクトルで定義
𝒙 = 𝑥1 , 𝑥2 , ⋯ , 𝑥𝑑
𝑡
𝒙と𝒑𝑖 との距離を以下のように計算(ユークリッド距離)
𝐷 𝒙, 𝒑𝑖 =
𝑥1 − 𝑝𝑖1
2
+ 𝑥2 − 𝑝𝑖2
2
+ ⋯ + 𝑥𝑑 − 𝑝𝑖𝑑
2
(𝑖 = 1, … , 𝑐)
9
NN法の定式化(2)
距離の最小値を以下のように定義
min 𝐷 𝒙, 𝒑𝑖
(i = 1, ⋯ , 𝑐)
距離が最小となるプロトタイプ(クラス)を求める数式は以下
arg min 𝐷 𝒙, 𝒑𝑖
(i = 1, ⋯ , 𝑐)
𝑖
距離𝐷を最小にする𝑖を返すという意味
10
NN法と識別境界
NN法は2点のプロトタイプを結ぶ直線の
垂直2等分線(識別境界)を求めるのと同じ
プロトタイプ
𝒑1
識別境界
𝒑2
プロトタイプ
11
演習3
クラス𝜔1 のプロトタイプが𝒑1 = (2, 8),
クラス𝜔2 のプロトタイプが𝒑2 = (8, 4)の時,
NN法を用いて未知パターン𝒙 = (1, 6)を識別せよ.
また,識別境界の式を求めよ.
𝑥2
𝒑1 = (2, 8)
𝒙 = (1, 6)
※荒木雅弘「フリーソフトでつくる音声認識システム」より
𝒑2 = (8,4)
𝑥1
12
演習3-解答
𝐷 𝒙, 𝒑1 =
1−2
2
+ 6−8
2
= 5
𝐷 𝒙, 𝒑2 =
1−8
2
+ 6−4
2
= 53
したがって,𝒙はクラス𝜔1 に分類される
𝑥2
𝒑1 = (2, 8)
𝒙 = (1, 6)
𝒑2 = (8,4)
𝑥1
13
演習3-解答
識別境界は,直線𝒑1 𝒑2 の中点 5, 6 を通り,直交する直線
3𝑥1 − 2𝑥2 = 3
𝑥2
3𝑥1 − 2𝑥2 = 3
𝒑1 = (2, 8)
(5,6)
𝒙 = (1, 6)
𝒑2 = (8,4)
𝑥1
14
k最近傍法(k-NN法)(1)
プロトタイプによるNN法はプロトタイプを学習データから決める
→ パーセプトロンなどで学習が必要
各クラスのプロトタイプ
プロトタイプを決定する学習を行わないのもアリ
k最近傍法(k-NN法)
学習を行わずすべての学習データをプロトタイプとして扱う
15
k最近傍法(k-NN法)(2)
1-NN法
①すべての学習データとの距離を計算
②最も近い学習データのクラスに決定
k-NN法
①すべての学習データとの距離を計算
②最も近い学習データk個の中で多数決を行う
③投票数の多いクラスに決定
3-NNの場合
最も近い3個のうち
が2個, が1個 →
に決定
16
kの値による識別境界の変化
k=1
k = 30
17
演習4
以下の学習データを用いて,3-NN法により𝒙 = (3, 4)を識別せよ
𝑥2
5
𝒙
4
𝜔1
3
2
1
𝜔2
1
2
3
4
5
𝑥1
※荒木雅弘「フリーソフトでつくる音声認識システム」より
18
演習4-解答
最も近いのは(3, 3),次に近いのは(2,3)と(4,3)
多数決を行うと𝜔1 が2つ,𝜔2 が1つのため𝜔1 が識別結果となる
𝑥2
5
𝒙
4
𝜔1
3
2
1
𝜔2
1
2
3
4
5
𝑥1
19
演習5
以下の学習データを用いて,3-NN法により𝒙 = (2.1, 3)を識別せよ
𝑥2
5
4
𝜔1
𝒙
3
2
1
𝜔2
1
2
3
4
5
𝑥1
※荒木雅弘「フリーソフトでつくる音声認識システム」より
20
演習5-解答
とても近い学習データ(2, 3)があるにも関わらず,𝜔2 に分類される
→ 距離を考慮した工夫が必要
𝑥2
5
4
𝜔1
𝒙
3
2
1
𝜔2
1
2
3
4
5
𝑥1
21
k-NNの長所・短所
長所
・学習が不要
・実装が簡単な割に高い識別率(ベンチマークとして利用)
短所
・すべての学習データとの距離計算が必要(処理時間長い)
・コンピュータに大きな記憶領域(メモリ)が必要
・kの値は実験的に求める必要性あり
22
K-NNのコード
function predictLabelVote = KNN_(testData,trainData,trainLabel,K)
fprintf('Process is running.\n');
trainData
= trainData';
trainLabel = trainLabel';
testData
= testData';
trainLabelNumber = length(trainLabel);
% 学習データラベルの総数
classType = unique(trainLabel);
% クラスの種類を抽出
testDataNumber = size(testData,2);
% テストデータのサンプル総数
predictLabel = zeros(testDataNumber,1);
% テストデータラベル作成
predictLabelVote = zeros(testDataNumber,1); % 同票決戦
distSum = ones(testDataNumber,length(classType)).*1000; % 同票決戦の集計用
for n = 1:testDataNumber
% 学習サンプルとテストサンプル間のユークリッド距離計算
distance = sum((trainData-testData(:,n)*ones(1,trainLabelNumber)).^2);
% ソートを行ない,ソート前のインデクスを保存
[sortDistance preIndex] = sort(distance);
% classTypeを横軸としたヒストグラムを作成する(K個のラベルで投票)
voteResult = hist(trainLabel(preIndex(1:K)),classType);
% 最も多く識別されたクラスに決定
[maxVote bestClass] = max(voteResult);
predictLabel(n) = classType(bestClass); % 同票決戦処理なしの結果
% 同票決戦の処理(距離の合計が小さい方に決定)
voteIndex = (voteResult==maxVote);
for m = 1:length(voteIndex)
if voteIndex(m)==1
q = trainLabel(preIndex(1:K))==m-1;
distSum(n,m) = sum(sortDistance(q));
end
end
[unused bestbestClass] = min(distSum(n,:));
predictLabelVote(n) = classType(bestbestClass); % 同票決戦後の結果
end
23