BP神经网络的数据分类—语音特征信号识别

清空环境变量
clc
clear
数据的提取和预处理


%下载四类语音特征信号矩阵
load data1 c1
load data2 c2
load data3 c3
load data4 c4


%四个特征信号矩阵合成一个矩阵
data(1:500,:)=c1(1:500,:);
data(501:1000,:)=c2(1:500,:);
data(1001:1500,:)=c3(1:500,:);
data(1501:2000,:)=c4(1:500,:);


%从1到2000间随机排序
k=rand(1,2000);
[m,n]=sort(k);


%从data中找出输入和输出
input=data(:,2:25);


output1 =data(:,1);


%把输出从1维变成4维
for i=1:2000
    switch output1(i)
        case 1
            output(i,:)=[1 0 0 0];
        case 2
            output(i,:)=[0 1 0 0];
        case 3
            output(i,:)=[0 0 1 0];
        case 4
            output(i,:)=[0 0 0 1];
    end
end


%随机提取1500个样本做为训练样本,500个样本作为预测样本
input_train=input(n(1:1500),:)';
output_train=output(n(1:1500),:)';
input_test=input(n(1501:2000),:)';
output_test=output(n(1501:2000),:)';


%选连样本输入输出数据归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);
BP网络建立


%创建一个BP神经网络
net=newff(inputn,outputn,20);


net.trainParam.epochs=50;
net.trainParam.lr=0.1;
net.trainParam.goal=0.00004;
BP网络训练


net=train(net,inputn,outputn);
BP网络预测


%预测数据归一化
inputn_test=mapminmax('apply',input_test,inputps);


%网络预测输出
an=sim(net,inputn_test);


%网络输出反归一化
BPoutput=mapminmax('reverse',an,outputps);
结果分析


%根据网络输出找出数据属于哪类
for i=1:500
    output_fore(i)=find(BPoutput(:,i)==max(BPoutput(:,i)));
end


%BP网络预测误差
error=output_fore-output1(n(1501:2000))';


%画出预测语音种类和实际语音种类的分类图
figure(1)
plot(output_fore,'r')
hold on
plot(output1(n(1501:2000))','b')
legend('预测语音类别','实际语音类别')


%画出误差图
figure(2)
plot(error)
title('预测误差')


k=zeros(1,4);  %
%找出判断错误的分类属于哪一类
for i=1:500
    if error(i)~=0
        [b,c]=max(output_test(:,i));
        switch c
            case 1
                k(1)=k(1)+1;
            case 2
                k(2)=k(2)+1;
            case 3
                k(3)=k(3)+1;
            case 4
                k(4)=k(4)+1;
        end
    end
end


%找出每类的个体和
kk=zeros(1,4);
for i=1:500
    [b,c]=max(output_test(:,i));
    switch c
        case 1
            kk(1)=kk(1)+1;
        case 2
            kk(2)=kk(2)+1;
        case 3
            kk(3)=kk(3)+1;
        case 4
            kk(4)=kk(4)+1;
    end
end


%正确率
rightridio=(kk-k)./kk
rightridio =


    0.7265    1.0000    0.9000    0.9291

你可能感兴趣的:(c,网络,input,output,plot)