2020-6 | Yinmaは異常な心音を認識する


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(自分だけに役立つ)

オリジナルの記事を14件公開 Likes0 訪問数575

おすすめ

転載: blog.csdn.net/weixin_44618426/article/details/104474731