文章目录

  • 前言
  • 一、数据准备
  • 二、基于PSO的Bp神经网络预测
    • 1.粒子表达方式
    • 2.目标函数
    • 3.粒子速度和位置的更新
  • 三、MATLAB代码
  • 四、预测结果
  • 五、代码获取方式
  • 总结
  • 近期你可能错过了的好文章

前言

一年一度的NBA总决赛即将开始,去年我们在 优化算法 | 基于GA的Bp神经网络预测20~21赛季NBA总冠军花落谁家这篇推文成功预测雄鹿为2021赛季NBA总冠军,今年我们继续预测21~22赛季NBA总冠军。

各位小伙伴可以点击下方投票,看看各位小伙伴支持勇士,还是支持凯尔特人。不管预测结果如何,希望总决赛的每一场比赛都能够精彩,这样球迷才能享受视觉盛宴。

今天我们准备用基于粒子群优化算法(PSO)的Bp神经网络为各位预测一下今年的NBA总冠军花落谁家?


一、数据准备

在查阅若干资料和文献后,粗略地归纳出影响一只球队夺冠的13个指标,分别如下:
1.季后赛球队场均投篮命中率
2.季后赛球队场均3分命中率
3.季后赛球队场均罚篮命中率
4.季后赛球队场均得分
5.季后赛球队场均篮板
6.季后赛球队场均助攻
7.季后赛球队场均抢断
8.季后赛球队场均盖帽
9.季后赛球队场均进攻篮板率
10.季后赛球队场均防守篮板率
11.季后赛球队场均失误率
12.球星数量
13.去年是否进入总决赛

在确认完影响因素后,https://www.basketball-reference.com/这个网站分别整理出2000~2021年冠亚军的上述13项指标数据,整理结果如下:


冠军球队数据


亚军球队数据

预测总冠军花落谁家,实际上就是根据球队的季后赛数据、球星数量、去年是否进入总决赛等因素来进行预测,冠军球队的输出结果是1,亚军球队的输出结果是0

冠军球队数据和亚军球队数据各选择18条数据作为训练数据,其余数据作为测试数据。其中P_train.txt作为训练输入,T_train.txt作为训练输出,P_test.txt作为测试输入,T_test.txt作为测试输出,2021.txt为勇士和凯尔特人今年季后赛数据,用于预测今年NBA总冠军。

P_train.txt数据如下:

T_train.txt数据如下:

P_test.txt数据如下:

T_test.txt数据如下:

2022.txt数据如下:

二、基于PSO的Bp神经网络预测

我们在MATLAB数学建模(六) | 粒子群优化(PSO)算法讲解 (上)这篇推文中讲解了PSO的基本思想,喜欢看视频教学的小伙伴可以在B站PSO教学进行学习。

1.粒子表达方式

假设我们构建的Bp神经网络为3层网络,则Bp神经网络中需要优化的参数实际上包含4部分:输入层到隐含层的权值、隐层神经元阈值、隐含层到输出层的权值、输出层阈值

假设输入层神经元个数用 inputnuminputnuminputnum 表示,输出层神经元个数用outputnumoutputnumoutputnum表示,则隐层神经元个数hiddennumhiddennumhiddennum可以用如下公式计算:
hiddennum=2∗inputnum+1hiddennum=2*inputnum+1hiddennum=2∗inputnum+1

因此,输入层到隐层的权值个数为 w1num=inputnum∗hiddennumw1num=inputnum*hiddennumw1num=inputnum∗hiddennum ,隐层到输出层的权值个数为w2num=outputnum∗hiddennumw2num=outputnum*hiddennumw2num=outputnum∗hiddennum ,Bp神经网络中待优化的变量的个数为N=w1num+hiddennum+w2num+outputnumN=w1num+hiddennum+w2num+outputnumN=w1num+hiddennum+w2num+outputnum。

综上所述,一个粒子的变量数目为N。因为权值和阈值的初始值一般是在[−0.5,0.5][-0.5,0.5][−0.5,0.5]之间的随机数,所以,粒子的变量取值下限为VarMin=−0.5VarMin=-0.5VarMin=−0.5 ,变量取值上限为VarMax=0.5VarMax=0.5VarMax=0.5 。速度取值上限为VelMax=0.1∗(VarMax−VarMin)VelMax=0.1*(VarMax-VarMin)VelMax=0.1∗(VarMax−VarMin),速度取值上限为VelMin=−VelMaxVelMin=-VelMaxVelMin=−VelMax。

