前提:本文中使用的算法是在《【線性迴歸】多元線性迴歸函數在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、從訓練集上考慮,多個月的數據進行訓練是否更可以得到一個比較可靠的模型?
以上內容如果有不正確或者更好的思路(如果解決梯度下降),也請大家一起過來拍磚。