Train_a心音データMFCC特徴抽出後、HMMは、異常を識別するために使用された
トレーニングセット:1-29
テストセット:270から299を
実験
実験結果
分析と議論
1.初期設定の影響
使用されるHMMトレーニング法(Baum-Welchアルゴリズム)は、本質的に勾配降下法であり、トレーニングプロセス中に極小値に達する可能性があります。したがって、初期値の選択はより重要であり、適切な初期値は極小問題を回避できます。特定の最適化方法を追加して初期値を選択できます(たとえば、人工免疫アルゴリズムを使用して、特定の初期値設定間隔で最適なパラメーターのセットを初期値として選択し、Baum-Welchアルゴリズムをトレーニングに使用できます)。離散HMMでは、パラメーターBはシステムのパフォーマンスに大きな影響を与え、パラメーターAおよびπを超えます。したがって、パラメータBの初期値のみを選択するために、ある最適化方法を採用することもできる。
2.トレーニングデータ量の影響
連続的な隠れマルコフモデルでは必要なトレーニングデータは少なくなりますが、離散HMMの場合、必要なトレーニングデータの量は多くなります。信頼できるパラメーターモデルをトレーニングするには、トレーニングセットのデータを増やす必要があります。この実験では、ハードウェアの速度上の理由により、30セットのトレーニングセットしか選択されておらず、信頼性の高いパラメーターモデルをトレーニングできませんでした。その後、トレーニングセットのサンプル数を増やすことを検討すると、システム認識率が大幅に改善されます。
3.出力確率行列の平滑化問題
原理
3つの重要な質問
3つのソリューション
コード
clear all;
% 读入训练数据集train.mat
load train.mat;
N = 4; % hmm的状态数
M = [3,3,3,3]; % 每个状态对应的混合模型成分数
for i = 1:length(D) % 数字的循环
fprintf('\n计算标号%d的mfcc特征参数\n',i);
for k = 1:length(D{i}) % 样本数的循环
obs(k).sph = D{i}{k}; % 数字i的第k个语音
obs(k).fea = mfcc(obs(k).sph); % 对语音提取mfcc特征参数
end
fprintf('\n训练标号%d的hmm\n',i);
hmm_temp=inithmm(obs,N,M); %初始化hmm模型
hmm{i}=baum_welch(hmm_temp,obs); %迭代更新hmm的各参数
end
fprintf('\n训练完成!\n');
% 读入待识别语音
fprintf('开始识别\n');
accuracy=[0,0];
for i=1:length(C)
add=0;
for k = 1:length(C{i}) % 样本数的循环
rec_sph=C{i}{k}; % 待识别语音
rec_fea = mfcc(rec_sph); % 特征提取
% 求出当前语音关于"正常、异常"hmm的p(X|M)、
for m=1:2
pxsm(m) = viterbi(hmm{m}, rec_fea);
end
[d,n] = max(pxsm); % 判决,将该最大值对应的序号作为识别结果
if n == i
add=add+1;
end
end
accuracy(i) =add/length(C{i})*100;
end
fprintf('识别正常心音的概率%6.4f\n',accuracy(1))
fprintf('识别异常心音的概率%6.4f\n',accuracy(2))
train——BWメソッド
EMアルゴリズムは、隠れた変数を使用して最適化問題を解くための効果的な方法です。EMアルゴリズムは、期待値最大化アルゴリズムの略語です。EMアルゴリズムは反復アルゴリズムです。各反復プロセスでは、主に2つのステップに分かれています:期待値ステップと最大化。 )手順。
前方-後方アルゴリズム
に従って、計算されたアルファとベータは、遷移確率式に従って計算されます。
%-----------计算转移概率ksai-------
%对于观测序列,在时刻t从状态Si转移到转台Sj的转移概率ksai
ksai=zeros(T-1,N,N);
for t=1:T-1
denom=sum(alpha(t,:).*beta(t,:));
for i=1:N-1
for j=i:i+1
nom=alpha(t,i)*trans(i,j)*mixture(mix(j),O(t+1,:))*beta(t+1,j);
ksai(t,i,j)=c(t)*nom/denom;
end
end
end
BW再評価式に従って計算^ a / b
%----重估转移概率矩阵A
for i=1:N-1
demon=0;
for k=1:K
tmp=param(k).ksai(:,i,:);
demon=demon+sum(tmp(:)); %对时间t,j求和
end
for j=i:i+1
nom=0;
for k=1:K
tmp=param(k).ksai(:,i,j);
nom=nom+sum(tmp(:)); %对时间t求和
end
hmm.trans(i,j)=nom/demon;
end
end
function [prob,q]=viterbi(hmm,O)
%Viterbi算法
%输入:
%hmm--hmm模型
%O--输入观察序列,T*D,T为帧数,D为向量维数
%输出:
%prob--输出概率
%q--状态序列
init=hmm.init; %初始概率
trans=hmm.trans; %转移概率
mix=hmm.mix; %高斯混合
N=hmm.N; %HMM的状态数
T=size(O,1); %语音帧数
%计算log(init)
ind1=find(init>0);
ind0=find(init<=0);
init(ind1)=log(init(ind1));
init(ind0)=-inf;
%计算log(trans);
ind1 = find(trans>0);
ind0 = find(trans<=0);
trans(ind0) = -inf;
trans(ind1) = log(trans(ind1));
%初始化
delta=zeros(T,N); %帧数×状态数
fai=zeros(T,N);
q=zeros(T,1);
%t=1;
for i=1:N
delta(1,i)=init(i)+log(mixture(mix(i),O(1,:)));
end
%t=2:T
for t=2:T
for j=1:N
[delta(t,j),fai(t,j)]=max(delta(t-1,:)+trans(:,j)');
delta(t,j)=delta(t,j)+log(mixture(mix(j),O(t,:)));
end
end
%最终概率和最后节点
[prob q(T)]=max(delta(T,:));
%回溯最佳状态路径
for t=T-1:-1:1
q(t)=fai(t+1,q(t+1));
end
ありがとう
「MATLABの音声信号分析と合成への応用」[Song Zhiyong] [[Beijing Aerospace Press] [2013.11]
「音声信号処理実験コース」[Liang Ruiyu、Zhao Li、Wei Xin]] [機械産業プレス] [2016.03]
「デジタル音声処理とMATLABシミュレーション第2版」[张雪英] [Electronic Industry Press] [2016.05]
HMM学習の最高の例-自然言語処理のWebサイト翻訳が大好き
リンク:HMMメモ(バックアップ)パスワード: x30v(自分だけに役立つ)