2.目标函数

在当前权值和阈值下,Bp神经网络的预测性能怎么样,这里我们使用norm(Tsim−Ttest)norm(T_{sim}-T_{test})norm(Tsim​−Ttest​) 函数来进行评价,TsimT_{sim}Tsim​是预测结果,TtestT_{test}Ttest​是测试数据的输出结果。errerrerr是预测结果与测试结果差的范数,范数越小说明预测得越准确,如果范数为0,说明预测得完全准确。

err=norm(T_sim-T_test);                         %预测结果与测试结果差的范数,范数越小说明预测得越准确,如果范数为0,说明预测得完全准确

3.粒子速度和位置的更新

粒子位置更新的目的是搜索到更好的解,随着粒子群位置的更新,搜索到的解的质量也随之提高。

PSO算法中粒子位置的更新离不开速度的影响,因此粒子位置更新的公式如下:
Xidk+1=Xidk+Vidk+1Vidk+1=ωVidk+c1r1(Pidk−Xidk)+c2r2(Pgdk−Xidk)\begin{array}{l} X_{i d}^{k+1}=X_{i d}^{k}+V_{i d}^{k+1} \\ V_{i d}^{k+1}=\omega V_{i d}^{k}+c_{1} r_{1}\left(P_{i d}^{k}-X_{i d}^{k}\right)+c_{2} r_{2}\left(P_{g d}^{k}-X_{i d}^{k}\right) \end{array} Xidk+1​=Xidk​+Vidk+1​Vidk+1​=ωVidk​+c1​r1​(Pidk​−Xidk​)+c2​r2​(Pgdk​−Xidk​)​
其中,kkk为迭代次数;
www为惯性权重, 其取值一般为随着迭代次数的增加从0.9到0.4线性递减;
Xidk+1X_{i d}^{k+1}Xidk+1​为第k+1k+1k+1代粒子iii的位置;
XidkX_{i d}^{k}Xidk​为第kkk代粒子iii的位置;
Vidk+1V_{i d}^{k+1}Vidk+1​为第k+1k+1k+1代粒子iii的速度;
VidkV_{i d}^{k}Vidk​为第kkk代粒子iii的速度;
PidkP_{i d}^{k}Pidk​为第kkk代个体最优粒子iii的位置;
PgdkP_{g d}^{k}Pgdk​为第kkk代全局最优粒子的位置;
r1r_1r1​和r2r_2r2​为[0,1][0,1][0,1]之间的随机数;
c1c_1c1​和c2c_2c2​为常数。


三、MATLAB代码

目标函数代码如下:

