基于麻雀搜索算法优化SVR的锂电池寿命预测研究( 三)

目录

一、基于 SVR 的锂电池剩余使用寿命预测 

二、构建 SVR 预测模型

1.流程细则

2.前置准备

3.结果分析

三、结束



一、基于 SVR 的锂电池剩余使用寿命预测 

填坑:开始完成麻雀搜索算法优化SVR的前置工作及比较

        支持向量回归(Support Vector Regression,SVR)是一种基于支持向量机(SVM)的回归算法。与传统的线性回归不同,SVR 是一种非线性回归算法,它适用于具有非线性关系的数据集。SVR 的主要思想是将数据映射到高维空间中,使得在该空间内可以将数据划分为不同的类型,并找到最佳的分界线,以在预测过程中能够最大化预测误差的间隔。

        SVR模型对待训练数据有一定的依赖性,然而其损失函数会忽视在模型预测的内部间隔阈值之内的训练数据,这可能导致关键信息的缺失。

        当应用SVR模型处理非线性可分离数据时,在输入空间里众多的回归问题可能会受影响,导致无法实现线性回归。这就需要利用核函数,它将数据样本点投射到高维特征空间,在高维空间中呈现线性可分的特征,进而获得额外的有价值信息。由于锂电池在容量退化趋势内展现的是非线性特性,主要研究数据中的非线性回归特征。


提示:具体可参考我发布的参考文献

二、构建 SVR 预测模型

1.流程细则

        其预测精度和泛化能力受到惩罚因子C和核参数σ的影响,这两个参数对SVR算法预测效果的精确程度具有直接作用。

        网格搜索需要穷举所有可能的参数组合,计算量会很大,训练时间也会很长,但实现简单明了。故选择了较为常用的网格搜索作为确定惩罚因子C和核参数的方法。

        本文建立的预测方法流程如图所示,包括了数据预处理、划分数据、参数优化、训练模型和预测结果输出等步骤。这一流程旨在提高预测模型的准确性和可靠性,为进一步应用锂电池寿命预测模型提供了可行的方法和流程。

    根据基于 SVR 的预测模型构建的流程图,其主要步骤如下:
Step1: 实验数据预处理。根据第 2 章中提取的健康因子,从 NASA 提供的原始数据集中提取出每个周期的放电时间的数据,其中放电时间为输入,锂电池的容量作为代表剩余使用寿命的间接量为输出。划分训练集和测试集,并将其进行归一化处理。
Step2: 构建 SVR 模型。使用 SVR 算法构建预测模型,选择径向基核函数作为 SVR 的核函数。
Step3: 初始化参数。选择了常用的网格搜索方法来确定 SVR 的超参数,设置参数上下限为 0.01 至 100。首先初始化最小的均方误差,使用当前的参数 C 和 σ 构建 SVR 模型,在当前定义的参数范围中进行组合并遍历,代入训练集,计算均方误差,再更新最小的均方误差和对应的参数 C 和 σ ,直到输出最优参数。
Step4: 训练 SVR 模型。将训练集输入到 SVR 模型进行训练。
Step5: 预测电池剩余寿命。将测试集输入到训练好的 SVR 模型,对锂电池的剩余寿命进行预测。

2.前置准备

首先打开Matlab,选择代码所在的文件夹,其中libsvm-3.24是我下载的版本,其余版本也行。

其实B站有些SVR Tool包也不错,可惜与我的MATLAB版本有点冲突,附一个

手把手教你用MATLAB写支持向量机回归(SVR)模型,小小白专用_哔哩哔哩_bilibili

        数据读取部分,我当时为了偷懒,将电池型号数据在excel进行分割(其实可以进行优化,现在代码对非本次电池特性数据不具有普适性,需要人为选择),如步骤所示,读取了B5电池的特性参数进行训练

SVR代码如下:

%% 初始化程序
close all;
clear;
clc;
format compact;
addpath('libsvm-3.24')

%% 数据读取
data=xlsread('B5特征数据.xlsx','Sheet1','A1:B168'); %%数据为B5/6/7的数据,共168个样本
%输入输出数据
input=data(:,1);    %data的第一列为特征指标
output=data(:,end);  %data的最后面一列为输出的指标值
N=length(output);   %全部样本数目
testNum=68;   %设定测试样本数目
trainNum=N-testNum;    %计算训练样本数目
%% 划分训练集、测试集
input_train = input(1:trainNum,:);
output_train =output(1:trainNum);
input_test =input(trainNum+1:trainNum+testNum,:);
output_test =output(trainNum+1:trainNum+testNum);
%% 数据预处理
% 数据预处理,将训练集和测试集归一化到[0,1]区间
[mtrain,ntrain] = size(input_train);
[mtest,ntest] = size(input_test);

