這篇博客中作一個使用最小二乘法實現線性迴歸的簡單例子。數據結構
代碼來自《圖解機器學習》 圖3-2,使用MATLAB實現。機器學習
代碼link函數
因爲之前對MATLAB也不是很是熟悉,這裏用到了一些MATLAB的 內建函數 ,順便學習一下。學習
linspace
用於產生指定範圍內的指定數量點數,相鄰數據跨度相同,並返回一個行向量:spa
若是咱們須要產生列向量,咱們使用'
就能夠了:.net
內置的常量,圓周率。code
n=50; N=1000; x=linspace(-3,3,n)'; X=linspace(-3,3,N)';
這句先定義了n和N兩個整形變量,而後生成了2個長度分別爲50和100的列向量,數據結構爲:blog
大概看下x
,是這個樣子的:get
x是列向量(這麼細緻是爲了能在數學上面有一個更加深入的瞭解)。pix
的內容就是x的內容都乘了一個π
。博客
pix=pi*x; y=sin(pix)./(pix)+0.1*x+0.05*randn(n,1);
獲取y軸座標,並加入一些隨機的「噪聲」,用於迴歸。
p(:,1)=ones(n,1); P(:,1)=ones(N,1);
這裏創建了二個列向量,分別是p
和P
,形狀是這樣的:
這兩個列向量裏面全部元素都是1;其實我奇怪爲何不p = ones(n,1);
,多是方便後面的格式統一吧。
for j=1:15 p(:,2*j)=sin(j/2*x); p(:,2*j+1)=cos(j/2*x); P(:,2*j)=sin(j/2*X); P(:,2*j+1)=cos(j/2*X); end
直接循環不是很直觀,先手動作一兩步試試:
咱們此次僅對p
這個矩陣進行操做,當j = 1
的時候:
而後j = 2
的時候:
咱們會發現,每次執行一次循環,p
矩陣就會增長2列,咱們能夠根據語句的內容看出來增長了的內容和x與j的關係。在循環結束的時候,這個矩陣會有31列。
t=p\y; F=P*t;
我以爲這行t = p \ y;
這句最關鍵了,\
是左除,用於解出矩陣t 使得 p * t = y
。
而後經過解出的t,算出F = p * t
。
figure(1); clf; hold on; axis([-2.8 2.8 -0.5 1.2]); plot(X,F,'g-'); plot(x,y,'bo');
這兩行技術含量不大,就是畫圖了:
這個示意圖可讓咱們大體看出迴歸的過程。