【线性回归】生产应用中使用线性回归进行实际操练

前提:本文中使用的算法是在《【线性回归】多元线性回归函数在Octave中的实现(二)》中进行描述。
命题:
根据生产环境的中的用户功能使用情况,来推断接下来的用户使用量。
使用数据如下:

x =
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17

y =

    6144
    3372
   21119
   15909
   15049
   12045
   10106
    2890
    3069
   11787
    9221
    7300
    5785
    3372
    1613
    1396
    1968

说明:
X表号天数(1,代表2018-12-01号;以后类似)
输出(Y):使用量,表示当天的使用量

以上就是实际如果,需要对之进行模拟,求解01-20,01-21号类似的预计用户使用情况。

思路:
1、首先直接的显示数据,以分析大概需要使用什么样的模型进行回归。Octave中数据显示如下:
在这里插入图片描述

根据以上图形可以分析出以下两点:
1、看出应该大概是一个正弦函数的样子。那在进行模型设计的时候,需要考虑sin(x)的变量。
2、从上图中大概可以看出,有几个点比较异常(点1、点2,点3,点8,点9),其中点1、点2;点8、点9异常偏低。针对这四个点分析,发现原来这四个点都是在周六周天。也就是说如果我们的模型需要尽量准确那我们需要增加一个特征(是否周未)。

那到这里,我们的模型大概也就应该是:y=theta0+theta1x1+theta2sin(x1)+theta3*sin(x3)。
对止我们构建X的矩阵,如下所示:

1.00000    1.00000    0.84147    0.00000
1.00000    2.00000    0.90930    0.00000
1.00000    3.00000    0.14112    1.00000
1.00000    4.00000   -0.75680    1.00000
1.00000    5.00000   -0.95892    1.00000
1.00000    6.00000   -0.27942    1.00000
1.00000    7.00000    0.65699    1.00000
1.00000    8.00000    0.98936    0.00000
1.00000    9.00000    0.41212    0.00000
1.00000   10.00000   -0.54402    1.00000
1.00000   11.00000   -0.99999    1.00000
1.00000   12.00000   -0.53657    1.00000
1.00000   13.00000    0.42017    1.00000
1.00000   14.00000    0.99061    1.00000
1.00000   15.00000    0.65029    0.00000
1.00000   16.00000   -0.28790    0.00000
1.00000   17.00000   -0.96140    1.00000

将以上数据代入我们例(二)中的函数进行求解:

x=ones(size(l1.x)(1),4);
x(:,2)=l1.x;
x(:,3)=sin(x(:,2));
x([1,2,8,9,15,16],4)=0;
y=li.y;
theta=ones(4,1);
[Theta,bResult,ThSL]=RepeatGetMini(0.003,0.001,8000,x,y,theta)

查看训练的集是否正常拟合(可能不太看得清楚,在100多次的时候就已经看向0拟合,但是由于我设置的两次误差较小,所以拟合次数较多):
在这里插入图片描述

最终我们得到结果如下:Theta =

10598.77938
-760.11351
-1806.51938
6318.15727

我们再将实际的函数和用来预测的点

plot(x(:,2),y,‘o’);
hold on
plot(Theta’*x’)

画出来看一下:
在这里插入图片描述

最后,我们可以使用拟合的参数对未来的使用量进行预测:

xsl=[1,18;1,19;1,20;1,21;1,22];
xsl(:,3)=sin(xsl(:,2));
xsl(:,4)=[1;1;1;1;0];
xsl’*Theta;

结果如下 :

4591.567 2204.024 65.413 -556.882 -6107.728
从上面的结果来看,还存在以下问题:
1、从20号之后的数据,会出现比较大的梯度下度;特别是到了22号因为又是周未,所以数据会下降得非常厉害基本是到0了;

所以以上模型更适合在模拟在一个整月内的数据使用情况,然后以后再根据具体的天数进行拟合。对这种前半月、后半月的情况,很明显是不太适合的。

接下来的思考是:
1、从训练集上考虑,多个月的数据进行训练是否更可以得到一个比较可靠的模型?

以上内容如果有不正确或者更好的思路(如果解决梯度下降),也请大家一起过来拍砖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章