dataset = [input_train;input_test];
% mapminmax为MATLAB自带的归一化函数
[dataset_scale,ps] = mapminmax(dataset',0,1);
dataset_scale = dataset_scale';

input_train = dataset_scale(1:mtrain,:);
input_test = dataset_scale( (mtrain+1):(mtrain+mtest),: );
%% SVR模型创建/训练
% 寻找最佳c参数/g参数——交叉验证方法
% SVM模型有两个非常重要的参数C与gamma。
% 其中 C是惩罚系数,即对误差的宽容度。
% c越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差
% gamma是选择RBF函数作为kernel后,该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,
% gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
% 定义参数范围
C_range = (1:100); % C 参数范围:1 到 10^2
gamma_range = 10.^(-2:1); % γ 参数范围:10^-4 到 10^2
% 网格搜索
mse_min = Inf; % 初始化最小的均方误差
for i = 1:length(C_range)
    for j = 1:length(gamma_range)
        % 使用当前的 C 和 gamma 构建 SVR 模型
        svr = fitrsvm(input_train,output_train,'KernelFunction','rbf','BoxConstraint',C_range(i),'KernelScale',gamma_range(j));
        % 预测测试集
        Ypred = predict(svr,input_test);
        % 计算均方误差
        mse = mean((output_test-Ypred).^2);
        % 更新最小的均方误差和对应的 C 和 gamma
        if mse < mse_min
            mse_min = mse;
            C_best = C_range(i);
            g_best = gamma_range(j);
        end
    end
end

%输出最优的 C 和 gamma
fprintf('最优的 C 为 %f,最优的 gamma 为 %f,对应的均方误差为 %f。\n',C_best,g_best,mse_min);
%% 利用最佳的参数进行SVR网络训练
c=10,g=1;
cmd = ['-t 2',' -c ',num2str(c),' -g ',num2str(g),' -s 3  -p 0.01'];
model = libsvmtrain(output_train,input_train,cmd);
%% SVR预测
[test_simu,accuracy] = libsvmpredict(output_test,input_test,model);
error=test_simu-output_test;      %预测值和真实值的误差
a = find(test_simu);
%% 结果分析
%%真实值与预测值误差比较
figure
plot(output)
hold on
plot(a+100,test_simu)
hline1 = yline(1.4, '--r', 'LineWidth', 2);
hline2 = xline(100, '--b', 'LineWidth', 2);
legend('期望值','SVR预测值','失效阈值','预测起点')
xlabel('测试循环周期'),ylabel('当前容量')
title('SVR测试集预测值和期望值的对比')
set(gca,'fontsize',12)

figure
plot(error,'ro-','linewidth',1.2)
xlabel('测试循环周期'),ylabel('容量预测偏差')
title('SVR测试集的预测误差')
set(gca,'fontsize',12)

%计算误差
[len,~]=size(output_test);
SSE1=sum(error.^2);
MAE1=sum(abs(error))/len;
MSE1=error'*error/len;
RMSE1=MSE1^(1/2);
MAPE1=mean(abs(error./output_test));
r=corrcoef(output_test,test_simu);    %corrcoef计算相关系数矩阵,包括自相关和互相关系数
R1=r(1,2);    

disp(' ')
disp('/')
disp('预测误差分析...')
disp(['平均绝对误差MAE为:      ',num2str(MAE1)])
disp(['均方误差MSE为:              ',num2str(MSE1)])
disp(['均方根误差RMSE为:        ',num2str(RMSE1)])
disp(['平均百分比误差MAPE为: ',num2str(MAPE1*100),'%'])
disp(['相关系数R为:                     ',num2str(R1)])

%打印结果
disp(' ')
disp('/')
disp('打印测试集预测结果...')
disp(['    编号      实际值     预测值      误差'])
for i=1:len
    disp([i,output_test(i),test_simu(i),error(i)])
end

3.结果分析

        由 SVR 预测结果可知,当预测起点为 100 90 时,基于 SVR 的预测模型可以大致上预测四块电池的退化趋势。
        与数据集的原始数据对比,特别是 B0005、 B0007 电池的退化趋势曲线不能做到特别精确的拟合。在预测后期,对 B0006 电池的预测值更接近真实值,而B0005、 B0007 电池的容量预测值随着电池循环使用次数的增加,其下降幅度有所减小,与真实值有较大的出入。

        为了更好其差异,对 SVR 模型的预测值与真实值进行对比分析,得出 SVR 预测模型误差图,进行代码模拟,运行结果如下图 所示:


三、结束

填坑好累~·~~~

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
麻雀搜索算法是一种优化算法,它模拟麻雀在寻找食物和避免危险的行为,通过觅食和逃避的循环迭代搜索最优解。这种算法在许多领域都得到了应用,包括机器学习领域中的svm回归预测。 svm回归是一种通过寻找最优超平面来进行回归预测的机器学习算法。通过使用麻雀搜索算法优化svm回归模型,可以更好地优化模型的性能和预测准确度。 下面是一个使用麻雀搜索算法优化svm回归预测的简单示例代码: ``` import numpy as np from sklearn import svm from sklearn.model_selection import cross_val_score from sko.MASO import MASO from sko.SA import SA from sko.AFSA import AFSA # 定义麻雀搜索算法的适应度函数 def svm_fitness(x, y, c, gamma): clf = svm.SVR(C=c, kernel='rbf', gamma=gamma) clf.fit(x, y) scores = cross_val_score(clf, x, y, cv=5, scoring='neg_mean_squared_error') return -np.mean(scores) # 数据集 X = np.random.rand(100, 10) y = np.random.rand(100) # 麻雀搜索算法 maso = MASO(svm_fitness, n_dim=2, n=20, max_iter=100, x0=[10, 0.1], ub=[100, 1], lb=[1, 0.01]) c, gamma = maso.run(X, y) # SVM回归模型 clf = svm.SVR(C=c, kernel='rbf', gamma=gamma) clf.fit(X, y) # 预测结果 y_pred = clf.predict(X) mse = np.mean((y_pred-y)**2) print('MSE:', mse) ``` 代码中使用了MASO算法进行参数寻优,其中n_dim表示参数维度,n表示种群大小,max_iter表示迭代次数,x0, ub, lb分别为初始值、上限和下限。在适应度函数中,定义了svm回归模型和交叉验证指标,返回交叉验证误差的相反数。 运行代码后,我们可以获得最优的C和gamma参数,然后使用这些参数训练SVM回归模型,并进行预测和误差评估。 综上,麻雀搜索算法优化svm回归预测能够提升模型性能和预测准确度,是一种有效的机器学习算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌新躺好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值