• RBF神经网络案例——客户流失率预测


    目录

    背景介绍

    1、径向基神经网络结构

     2、符号说明

    3、计算网络输出

     4、计算能量函数

    网络学习步骤

    步骤1、先将能量函数E写成各参数的复合函数结构

    步骤2、求E关于各参数的偏导

    步骤3、求各参数的调整量

    步骤4、计算各参数的调整量 

    5、按照步骤1-步骤4编写RBF神经网络学习程序

    6、网络拟合效果与各个参数的关系

    6.1 拟合效果与学习次数的关系

     6.2 拟合效果与隐含层神经元个数的关系

     6.3 学习效率对训练效果的影响

    7、添加动量因子的RBF神经网络学习 


    背景介绍

    某消费品女性顾客流失率

    周数

    流失率

    周数

    流失率

    1

    0.531731985

    31

    0.906074968

    2

    0.599828865

    32

    0.910126947

    3

    0.644564773

    33

    0.91328894

    4

    0.671027441

    34

    0.917005814

    5

    0.697281167

    35

    0.920081668

    6

    0.717013297

    36

    0.924666569

    7

    0.732752613

    37

    0.928067079

    8

    0.745040151

    38

    0.932732111

    9

    0.75565936

    39

    0.936609264

    10

    0.763524144

    40

    0.940518784

    11

    0.779177473

    41

    0.94417839

    12

    0.792189854

    42

    0.946870779

    13

    0.806571209

    43

    0.958960328

    14

    0.813644571

    44

    0.961151737

    15

    0.822233807

    45

    0.963206107

    16

    0.826976013

    46

    0.964973998

    17

    0.837737352

    47

    0.967341306

    18

    0.842773177

    48

    0.96778647

    19

    0.854878049

    49

    0.968232044

    20

    0.859771055

    50

    0.970466082

    21

    0.863536819

    51

    0.974362934

    22

    0.865907219

    52

    0.98011496

    23

    0.869966906

    53

    0.98424337

    24

    0.872734818

    54

    0.987633062

    25

    0.875641915

    55

    0.991046183

    26

    0.878079332

    56

    0.995581505

    27

    0.881514601

    57

    0.997785861

    28

    0.886842845

    58

    1

    29

    0.891857506

    59

    1

    30

    0.898078292

    60

    1

    女性消费商品,品牌的黏性非常重要,但同时商品又是有生命周期的,所以客户群体也会有生命周期,老客户会逐渐流失,新客户不断加入进来,如此便形成了良性客户族新陈代谢。我们需要对客户流失概率进行研究,以便做出一些客户关怀和维系的动作,以减少客户流失,从而使得客户价值最大化。

    上表的意义:某女装品牌,假设第一次购买的客户为新客户,则第一周有11865人,只买了第一次而后再未购买的客户为6309人。新增客户表示第一周购买之后在后面数周又购买第二次的人数,不重复计算。

    各周损失率计算方法如下:
    从未购买的人数/11865=0.531731
    从未购买的人数/(11865-1347)=0.599838

    请用神经网络分析客户任意时间长度没有回头购买的流失率。

    1、径向基神经网络结构

    径向基神经网络由输入层、隐含层和输出层构成三层前向网络,隐含层采用径向基函数为激励函数(一般是高斯函数)。

     2、符号说明

    • 样本输入,容量为n;
    • 样本输出;
    • r   隐含层的神经元个数;
    • 第i个神经元的中心和宽度;i=1,2,…,r;
    • wi   第i个神经元的权值,i=1,2,…,r;

    3、计算网络输出

     设神经网络输入和输出都是线性的,则整个隐含层的输入就是样本输入,隐含层的输出也是样本输出,因此(对第j个样本的)为j=1,2,…,n;

     4、计算能量函数

    用最小二乘法,拟合参数ci,σi,wi的最佳值。

    网络学习步骤

    步骤1、先将能量函数E写成各参数的复合函数结构

    步骤2、求E关于各参数的偏导

    i=1,2,…,r 

    步骤3、求各参数的调整量

    为了计算方便,先规范样本输入和输出都是行向量(n),权值、中心和宽度向量w,c,σ都是列向量(r),则e=(yj-Oj)为n维行向量,dji=(xj-ci)为n×r矩阵,(pji)=p(xj,ci,σi)也是n×r矩阵。则各参数调整量(按负梯度方向进行)为

    步骤4、计算各参数的调整量 

     i=1,2,…,r

    其中lrw,lrc,lrσ表示相应参数的学习进度(速度)。

    5、按照步骤1-步骤4编写RBF神经网络学习程序

    1. 以下是对该代码的注释:
    2. ```
    3. function [o,eb,s1]=BRF(X,Y,lrw,lrc,lrs,sig,r,n)
    4. % 该函数实现基于径向基函数的前向传播神经网络(BRF)算法
    5. % 输入参数:
    6. % X:输入数据,每一列代表一个输入样本
    7. % Y:输出数据,每一列代表一个输出样本
    8. % lrw:学习率,用于更新权重参数 w
    9. % lrc:学习率,用于更新径向基函数中心 c
    10. % lrs:学习率,用于更新径向基函数半径 s
    11. % sig:阈值,训练误差小于该值时停止训练
    12. % r:径向基函数节点数
    13. % n:最大迭代次数
    14. % 输出参数:
    15. % o:神经网络的输出
    16. % eb:训练过程中的误差变化
    17. % s1: 输入数据归一化转换的信息
    18. x=mapminmax(X); % 输入数据归一化
    19. [y,s1]=mapminmax(Y); % 输出数据归一化,并记录信息 s1
    20. m=length(y);
    21. w=rand(r,1)+0.1; % 随机初始化径向基函数权重 w
    22. c=rand(r,1); % 随机初始化径向基函数中心 c
    23. s=rand(r,1)+0.2; % 随机初始化径向基函数半径 s
    24. eb=[]; % 记录训练过程中的误差变化
    25. for k=1:n % 迭代训练
    26. d1=dist(c,x); % 计算输入数据与径向基函数的中心之间的距离
    27. d2=d1.^2; % 计算输入数据与径向基函数的中心之间的距离的平方
    28. ss=[];
    29. for i=1:r
    30. sr=ones(1,m)*s(i)^2; % 计算径向基函数的半径的平方
    31. ss=[ss;sr];
    32. end
    33. p=exp(-d2./ss); % 计算径向基函数的输出
    34. o=[];
    35. for j=1:m
    36. for i=1:r
    37. wp(i)=w(i)*p(i,j); % 计算径向基函数和权重的乘积
    38. end
    39. o=[o,sum(wp)]; % 计算神经网络的输出
    40. end
    41. e=y-o; % 计算预测误差
    42. err=sum(e.^2)^0.5; % 计算平均误差
    43. if err% 如果误差小于预设的阈值,则停止训练
    44. Xt=datetime;
    45. disp(Xt); % 显示训练结束时间
    46. break;
    47. end
    48. eb=[eb,err]; % 记录训练过程中的误差
    49. dw=[];dc=[];ds=[];
    50. for i=1:r
    51. dw=[dw;sum(e.*p(i,:))]; % 计算权重的梯度
    52. dc=[dc;w(i)/s(i)^2*sum(e.*p(i,:).*d1(i,:))]; % 计算径向基函数中心的梯度
    53. ds=[ds;w(i)/s(i)^3*sum(e.*p(i,:).*d2(i,:))]; % 计算径向基函数半径的梯度
    54. end
    55. w=w+lrw*dw; % 更新权重
    56. c=c+lrc*dc; % 更新径向基函数中心
    57. s=s+lrs*ds; % 更新径向基函数半径
    58. end
    59. t=1:m;
    60. plot(t,y,'*',t,o,'+-');legend('实际输出','预测输出');
    61. % 绘制预测输出和实际输出的对比图
    62. ```

    6、网络拟合效果与各个参数的关系

    6.1 拟合效果与学习次数的关系

     取定权学习效率为lrw=0.035,中心权值学习lrc =0.01,宽度学习效率为lrs=0.01,神经元个数r=8,残差容量sig=0.001,分别对练习次数n=50,200,500,800,1500残差效果进行对比,结果如图,程序见下

    1. clear
    2. A=xlsread('d:\kehu.xlsx');
    3. Y=A';
    4. X=1:60;
    5. t=1:length(X);
    6. r=8;sig=0.001;lrw=0.035;lrc=0.01;lrs=0.01;
    7. n=50;
    8. [o,eb1,s1]=BRF(X,Y,lrw,lrc,lrs,sig,r,n);
    9. subplot(5,1,1);
    10. bar(eb1);
    11. n=200;
    12. [o,eb2,s1]=BRF(X,Y,lrw,lrc,lrs,sig,r,n);
    13. subplot(5,1,2);
    14. bar(eb2);
    15. n=500;
    16. [o,eb3,s1]=BRF(X,Y,lrw,lrc,lrs,sig,r,n);
    17. subplot(5,1,3);
    18. bar(eb3);
    19. n=800;
    20. [o,eb4,s1]=BRF(X,Y,lrw,lrc,lrs,sig,r,n);
    21. subplot(5,1,4);
    22. bar(eb4);
    23. n=1500;
    24. [o,eb5,s1]=BRF(X,Y,lrw,lrc,lrs,sig,r,n);
    25. subplot(5,1,5);
    26. bar(eb5);
    1. clear
    2. A=xlsread('d:\kehu.xlsx');
    3. Y=A';
    4. X=1:60;
    5. t=1:length(X);arf=0.002;n=1500;
    6. r=10;sig=0.003;lrw=0.0035;lrc=0.0035;lrs=0.0035;

     6.2 拟合效果与隐含层神经元个数的关系

    取定权学习效率为lrw=0.035,中心学习lrc=0.01,宽度学习效率为lrs=0.01,残差容量sig=0.001,学习次数定为n=800,分别隐含层神经元数r=4,8,12,16效果进行对比,结果如图,程序见下

    1. clear
    2. A=xlsread('d:\kehu.xlsx');
    3. Y=A';
    4. X=1:60;n=600;
    5. t=1:length(X);
    6. sig=0.001;lrw=0.035;lrc=0.01;lrs=0.01;
    7. [o,eb1,s1]=BRF(X,Y,lrw,lrc,lrs,sig,4,n);
    8. [o2,eb2,s2]=BRF(X,Y,lrw,lrc,lrs,sig,8,n);
    9. [o3,eb3,s3]=BRF(X,Y,lrw,lrc,lrs,sig,12,n);
    10. [o4,eb4,s4]=BRF(X,Y,lrw,lrc,lrs,sig,14,n);
    11. ebmax=max(eb1);
    12. eb2=eb2(eb2<=ebmax);
    13. eb3=eb3(eb3<=ebmax);
    14. eb4=eb4(eb4<=ebmax);
    15. subplot(2,2,1),bar(eb1);
    16. subplot(2,2,2),bar(eb2);
    17. subplot(2,2,3),bar(eb3);
    18. subplot(2,2,4),bar(eb4);

                                                            学习效果与神经元数关系

     由图可以看出:

    1、r较小时,残差震荡厉害,但误相对较小;

    2、r较大时,残差震荡不大,但收敛慢。

     6.3 学习效率对训练效果的影响

    取定中心学习lrc=0.01,宽度学习效率为lrs=0.01,残差容量sig=0.001,学习次数定为n=1000,隐含层神经元数r=8。让权学习效率分别取lrw=0.001,0.005,0.02,0.08,将效果进行对如图.

    1. clear
    2. A=xlsread('d:\kehu.xlsx');
    3. Y=A';
    4. X=1:60;n=1000;
    5. t=1:length(X);
    6. sig=0.001;r=8;lrc=0.01;lrs=0.01;
    7. [o1,eb1,s1]=BRF(X,Y,0.001,lrc,lrs,sig,r,n);
    8. [o2,eb2,s2]=BRF(X,Y,0.005,lrc,lrs,sig,r,n);
    9. [o3,eb3,s3]=BRF(X,Y,0.02,lrc,lrs,sig,r,n);
    10. [o4,eb4,s4]=BRF(X,Y,0.1,lrc,lrs,sig,r,n);
    11. ebmax=max(eb1);
    12. eb2=eb2(eb2<=ebmax);
    13. eb3=eb3(eb3<=ebmax);
    14. eb4=eb4(eb4<=ebmax);
    15. subplot(2,2,1),bar(eb1);
    16. subplot(2,2,2),bar(eb2);
    17. subplot(2,2,3),bar(eb3);
    18. subplot(2,2,4),bar(eb4);

                                                    不同权学习效率效果对比

    由图可以看出,权值过于小和过于大,学习效果都不太理想,lrw=0.02学习效果最好。

    取定权学习效率lrw=0.02,宽度学习效率为lrs=0.01,残差容量sig=0.001,学习次数定为n=1000,隐含层神经元数r=8。让中心学习效率分别取lrw=0.001,0.005,0.02,0.08,将效果进行对如图

    1. clear
    2. A=xlsread('d:\kehu.xlsx');
    3. Y=A';
    4. X=1:60;n=1000;
    5. t=1:length(X);
    6. sig=0.001;r=8;lrw=0.02;lrs=0.01;
    7. [o1,eb1,s1]=BRF(X,Y,lrw,0.001,lrs,sig,r,n);
    8. [o2,eb2,s2]=BRF(X,Y,lrw,0.005,lrs,sig,r,n);
    9. [o3,eb3,s3]=BRF(X,Y,lrw,0.02,lrs,sig,r,n);
    10. [o4,eb4,s4]=BRF(X,Y,lrw,0.1,lrs,sig,r,n);
    11. ebmax=max(eb1);
    12. eb2=eb2(eb2<=ebmax);
    13. eb3=eb3(eb3<=ebmax);
    14. eb4=eb4(eb4<=ebmax);
    15. subplot(2,2,1),bar(eb1);
    16. subplot(2,2,2),bar(eb2);
    17. subplot(2,2,3),bar(eb3);
    18. subplot(2,2,4),bar(eb4);

                                                   中心学习效率与学习效果关系对比 

    由图可以看出,当其他参数不变时,中心学习效率不能太小,也不能太大,给出的四个值中lrc=0.005时学习效果最佳。

     取定权学习效率lrw=0.02,中心学习效率为lrc=0.005,残差容量sig=0.001,学习次数定为n=1000,隐含层神经元数r=8。让宽度学习效率分别取lrs=0.001,0.005,0.025,0.1,将效果进行对如图

    1. clear
    2. A=xlsread('d:\kehu.xlsx');
    3. Y=A';
    4. X=1:60;n=1000;
    5. t=1:length(X);
    6. sig=0.001;r=8;lrw=0.02;lrc=0.005;
    7. [o1,eb1,s1]=BRF(X,Y,lrw,lrc,0.001,sig,r,n);
    8. [o2,eb2,s2]=BRF(X,Y,lrw,lrc,0.005,sig,r,n);
    9. [o3,eb3,s3]=BRF(X,Y,lrw,lrc,0.025,sig,r,n);
    10. [o4,eb4,s4]=BRF(X,Y,lrw,lrc,0.1,sig,r,n);
    11. ebmax=max(eb1);
    12. eb2=eb2(eb2<=ebmax);
    13. eb3=eb3(eb3<=ebmax);
    14. eb4=eb4(eb4<=ebmax);
    15. subplot(2,2,1),bar(eb1);
    16. subplot(2,2,2),bar(eb2);
    17. subplot(2,2,3),bar(eb3);
    18. subplot(2,2,4),bar(eb4);

                                                    宽度学习效率对残差影响

      由图(8)可以看出,不同宽度学习效率对残差影响较大,给出的四个值中,lrs=0.005的网络学习效果最好。

    给定r=8,n=20000,lrw=0.02,lrc=0.005,lrs=0.005,sig=0.001,对网络进行深度训练,训练效果如图 

    1. clear
    2. A=xlsread('d:\kehu.xlsx');
    3. Y=A';
    4. X=1:60;n=20000;
    5. t=1:length(X);
    6. sig=0.001;r=8;lrw=0.02;lrc=0.005;lrs=0.005;
    7. [o1,eb1,s1]=BRF(X,Y,lrw,lrc,lrs,sig,r,n);
    8. t=1:length(Y);
    9. y=mapminmax('reverse',o1,s1);
    10. subplot(2,1,1);
    11. plot(t,Y,'*',t,y,'+-');legend('ʵ¼ÊÖµ','Ô¤²âÖµ');
    12. subplot(2,1,2);
    13. eb1=eb1(eb1<10);
    14. bar(eb1);

                                                            最佳学习效率的学习效果 

    7、添加动量因子的RBF神经网络学习 

    由前面的计算可知,当学习时间短,参数取得稍微不恰当,网络学习为出现两个严重问题:

    (1) 残差震荡现象严重;

    (2)收敛速度慢。

    对于(2)可以增加学习时间,而对于(1),震荡现象不尽早消除,会陷入局部极值,普遍做法是在负梯度方向加入干扰因子,称为动量因子。新的参数公式如下i=1,2,…,r

    其中,fw,fc,fσ分别为权、中心、宽度的动量因子系数,Δw-1是权的动量因子,-1的意思,把上一次的调整方向当作这次的动量方向。关于c和s的解释一样。

    利用前面找到的个最佳参数,添加动量因子编制一个RBF神经网络学习程序

    1. function [o,eb,s1]=BRFr(X,Y,lrw,lrc,lrs,fw,fc,fs,sig,r,n)
    2. x=mapminmax(X);
    3. [y,s1]=mapminmax(Y);
    4. m=length(y);
    5. w=rand(r,1);
    6. c=2*rand(r,1)-1;
    7. s=rand(r,1)+0.1;
    8. eb=[];
    9. wr=zeros(r,1);
    10. cr=wr;
    11. sr=wr;
    1. for k=1:n
    2. d1=dist(c,x);
    3. d2=d1.^2;
    4. ss=[];
    5. for i=1:r
    6. sr1=ones(1,m)*s(i)^2;
    7. ss=[ss;sr1];
    8. end
    9. p=exp(-d2./ss);
    10. o=[];
    11. for j=1:m
    12. for i=1:r
    13. wp(i)=w(i)*p(i,j);
    14. end
    15. o=[o,sum(wp)];
    16. end
    17. e=y-o;
    18. err=sum(e.^2)^0.5;
    19. if err
    20. Xt=datetime;
    21. disp(Xt);
    22. break;
    23. end
    24. eb=[eb,err];
    25. dw=[];dc=[];ds=[];
    26. for i=1:r
    27. dw=[dw;sum(e.*p(i,:))];
    28. dc=[dc;w(i)/s(i)^2*sum(e.*p(i,:).*d1(i,:))];
    29. ds=[ds;w(i)/s(i)^3*sum(e.*p(i,:).*d2(i,:))];
    30. end
    31. w=w+lrw*dw+fw*wr;
    32. c=c+lrc*dc+fc*cr;
    33. s=s+lrs*ds+fs*sr;
    34. wr=dw;
    35. cr=dc;
    36. sr=ds;
    37. end

    利用前面找到的个最佳参数,添加动量因子编制一个RBF神经网络学习程序

    1. clear
    2. A=xlsread('d:\kehu.xlsx');
    3. Y=A';
    4. X=1:60;n=1000;
    5. t=1:length(X);
    6. sig=0.001;r=8;lrw=0.02;lrc=0.005;lrs=0.005;
    7. fc=0.001;fw=0.01;fs=0.001;
    8. [o1,eb1,s1]=BRFr(X,Y,lrw,lrc,lrs,fw,fc,fs,sig,r,n);
    9. t=1:length(Y);
    10. y=mapminmax('reverse',o1,s1);
    11. subplot(2,1,1);
    12. plot(t,Y,'*',t,y,'+-');legend('ʵ¼ÊÖµ','Ô¤²âÖµ');
    13. subplot(2,1,2);
    14. eb1=eb1(eb1<10);
    15. bar(eb1);

                                    加入动量因子的学习效果

    由参数n=1000计算效果得出如下结论:

    (1)学习时间短;

    (2)残差震荡先现象不明显;

    (3)收敛的一致性较好。

  • 相关阅读:
    php调取java类方法,jar包,亲测已上线!windows!
    SpringBoot-24-整合持久层-自定义整合DruidDataSource数据源
    [附源码]java毕业设计零食销售系统
    牛客网语法篇练习基础语法(一)
    el-select下拉框文字溢出,...并显示tooltip
    vim 从嫌弃到依赖(21)——跨文件搜索
    用C语言写个控制台扫雷游戏(附完整代码)
    HC-05蓝牙模块--------手机与STM32通信(代码编写)(上位机配置)保姆级教程
    Java运算符
    从校园智能门锁预见万物互联的未来
  • 原文地址:https://blog.csdn.net/m0_63024355/article/details/133811936