前言
这是坚持更新的第四天,前两天更新了数学建模的一些基础模型,今天我们做一个数学建模的实例。
了解BP神经网络的同学知道,BP神经网络的用途之一就是用来做预测,但是由于BP神经网络是一种有监督的学习方式,在进行预测之前我们需要一些数据作为训练集。如果需要对短视频中用户的行为发生的概率进行预测,那么我们必须要知道一些用户行为发生的概率。
贝叶斯分类器通常是用来解决‘是’或者‘不是’的问题,但是和其他分类器有所不同的是他是通过概率来进行判断的,这就很好的对应了BP神经网络中所需的概率。
下面我们以今年腾讯提供的大数据挑战赛中的数据为数据集,结合BP神经网络和贝叶斯分类器来对用户的行为进行预测。
预测模型
由于数据集比较大(百万级别的数据),程序运行出来也需要一定的时间,本文只选取很小的一部分数据做实验,可以说明问题即可,具体数据如下所示:
userid代表用户,feedid代表视频;read_commend:当取值为1时代表查看了评论,0时代表没有看评论;comment:评论;play:视频播放时长;stay:视频停留时长,click_ava:查看头像,forward:分享(具体什么意思忘了,不过不要紧)follow:转发;favorite:收藏,like:点赞
朴素贝叶斯判别器模型
根据给定的数据集我们可以利用朴素贝叶斯分类器判断是否点赞,及点赞发生的概率,假设给定一条数据如下
为了避免朴素贝叶斯模型中出现概率为0的情况,我们对其中的参数进行拉普拉斯修正,朴素贝叶斯模型所需要的参数及其计算过程如下:
P=p(like)*p(read_comment|like)*p(comment|like)*p(play|like)*p(stay|like)*p(click_ava|like)*p(forward|like)*p(follow|like)*p(favorite|like);
其中p(A|B)表示条件概率,在B发生的条件下A发生概率,根据以上数据,我们可以直接计算其需要的参数:
%%使用matlab读取数据
useraction=readmatrix('useraction','outputtype','string');
%%把字符型转化为double型数据
useraction=str2double(useraction)
%%统计矩阵的维数
[N,M]=size(useraction);
%%计算p(like),并对p(like)进行拉普拉斯修正
Like=find(useraction(:,7)~=0);
p(like)=(length(like)+1)/(N+2);
%其余的条件概率我们只简单举个例子
%%对于离散型变量comment来说
Comment=0;
for i=1:N
if useraction(i,6)~=0&&useraction(i,7)~=0
Comment=Comment+1;
end
end
p(commnet)=(Commnet+1)/(N+2);
对于连续型随机变量满足以下计算公式:
其中的u_ci,和theta_ci表示第c类样本的均值和方差,在本模型中就代表播放时间和停留时间的均值和方差。
选取一部分数据通过贝叶斯模型进行计算作为BP神经网络的输入(训练集)
BP神经网络
我们构建三层的BP神经网络,将用户的各项指标的值和朴素贝叶斯计算出来的概率作为训练集,通过输入新的数据,可以预测用户对新的视频的点赞的概率。假设通过贝叶斯模型得到的训练集数据如下:
训练代码如下:
P=[1,1,0,1,0,1;0,1,0,0,0,1;358,258,53,88,62,135;455,400,53,157,62,227;0,0,0,1,1,1;1,1,1,0,1,0;0,1,0,1,0,0;0,0,0,1,0,0];
T=[0.2,0.3,0.05,0.8,0.4,0.5];
[p1,minp,maxp,t1,mint,maxt]=premnmx(P,T);
net=newff(minmax(P),[8,6,1],{'tansig','tansig','purelin'},'trainlm');
%设置训练次数
net.trainParam.epochs = 5000;
%设置收敛误差
net.trainParam.goal=0.0000001;
%训练网络
[net,tr]=train(net,p1,t1);
%输入数据
a=[1;1;32;34;0;0;1;0];
%将输入数据归一化
a=premnmx(a);
%放入到网络输出数据
b=sim(net,a);
%将得到的数据反归一化得到预测数据a
c=postmnmx(b,mint,maxt);
c
具体图像
总结
在实现上述过程中时,可以发现其实神经网络的效果其实有时候并不是令人那么满意,有兴趣的同学可以看一看大家对BP神经网络的改进。其次,其实如果同学们动手做了这个建模的话,其实单单一个贝叶斯判别器也可以实现一定的预测效果,但是不同用户的数据不同,不能把所有用户当成一个用户来处理,真正用贝叶斯模型去做“预测”的时候,可能需要搭建很多模型,特别是对数据很大的时候,比如有几万个用户的数据,你可能就要考虑几万个不同的模型,虽然程序实现起来不是特别难,但是贝叶斯模型始终是一个判别模型,做预测还是不太合适(个人观点)。
也有同学会问既然不同用户要不同考虑,那加上一个神经网络就不需要考虑用户之间的区别了吗?答案是否定的,加上神经网络我们依然要考虑这一点。所以,最后,我对这个模型的改进之处做了一些思考
1、为了结果的准确性,对不同用户的概率进行平均或其他方式的处理。
2、利用遗传算法或者其他数值算法对BP神经网络进行改进,提高最终结果的准确性和稳定性。