引用自史丹福大學吳老師機器學習課程中講解的例子。估計房價的時候,倘若有房子的長度(length)和寬度(width)兩個特徵,即占地面積的寬度和占地面積的長度,我們完全可以把這兩個特徵乘起來生成乙個新的特徵即占地面積(area)。
area = length x width那麼就可以只用area這乙個變數作為模型的特徵。
通過選擇合適的特徵,構建簡單多項式作為假設函式,hθ(a) = θ0 + θ1xa。a即面積area。
假如有部分住房**資料集點是以下點:
為了擬合資料,會有多種解決問題的模型。顯然線性的函式是擬合不出這樣的效果,它只能擬合線性區分度高的資料集。
可以選用二次函式模型(用於房價**不合理),但是二次函式影象的都知道,開口朝下,頂點是最高的,之後便會下來,這明顯和我們現實生活中的房價背道而馳(房價不會高到一定程度後下降趴)。
因此我們會轉而使用另一種模型,比如三次函式模型使用多元線性回歸的方法,可以將我們的模型進行簡單的修改。
這裡根據資料分布特徵,我們使用三次函式。即下面**的假設函式形式為hθ(x) = θ0 +θ1xx1 +θ2xx2 +θ3xx3,自定義 θ0、θ1、和θ2。
特徵值乘方之後值會很大,因此要一定要特徵縮放!!!
上述文字和基本都是課程裡面所講述的。
梯度下降函式和計算損失值函式的m檔案就是上個部落格寫的,不再贅述。
自己生成滿足正態分佈的乙個列向量,之後計算出適合多項式回歸演算法的y值。為了避免重,每個值再加上隨機雜訊(資料集沒找到,所以自己生成了)。下面是多項式回歸演算法實現的m檔案:
function =
polynomial_regression()
x=randn
(100,1
);%隨機生成乙個滿足正態分佈的100
*1的列向量
y=0.5*x+x.^2
+randn
(100,1
);%加上隨機雜訊
plot
(x,y,
'ko');
x=[ones
(100,1
),x]
; d_x=
sort
(x);
l_x=d_x;
i=1;
j=2;
while i<=1,
%i表示往矩陣第二列後面加的列數
x(:,i+2)=
x(:,i+1)
.*x(
:,2)
;%後面的每一列都乘上第一列的數
i=i+1;
end;
while j<=3,
x(:,j)=(
x(:,j)
-mean(x
(:,j))).
/std(x
(:,j))
;%因為特徵值乘方之後值會很大,因此要特徵縮放
j=j+1;
end;
theta=[0
00];
theta_new=
gradient_decline
(x,y,theta)
;%因為是隨機種子生成的特徵矩陣,所以每次loss達到的最低值都會不一樣
hold on;
d_y=
theta_new(1
)+theta_new(2
)*d_x+
theta_new(3
)*d_x.
*d_x;
l_y=
theta_new(1
)+theta_new(2
)*d_x+
theta_new(3
)*d_x;
plot
(d_x,d_y)
;title
('fitted curve');
legend
('data point'
,'polynomial regression');
end
結果:
損失函式(因為是隨機種子,所以每次執行得到的最低loss值都會不一樣,迭代次數也會變化):
matlab最後一條豎線暫時不知道那裡出來的,知道的大佬告訴我一聲哈。
指令碼**:
d_x=
sort
(x);
l_x=d_x;
d_y=
theta_new(1
)+theta_new(2
)*d_x+
theta_new(3
)*d_x.
*d_x;
l_y=
theta_new(1
)+theta_new(2
)*d_x+
theta_new(3
)*d_x;
plot
(d_x,d_y)
;plot
(l_x,l_y)
;title
('fitted curve');
legend
('data point'
,'polynomial regression'
,'line regression'
);
結果:
結論:較準確,快速!希望大家多多支援、推廣,感謝大家!!!
機器學習筆記 多項式回歸
比如你的資料分布,是符合y 0.5 x 2 x 2的.那你用y ax b去擬合,無論如何都沒法取的很好的效果.通過上面的分析,我們可以看出,我們想做的事情是對樣本做公升維 即增加樣本的特徵數目 sklean中完成這一功能的類叫做polynomialfeatures.classsklearn.prep...
python 機器學習多項式回歸
現實世界的曲線關係都是通過增加多項式實現的,現在解決多項式回歸問題 住房 樣本 樣本影象 import matplotlib.font manager as fm import matplotlib.pyplot as plt myfont fm.fontproperties fname c win...
多項式回歸
import numpy as np import matplotlib.pyplot as plt x np.random.uniform 3,3,size 100 x x.reshape 1,1 y 0.5 x 2 x 2 np.random.normal 0,1,100 plt.scatter...