知能情報工学 年4月26日 吉川雅博 第3回第3回 k最近傍法
プロトタイプによるNN法の流れ 2 AD変換前処理部特徴抽出部識別部 ・標本化 ・量子化 ・ノイズ除去 ・正規化 識別辞書 (プロトタイプ) 音声や画像 (アナログ信号) 識別 結果 識別が容易な 特徴を抽出 プロトタイプと比較 学習
AD変換 3 アナログ信号 一定区間で区切って サンプルをとる 標本化(サンプリング) サンプリング周波数 データを何段階の 数値で表現するか 量子化 量子化ビット 音楽CD 44.1kHz 音声認識 16kHz 音楽CD 16bit (65536段階)
前処理部 4 音声・・スペクトルサブトラクションによるノイズ除去 画像・・平均値フィルタやメディアンフィルタによるノイズ除去 対象の特徴に合わせて適切に処理する必要がある
特徴抽出 5 特徴抽出は識別に役立つ情報を取り出す処理 音声認識:個人の声の性質や声の大きさ 文字認識:文字の大きさや色 識別には無意味 識別に必要な特徴のみを取り出す
特徴ベクトル 6
学習(プロトタイプの決定) 7 プロトタイプは学習データから決定する
プロトタイプによるNN法 8
NN法の定式化(1) 9
NN法の定式化(2) 10
NN法と識別境界 11 プロトタイプ 識別境界 NN法は2点のプロトタイプを結ぶ直線の 垂直2等分線(識別境界)を求めるのと同じ
演習3 12 ※荒木雅弘「フリーソフトでつくる音声認識システム」より
演習3-解答 13
演習3-解答 14
k最近傍法(k-NN法)(1) 15 プロトタイプによるNN法はプロトタイプを学習データから決める → パーセプトロンなどで学習が必要 学習を行わずすべての学習データをプロトタイプとして扱う k最近傍法(k-NN法) プロトタイプを決定する学習を行わないのもアリ 各クラスのプロトタイプ
最も近い3個のうち が2個, が1個 → に決定 k最近傍法(k-NN法)(2) 16 ①すべての学習データとの距離を計算 ②最も近い学習データのクラスに決定 1-NN法 k-NN法 ①すべての学習データとの距離を計算 ②最も近い学習データk個の中で多数決を行う ③投票数の多いクラスに決定 3-NNの場合
kの値による識別境界の変化 17 k = 1k = 30
演習 ※荒木雅弘「フリーソフトでつくる音声認識システム」より
演習4-解答
演習 ※荒木雅弘「フリーソフトでつくる音声認識システム」より
演習5-解答
k-NNの長所・短所 22 長所 ・学習が不要 ・実装が簡単な割に高い識別率(ベンチマークとして利用) 短所 ・すべての学習データとの距離計算が必要(処理時間長い) ・コンピュータに大きな記憶領域(メモリ)が必要 ・kの値は実験的に求める必要性あり
K-NNのコード 23 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 [unused bestbestClass] = min(distSum(n,:)); predictLabelVote(n) = classType(bestbestClass); % 同票決戦後の結果 end