【線性迴歸】生產應用中使用線性迴歸進行實際操練

前提:本文中使用的算法是在《【線性迴歸】多元線性迴歸函數在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、從訓練集上考慮,多個月的數據進行訓練是否更可以得到一個比較可靠的模型?

以上內容如果有不正確或者更好的思路(如果解決梯度下降),也請大家一起過來拍磚。

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