訓練樣例 (x
,y)
輸入變數/特徵
x ps: n+
1行,1 列
輸出變數/目標變數
y訓練樣例總數 m
特徵維度 n第
i 個訓練樣例 (x
(i),
y(i)
)所有訓練樣例的輸入變數組成的矩陣
x ps: m行,
n+1 列,每行是(x
(i))
t 所有訓練樣例的輸出變數組成的矩陣
y ps: m行,
1 列
下表是某地區房屋的面積及其**的一些資料。
我們對這些資料進行描點畫圖,得到下圖,線性回歸就是要在圖上找到一條最佳的直線來擬合**與面積的關係。這個例子中僅包含乙個特徵即房屋面積。
形式化來講,給定資料集 d=
, 其中每個 xi
有 n 個特徵,線性回歸試圖學得乙個線性模型,對於新來的測試集中的乙個樣例
x,能夠輸出乙個盡可能準確的實數值
y 。這個線性模型可以表示為 h(
x)=θ
0+θ1
x1+θ
2x2+
...+
θnxn
通常定義 x0
=1,從而上式可以變為 h(
x)=θ
0x0+
θ1x1
+θ2x
2+..
.+θn
xn=θ
tx那麼如何來衡量得到的模型的好壞呢?
我們定義損失函式(cost function) j(
θ)=1
2∑i=
1m(h
(x(i
))−y
(i))
2 顯然,**的越準確會使得損失函式越小。由於 j(
θ)是乙個二次函式的形式,其區域性最優就是全域性最優,可以通過對 j(
θ)求導求取其最小。
1 梯度下降法
一方面可以通過求j(
θ)對每個θ_
j 的偏導從而用梯度下降法 ∂∂
θ_jj
(θ)=
∑_i=
1m(h
_θ(x
(i))
−y(i
))x_
j(i)
因此可以得到梯度下降法引數更新公式 θ_
j=θ_
j−∑_
i=1m
(h_θ
(x(i
))−y
(i))
x_j(
i)只要在收斂前不斷迭代
θ 的值就可以使損失函式不斷降低。
2 閉式解
另一方面可以直接求出
θ 的閉式解 j(
θ)可以進一步表示如下: j(
θ)=1
2∑i=
1m(h
(x(i
))−y
(i))
2=12
(xθ−
y)t(
xθ−y
) 那麼則有 ∇θ
j(θ)
=∇θ1
2(xθ
−y)t
(xθ−
y)=x
txθ−
xty
為了最小化 j(
θ), 令其導數為 0⃗
, 從而得到引數的閉式解 θ=
(xtx
)−1x
ty。詳細推導過程見吳文達機器學習公開課筆記。
看乙個具體的例子。
上表是我收集的一些手機資料,現在讓你用ram和cpu頻率作為特徵,學得乙個線性模型,得到該手機的**。現在使用前9條資料作為訓練集,後4條資料作為測試集,這個線性模型該怎麼學得呢?
首先將這些資料以合適的結構放到txt檔案中方便匯入matlab,
x 的第一列加了一排1,我直接加在檔案中了,也可用**加。然後使用上述兩種思路分別實現。
前面已經推導出了公式,這裡給出**。
clc; %清屏
clear; %清變數
load data; %匯入x,y,test_feature
theta=inv(x'*x)*x'*y; %閉式解計算公式
predict=test_feature*theta; %對測試集**
%以下**用於畫圖,繪製的是決策面,描得點是訓練集的資料
x=0:0.1:5;
y=0:0.1:5;
[x y]=meshgrid(x,y);
z=theta(1)+theta(2)*x+theta(3)*y;
surf(x,y,z);
hold on;
scatter3(x(:,1), x(:,2), y);
xlabel('ram/gb');
ylabel('cpu頻率/ghz');
下面給出從兩個角度看的結果圖。
然後給出測試結果與真實標記的對比。可以看到結果還不錯。
這裡同樣給出**。
clc; %清屏
clear; %清變數
load data; %匯入x,y,test_feature
epsilon = 0.0001; %收斂閾值
alpha = 0.0005; %學習率
theta = zeros(size(x,2),1);
k = 1;
figure(1);
while
1 j(k) = 1/2 * (norm(x*theta - y))^2;
theta_new = theta - alpha*(x'*x*theta - x'*y);
fprintf('the %dth iteration, j = %f \n', k, j(k));
if norm(theta_new-theta) < epsilon
break;
endtheta = theta_new;
k = k + 1;
end% 繪製損失函式變化圖
plot(j);
predict=test_feature*theta;
% 以下**使用求閉式解方法來比較兩種方法的結果
theta_direct = inv(x'*x)*x'*y;
predict_direct = test_feature*theta_direct;
先解釋一下這行**theta_new = theta - alpha*(x'*x*theta - x'*y);
,前面分析中給出的是引數向量的每一維更新的函式,這裡以矩陣的形式更新,是等價的,在閉式解的推導過程中∇_
θj(θ
)=xt
xθ−x
ty,實際上也證明了這行**的正確性。另外值得一提的是,這裡採用的實際上是批梯度下降法,也就是說每次更新引數需要使用到全部資料集的資料。
然後下面給出j(
θ)的變化圖。
然後給出上述兩種方法最後得出的引數以及**結果的對比,帶_direct字尾的表示使用閉式解直接計算的,否則是梯度下降法的結果。可以看到,兩者非常相近,進一步減小收斂的閾值,可以進一步讓梯度下降法的結果逼近閉式解。
那麼究竟什麼時候使用閉式解?什麼時候使用梯度下降法呢?這要依情況而定,我們來看一下二者各有何優劣。
閉式解求得的解非常精準,不需要調參,但由於要計算矩陣的逆,時間複雜度是o(
n3) ;
梯度下降法可以更快的得到結果,但是需要調參,即收斂閾值和學習率需要手動調整。
這個問題中若採用前者,要求的矩陣的逆的矩陣是 n+
1 階的方陣,也就是說當特徵的維度特別大時,前者的時間複雜度將帶來過長的計算時間,而維度小時毫無疑問用閉式解求取最好。具體問題中選哪個取決於在你能容忍的時間範圍內你的機器上能計算出矩陣的逆的矩陣的最大階數。
1 斯坦福機器學習公開課 by andrew ng及其課程筆記
2 《機器學習》by 周志華
機器學習之線性回歸
線性回歸就是用線性方程去擬合一組資料,x 的最高端是1,用方程可以表示為 h x 0 1x1 n xn我們令 x0 1則上式可以改寫為 h x i 0n ixi tx 既然是擬合的模型,則肯定會存在不符合該模型的點,第 i 個點的真實值與模型 的值之間的差稱為誤差 e h x i y i 假設總共有...
機器學習之線性回歸
線性回歸分析 regression analysis 其資料集是給定乙個函式和他的一些座標點,然後通過回歸分析的演算法,來估計原函式的模型,求得最符合這些資料集的函式解析式。然後我們就可以用來預估未知資料,輸入乙個自變數便會根據這個模型解析式輸出因變數,這些自變數就是特徵向量,因變數即為標籤,而且標...
機器學習之線性回歸
機器學習之線性回歸 已有資料是 電視廣告的投入 x 產品銷售量 y import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.linear model import linearregres...