本程序参考中文EI期刊《基于 CNN-SVM 的高压输电线路故障识别方法》,程序注释清晰,干货满满,下面对文章和程序做简要介绍。
CNN-SVM分类预测是一种结合了卷积神经网络(Convolutional Neural Network,CNN)和支持向量机(Support Vector Machine,SVM)的分类方法。它的创新点主要体现在以下几个方面:
1. 结合了深度学习和传统机器学习方法:CNN-SVM分类预测方法将深度学习中的卷积神经网络和传统机器学习方法中的支持向量机相结合。CNN作为特征提取器,能够从原始数据中学习到高级特征表示,而SVM则用于对这些特征进行分类。通过结合两种方法的优势,可以提高分类性能。
2. 特征提取和分类分离:CNN-SVM分类预测方法将特征提取和分类两个步骤进行了分离。CNN作为特征提取器,通过卷积和池化等操作从原始数据中提取出高级特征表示,然后将这些特征输入到SVM分类器中进行分类。这种分离的设计可以使特征提取和分类过程更加灵活,方便对不同的数据集和任务进行定制。
3. 引入了支持向量机的优化能力:SVM在机器学习领域中被广泛应用于分类任务,具有较好的泛化性能和鲁棒性。CNN-SVM分类预测方法利用SVM的优化能力,可以有效地处理高维特征空间中的分类问题,避免了传统CNN方法中由于全连接层引入的参数过多和过拟合的问题。
4. 融合了卷积操作和SVM的核函数:在CNN-SVM分类预测方法中,卷积神经网络通过卷积操作实现了特征提取,并且可以应用SVM中的核函数来进一步提高分类性能。卷积操作可以在局部区域内提取特征,并保留了特征的空间结构信息,而SVM的核函数可以将特征映射到高维空间,从而更好地刻画特征之间的非线性关系。
综上,CNN-SVM分类预测方法的创新点在于结合了深度学习和传统机器学习方法,将特征提取和分类分离,利用了支持向量机的优化能力,并融合了卷积操作和SVM的核函数。这些创新点使得该方法在分类任务中具有较好的性能和灵活性。
测试集的预测值与实际值对比:
训练集的预测值与实际值对比:
下面对程序的具体步骤进行详细介绍:
1. 导入数据:从文件Excel"数据集.xlsx"中加载数据,数据包括输入特征和对应的分类标签。
2. 随机划分训练集和测试集:将数据随机划分为训练集和测试集,其中训练集包含150个样本,测试集包含50个样本。
3. 数据归一化:对输入特征进行归一化处理,使用mapminmax函数将数据缩放到0到1的范围内。
4. 数据平铺:将归一化后的训练集和测试集数据进行变换,将其从12×1×1的形状转换为12×1×1×M和12×1×1×N的形状,其中M和N分别是训练集和测试集的样本数。
5. 构造卷积神经网络:定义了一个包含多个层的卷积神经网络模型,包括输入层、卷积层、批归一化层、ReLU激活层、最大池化层、全连接层、Softmax层和分类层。
6. 参数设置:设置训练选项,包括使用SGDM(随机梯度下降法)作为优化算法,设置批大小、最大训练次数、初始学习率、学习率下降策略等。
7. 训练CNN:使用训练数据对CNN模型进行训练。
8. 提取CNN特征给SVM:从训练集和测试集中提取CNN模型的特征,选择了"pool2"层的输出作为特征。
9. 类型转换:将训练集和测试集的特征和标签转换为双精度类型,以适应SVM的输入格式。
10. 创建/训练SVM模型:使用训练集的特征和标签,通过调用svmtrain函数创建并训练SVM模型。
11. SVM仿真测试:使用训练好的SVM模型对训练集和测试集进行预测。
12. 性能评价:计算训练集和测试集的分类准确率。
13. 绘图:绘制训练集和测试集的真实分类结果与预测分类结果的对比图,并显示准确率。
完整代码:
%% 清空环境变量
clear
clc
warning off
%% 导入数据
data = xlsread("数据集.xlsx");
%% 随机划分训练集和测试集
temp = randperm(200);
% 训练集——150个样本
P_train = data(temp(1:150),1:12)';
T_train = data(temp(1:150),13)';
M = size(P_train,2);
% 测试集——50个样本
P_test = data(temp(151:end),1:12)';
T_test = data(temp(151:end),13)';
N = size(P_test,2);
%% 数据归一化
[p_train, ps_input] = mapminmax(P_train,0,1);
p_test = mapminmax('apply',P_test,ps_input);
t_train = T_train;
t_test = T_test;
%% 数据平铺
p_train = double(reshape(p_train,12,1,1,M));
p_test = double(reshape(p_test,12,1,1,N));
t_train = categorical(t_train)';
t_test = categorical(t_test)';
%% 构造卷积神经网络
layers = [
imageInputLayer([12 1 1], "Name","sequence")
convolution2dLayer([2 1], 16, "Name", "conv_1") % 卷积核大小为2*1 生成16个卷积
batchNormalizationLayer % 批归一化层
reluLayer % relu激活层
maxPooling2dLayer([2 1],'Stride',1, "Name", "pool1") % 最大池化层 大小为2*1 步长为1
convolution2dLayer([2 1], 32, "Name", "conv_2") % 卷积核大小为2*1 生成32个卷积
batchNormalizationLayer % 批归一化层
reluLayer % relu激活层
maxPooling2dLayer([2 1],'Stride',1, "Name", "pool2") % 最大池化层 大小为2*2 步长为2
fullyConnectedLayer(3)
softmaxLayer
classificationLayer];
% 参数设置
options = trainingOptions('sgdm',... % SGDM 梯度下降算法
'MiniBatchSize',10,... % 批大小 每次训练样本个数10
'MaxEpochs',50,... % 最大训练次数 50
'InitialLearnRate',1e-2,... % 初始学习率为0.01
'LearnRateSchedule','piecewise',... % 学习率下降
'LearnRateDropFactor',0.1,... % 学习率下降因子 0.1
'LearnRateDropPeriod',35,... % 经过35次训练后 学习率为 0.01*0.1
'Shuffle','every-epoch',... % 每次训练打乱数据集
'ValidationPatience',Inf,... % 关闭验证
'Plots','training-progress',... % 画出曲线
'Verbose',false);
%% 训练CNN
net = trainNetwork(p_train,t_train,layers,options);
%% 提取CNN特征
layer = 'pool2';
p_train = activations(net,p_train,layer,'OutputAs','rows');
p_test = activations(net,p_test, layer,'OutputAs','rows');
%% 类型转换
p_train = double(p_train); p_test = double(p_test);
t_train = double(t_train); t_test = double(t_test);
%% 创建/训练SVM模型
cmd = [' -t 2',' -c ',num2str(100),' -g ',num2str(0.01)];
model = svmtrain(t_train,p_train,cmd);
%% SVM仿真测试
T_sim1 = svmpredict(t_train,p_train,model);
T_sim2 = svmpredict(t_test,p_test,model);
%% 性能评价
error1 = sum((T_sim1' == T_train))/M * 100 ;
error2 = sum((T_sim2' == T_test))/N * 100 ;
%% 绘图
figure
plot(1:M,T_train,'c*',1:M,T_sim1,'mo','LineWidth',1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string={'训练集预测结果对比';['准确率=' num2str(error1) '%']};
title(string)
grid
figure
plot(1:N,T_test,'c*',1:N,T_sim2,'mo','LineWidth',1)
legend('真实值','预测值')
xlabel('预测样本')
ylabel('预测结果')
string={'测试集预测结果对比';['准确率=' num2str(error2) '%']};
title(string)
grid
注意:以上代码中的Excel"数据集.xlsx"、"svmtrain"和"svmpredict"等函数附赠在公众号中,关注私信免费赠送哦。
欢迎感兴趣的小伙伴关注并后台留言获取完整版代码哦~,小编会继续推送更有质量的学习资料、文章程序代码~