%% 输入
% x:一个个体的初始权值和阈值
% P:训练样本输入
% T:训练样本输出
% hiddennum:隐含层神经元数
% P_test:测试样本输入
% T_test:测试样本期望输出
%% 输出
% err:预测样本的预测误差的范数
function [err,T_sim]=BpFunction(x,P,T,hiddennum,P_test,T_test)
inputnum=size(P,2);                                                 %输入层神经元个数
outputnum=size(T,2);                                                %输出层神经元个数
%% 数据归一化
[p_train,ps_train]=mapminmax(P',0,1);
p_test=mapminmax('apply',P_test',ps_train);
[t_train,ps_output]=mapminmax(T',0,1);
%% 开始构建BP网络
net=newff(p_train,t_train,hiddennum);                               %隐含层为hiddennum个神经元
%设定参数网络参数
net.trainParam.epochs=1000;
net.trainParam.goal=1e-3;
net.trainParam.lr=0.01;
net.trainParam.showwindow=false;                                    %高版MATLAB使用 不显示图形框
%% BP神经网络初始权值和阈值
w1num=inputnum*hiddennum;                                           %输入层到隐层的权值个数
w2num=outputnum*hiddennum;                                          %隐含层到输出层的权值个数
W1=x(1:w1num);                                                      %初始输入层到隐含层的权值
B1=x(w1num+1:w1num+hiddennum);                                      %隐层神经元阈值
W2=x(w1num+hiddennum+1:w1num+hiddennum+w2num);                      %隐含层到输出层的权值
B2=x(w1num+hiddennum+w2num+1:w1num+hiddennum+w2num+outputnum);      %输出层阈值
net.iw{1,1}=reshape(W1,hiddennum,inputnum);                         %为神经网络的输入层到隐含层权值赋值
net.lw{2,1}=reshape(W2,outputnum,hiddennum);                        %为神经网络的隐含层到输出层权值赋值
net.b{1}=reshape(B1,hiddennum,1);                                   %为神经网络的隐层神经元阈值赋值
net.b{2}=reshape(B2,outputnum,1);                                   %为神经网络的输出层阈值赋值
%% 开始训练
net = train(net,p_train,t_train);
%% 测试网络
t_sim = sim(net,p_test);
T_sim1 = mapminmax('reverse',t_sim,ps_output);                      %反归一化
T_sim=T_sim1';
err=norm(T_sim-T_test);                                             %预测结果与测试结果差的范数,范数越小说明预测得越准确,如果范数为0,说明预测得完全准确
index0= T_sim<0;                                                    %找到预测值小于0的索引
index1= T_sim>1;                                                    %找到预测值小于1的索引
penalty=1000*abs(sum(T_sim(index0)))+1000*sum(T_sim(index1)-1);     %预测值小于0或大于1会有惩罚
err=err+penalty;                                                    %总误差
end

主函数代码如下:

%% 基于PSO的Bp神经网络预测2022赛季NBA总冠军
%%%%%%%%%%%%%%%%%%%%%%% @copyright 微信公众号:优化算法交流地 %%%%%%%%%%%%%%%%%%%%%%%
clc;
clear;
tic
close all;
%% 加载神经网络的训练样本 测试样本每列一个样本 输入P 输出T
P=importdata('P_train.txt');                            %训练输入
T=importdata('T_train.txt');                             %训练输出
P_test=importdata('P_test.txt');                        %测试输入
T_test=importdata('T_test.txt');                        %测试输出
cur_season=importdata('2022.txt');                      %雄鹿和太阳今年NBA季后赛数据,第1行为勇士队数据,第2行为凯尔特人队数据
inputnum=size(P,2);                                     %输入层神经元个数
hiddennum=2*inputnum+1;                                 %初始隐层神经元个数
outputnum=size(T,2);                                    %输出层神经元个数
w1num=inputnum*hiddennum;                               %输入层到隐层的权值个数
w2num=outputnum*hiddennum;                              %隐层到输出层的权值个数
N=w1num+hiddennum+w2num+outputnum;                      %待优化的变量的个数
%% 定义粒子群优化算法参数
nVar=N;                                                 %变量数目
VarSize=[1,nVar];                                       %变量矩阵大小
VarMin=-0.5;                                            %变量取值下限
VarMax=0.5;                                             %变量取值上限
MaxIt=200;                                              %最大迭代次数
nPop=50;                                               %种群数目
w=1;                                                    %惯性权重
wdamp=0.99;                                             %惯性重量降低系数
c1=1.5;                                                 %个体学习系数
c2=2.0;                                                 %群体学习系数
VelMax=0.1*(VarMax-VarMin);                             %速度上限
VelMin=-VelMax;                                         %速度下限
%% 初始化
empty_particle.Position=[];
empty_particle.Cost=[];
empty_particle.Velocity=[];
empty_particle.Best.Position=[];
empty_particle.Best.Cost=[];
particle=repmat(empty_particle,nPop,1);
GlobalBest.Cost=inf;
for i=1:nPop%初始化位置particle(i).Position=unifrnd(VarMin,VarMax,VarSize);%初始化速度particle(i).Velocity=zeros(VarSize);%个体评价particle(i).Cost=BpFunction(particle(i).Position,P,T,hiddennum,P_test,T_test);%更新个体最优particle(i).Best.Position=particle(i).Position;particle(i).Best.Cost=particle(i).Cost;%更新群体最优if particle(i).Best.Cost<GlobalBest.CostGlobalBest=particle(i).Best;end
end
BestCost=zeros(MaxIt,1);
%% 主循环
for it=1:MaxItfor i=1:nPop%更新速度particle(i).Velocity = w*particle(i).Velocity ...+c1*rand(VarSize).*(particle(i).Best.Position-particle(i).Position) ...+c2*rand(VarSize).*(GlobalBest.Position-particle(i).Position);%对超出范围的速度进行调整particle(i).Velocity = max(particle(i).Velocity,VelMin);particle(i).Velocity = min(particle(i).Velocity,VelMax);%更新位置particle(i).Position = particle(i).Position + particle(i).Velocity;%对超出位置范围的速度进行调整IsOutside=(particle(i).Position<VarMin | particle(i).Position>VarMax);particle(i).Velocity(IsOutside)=-particle(i).Velocity(IsOutside);%对超出范围的位置进行调整particle(i).Position = max(particle(i).Position,VarMin);particle(i).Position = min(particle(i).Position,VarMax);%种群评估particle(i).Cost=BpFunction(particle(i).Position,P,T,hiddennum,P_test,T_test);%更新个体最优if particle(i).Cost<particle(i).Best.Costparticle(i).Best.Position=particle(i).Position;particle(i).Best.Cost=particle(i).Cost;%更新群体最优if particle(i).Best.Cost<GlobalBest.Cost  GlobalBest=particle(i).Best;  end endendBestCost(it)=GlobalBest.Cost;disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);w=w*wdamp;
end
BestSol=GlobalBest;
%% Results
figure;
%plot(BestCost,'LineWidth',2);
semilogy(BestCost,'LineWidth',2);
xlabel('迭代次数')
ylabel('误差的变化')
title('进化过程')
grid on;
fprintf(['最优初始权值和阈值:\n=',num2str(BestSol.Position),'\n最小误差=',num2str(BestSol.Cost),'\n'])
%% 预测今年总冠军概率
cur_test=zeros(size(cur_season,1),1);
[~,bestCur_sim]=BpFunction(BestSol.Position,P,T,hiddennum,cur_season,cur_test);
prob=softmax(bestCur_sim);                                     %将预测结果映射为和为1的概率
disp(['勇士队获得2021年NBA总冠军概率为',num2str(prob(1))]);
disp(['凯尔特人队获得2021年NBA总冠军概率为',num2str(prob(2))]);
toc
%%%%%%%%%%%%%%%%%%%%%%% @copyright 微信公众号:优化算法交流地 %%%%%%%%%%%%%%%%%%%%%%%

四、预测结果

预测结果如下:

预测结果为两支球队夺冠的概率几乎相等,究其原因两支队伍的基础数据和高阶数据都十分接近,所以难分伯仲。

此外,因为训练数据量较少,所以训练结果准确性有待提高,各位还是欣赏比赛、支持自己喜欢的球队吧。


五、代码获取方式

在公众号后台回复关键词 PSOBPNBA,即可提取本篇推文代码。


总结

本次推文使用基于PSO的Bp神经网络预测21~22赛季NBA总冠军,重点讲解粒子的编码方式、目标函数和粒子速度和位置的更新,最终预测结果为两支球队夺冠概率各为50%。当然了,会有小伙伴说,我蒙的比这预测都准,反正都是一半一半的概率。不过,我们讲解的是思想,各位领会到了思想,我们的教学就达到目的了。


咱们下期再见

近期你可能错过了的好文章

新书上架 | 《MATLAB智能优化算法:从写代码到算法思想》

优化算法 | 灰狼优化算法(文末有福利)

优化算法 | 鲸鱼优化算法

遗传算法(GA)求解带时间窗的车辆路径(VRPTW)问题MATLAB代码

粒子群优化算法(PSO)求解带时间窗的车辆路径问题(VRPTW)MATLAB代码

知乎 | bilibili | CSDN:随心390

优化算法 | 基于粒子群优化算法的Bp神经网络预测21~22赛季NBA总冠军(附MATLAB代码)相关推荐

  1. python 组合优化_python基于粒子群优化的投资组合优化研究

    我今年的研究课题是使用粒子群优化(PSO)的货币进位交易组合优化.在本文中,我将介绍投资组合优化并解释其重要性.其次,我将演示粒子群优化如何应用于投资组合优化.第三,我将解释套利交易组合,然后总结我的 ...

  2. 【微电网优化】基于粒子群优化IEEE经典微电网结构附matlab代码

    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.

  3. 多目标粒子群优化算法_基于粒子群优化的投资组合优化研究

    原文链接: 基于粒子群优化的投资组合优化研究​tecdat.cn 我今年的研究课题是使用粒子群优化(PSO)的货币进位交易组合优化.在本文中,我将介绍投资组合优化并解释其重要性.其次,我将演示粒子群优 ...

  4. 基于基于粒子群优化算法的微电网调度(Matlab代码实现)

    目录 ⛳️1 写在前面 ⛳️2 基于基于粒子群优化算法的微电网调度(Matlab代码实现)

  5. 【布局优化】基于粒子群算法求解集线器位置分配问题附matlab代码

    1 内容介绍 ​本文基于MATLAB软件结合粒子群算法,实现了粒子群算法中粒子的适应度计算,极大的减少了优化计算耗时,对适应度计算较为耗时的优化计算,有着明显的效果;最后本文采用粒子群优化算法优化计算 ...

  6. 基于粒子群优化BP神经网络的预测 采用PSO算法优化bp网络实现预测

    基于粒子群优化BP神经网络的预测 采用PSO算法优化bp网络实现预测,源码注释详细,matlab实现,直接运行即可. ID:72100632211160748韩雅涵122

  7. 【优化算法】粒子群优化灰狼算法【含Matlab源码 006期】

    一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[优化算法]粒子群优化灰狼算法[含Matlab源码 006期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方式2: 付费专栏优化求解( ...

  8. matlab——智能算法之粒子群优化算法、模拟退火算法、遗传算法

    智能算法之粒子群优化算法: %% 初始化种群 f= % 函数表达式 % 求这个函数的最大值 figure(1);ezplot(f,[0,0.01,20]); N = 50; % 初始种群个数 d = ...

  9. 【优化算法】粒子群优化算法

    粒子群优化算法 粒子群优化算法简介 粒子群优化算法原理 粒子群优化算法的数学描述 粒子群优化算法框架 PySwarms:Python中粒子群优化的研究工具包 PySwarms快速使用 示例:编写自己的 ...

最新文章

  1. mongo go 查询指定字段_Go语言 操作MongoDB数据库批量查询
  2. C++对象模型3——vptr的位置、手动调用虚函数、从汇编代码看普通调用和多态调用
  3. 字符串处理的基本方法
  4. 如何学好python基础_零基础如何学好Python开发?
  5. 豆瓣上线应急防护模式 防护时间最长可设置14天
  6. angularjs 学习笔记(一) -----JSONP跨站访问
  7. 阿里P8架构师谈:如何搭建亿级并发系统的性能指标体系
  8. java arraylist对象_Java中ArrayList的对象引用问题
  9. php这么把pdf转为world,php pdf如何转word
  10. 修改博图组态原有GSD文件
  11. 华为交换机初始化_华为交换机的初始配置
  12. NOIP 2016 滚粗记
  13. iPhone屏幕尺寸、statusBar、navigationBar、tabBar高度对比
  14. xshell进入桌面_xshell中启动linux图形界面
  15. Postgresql通过docker进行高可用部署 pgpool-II
  16. matlab初学matlab——变量类型
  17. 百度索引是什么如何增加索引
  18. 全球与中国射频识别零售管理市场深度研究分析报告
  19. python timedelta 求时间差省去繁琐格式转换
  20. linux下rz和sz命令实现上传下载文件

热门文章

  1. 10个你可能不知道的有趣的Gutenberg功能(一)
  2. 广东省科技进步奖二等奖!天翼物联NB-IoT技术助推万物智联
  3. keil iar c语言支持区别,mdk/iar汇编区别
  4. 屏幕上绘制图形——基于C语言绘制图形(点、线、矩形、圆)
  5. python学习之路day05(迭代器和生成器)
  6. 企业如何实现高效的协作办公?
  7. 苹果cms v10用户搜索什么就入库添加什么php源码实现
  8. 游戏研发有关的一些职位职能总结
  9. 构建 ERC20 代币合约
  10. 支持热插拔的AR眼镜,才是更好的AR眼镜