線性迴歸

美國房價問題

Alex經過一年的努力,終於拿到了美國波士頓麻省理工學院的研究生錄取通知書,在遠離家鄉的地方上學,Alex想在波士頓買一套房子,他手頭有一些積蓄,在網上找了幾套自己滿意的房子,但是又不敢相信網上的價格,人生地不熟的,Alex怕被宰,就從自己做數據分析的朋友Bachelor手裏要到了過去幾年一些有關波士頓房價的資料。

線性迴歸

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
house_prices = pd.read_csv("train.csv")

Bachelor給的數據非常非常多,包含各個方面。
在這裏插入圖片描述
爲了方便分析呢,先提取其中三個特徵作爲分析素材,分別是LotArea表示房屋面積,TotalBsmtSF表示地下室的總面積,SalePrice表示的就是房價了。

house_prices[['LotArea', 'TotalBsmtSF', 'SalePrice']]

在這裏插入圖片描述

理工科出生的Alex想起了曾經學過的知識,想計算一下自己喜歡的那幾套房子的大概房價是多少,到買房的時候心裏好有點數。

於是他把數據重新處理了一下。

sample_test_data = house_prices[['LotArea', 'TotalBsmtSF', 'SalePrice']].copy()
sample_test_data.rename(columns={'LotArea':'x1', 'TotalBsmtSF':'x2', 'SalePrice':'y'}, inplace=True)
sample_test_data

在這裏插入圖片描述
作爲一名優秀的理科生,看見熟悉的x和y覺得舒服多了。

接下來就是建立一個數學模型了,簡單的說就是找一個符合x<sub>1</sub>、x<sub>2</sub>與y關係的式子,這個簡單嘛,高中就學過的東西,待定係數法唄,只不過從一個x變成了x<sub>1</sub>、x<sub>2</sub>而已,那設兩個未知數不就可以了。

設:$$y=ax_1+b_x2$$

這公式那麼一寫阿,瞅起來像是一個線性模型,簡單理解也就是一條線嘛。

再仔細一看,這條線還必須過原點,那就麻煩了,還不能確定這個x<sub>1</sub>、x<sub>2</sub>跟y組成的函數圖像一定過原點阿,必須要經過原點這個限制可就太大了。

沒辦法,再加一個未知數吧,把方程改成$$y=ax_1+b_x2+c$$

這樣以來,在沒確定a、b、c之前,函數圖像可以是空間中任意的。

接下來就是把a、b、c確定下來了,只要它們三個確定下來就好辦了,把自己喜歡的房子的平均房間數和到五個波士頓就業中心的平均距離直接代入x<sub>1</sub>、x<sub>2</sub>,不就能計算出來一個大概的房價y了麼。

看着

$$y=ax_1+b_x2+c$$

這個式子,Alex自己都笑了,這玩意是高中才寫的方程,自己孬好也是上過大學的人,於是把方程又改了改:

$$y=θ_1x_1+θ_2x_2+θ_0$$

這樣,如果跟房價有關的x特徵很多的話,就能把方程寫成矩陣相乘的形式了:

$$y_\theta(x)=\theta_0x_0+\theta_1x_1+\theta_2x_2+...+\theta_ixi+...+\theta{n-1}x_{n-1}+\theta_nxn=\sum{i=0}^n=\theta^Tx$$

這個θ<sub>i</sub>阿,有個學名叫權重項。

這個θ<sub>0</sub>x<sub>0</sub>呢,就是之前寫的θ<sub>0</sub>,讓x<sub>0</sub>=1不就是咯。

也就是說,我得在我的數據裏再加一行x<sub>0</sub>的數據,值全部設置爲1就行了。

sample_test_data['x0'] = 1
sample_test_data = sample_test_data[['y', 'x0', 'x1', 'x2']] # 更換一下y、x1、x2、x0的順序,方便看而已,無意義
sample_test_data

在這裏插入圖片描述
畢竟阿,這個方程是咱自己寫的,假設最後算出來了一套θ<sub>i</sub>,爲了擬合大部分的數據,按照θ<sub>i</sub>計算出來的房價跟真實的房價之間還是有一定的差距的。

如果說對比真實的房價數據,根據咱們這個方程計算出來的房價跟真實的房價相差無幾,那不就是想要的結果麼,我輸入想要買的房子的x特徵值,計算出來的房價y就越接近真實房價。

當然這是後話,現在咱們的目的是啥,就是讓通過咱們方程計算出來的房價跟真實的房價的差值越小越好嘛。

$$y_{(i)}=\theta^Tx_i+\epsilon_i$$

對於每一套房子,y<sub>(i)</sub>表示真實的房價,通過θ<sup>T</sup>x<sub>i</sub>計算出來的是模型預測房價,ε<sub>i</sub>是預測房價跟真實房價之間的差距,當然ε<sub>i</sub>有可能是正數也有可能是負數。

目的什麼來着,讓差距越來越小對吧,也就是讓ε<sub>i</sub>越來越小,當然這個越來越小是說差距越來越小,也就是絕對值越來越接近於0。

給方程移下項:

$$\epsiloni=y{(i)}-\theta^Tx_i$$

這時候咱們再來回顧一下阿,對於方程

$$y_{(i)}=\theta^Tx_i+\epsilon_i$$

θ<sup>T</sup>x<sub>i</sub>是表示係數,如果在座標系表示的話是由x確定一個圖像。

當只有一個x的時候,圖像是一維的,也就是平面上的一條線;

當有兩個x的時候,圖像是二維的,也就是空間裏的一個面;

當有更多x的時候,我是想象不出來了……

就拿只有兩個x舉例隨便畫一個圖像:

線性迴歸
在這個圖像裏,假設青藍色的那個平面表示的就是θ<sup>T</sup>x<sub>i</sub>,真實房價y(i)在圖中表示的紅色的點。

這樣看就清晰了,目的是讓

$$\epsiloni=y{(i)}-\theta^Tx_i$$

的絕對值越小越好,表示在圖像上就是紅色的點越接近青藍色的平面越好。

這裏要明確一個思想,真實房價是確定了,也就是y<sub>(i)</sub>、紅色的點是確定的,而青藍色的平面θ<sup>T</sup>x<sub>i</sub>纔是變動的,也就是說,在空間裏,我們要移動平面來擬合點,找到哪一個平面到所有點的距離最小。

這個預測房價與真實房價之間的距離,也就是誤差ε<sub>(i)</sub>是獨立並同分佈,並且服從均值爲0方差爲σ<sup>2</sup>的高斯分佈。

這裏突然間冒出來三個不熟悉的名詞解釋一下阿:

獨立:各個樣本點之間是相互獨立的。也就是說,Alex去波士頓買房,跟Bachelor早波士頓買房,只要兩個人買的不是同一套房子,它們之間是沒有關係的,買到的房價多少隻跟各個房東有關。

同分布:數據的來源必須相同。Alex是想在波士頓買房,所以需要的是過去幾年波士頓的房價數據,如果拿得是紐約的房價數據,顯然是不符合需求的,建立的數學模型也不準確。

高斯分佈:也就是正態分佈,一種連續型隨機變量的概率密度函數。先來看一下正態分佈的函數圖像:

線性迴歸

看起來是不是特別圓潤,符合一種對稱美,是不是覺得手感肯定特別好。

爲什麼要用高斯分佈?

其實我們一開始並不能確定誤差一定服從高斯分佈,只不過阿,根據前人的經驗,大多數誤差經過測量被證實是服從高斯分佈的,說明高斯分佈對誤差假設來說是一種很好的模型。

在自然界與生產中,一些現象受到許多相互獨立的隨機因素的影響,也就是我們買房過程中的每套住房的平均房間數、到五個波士頓就業中心的平均距離,如果每個因素所產生的影響都很微小,總的影響可以看作是服從正態分佈的。

當然上面那個高斯分佈圖看起來不是很清晰,我們可以用numpy和matplotlib自己來畫一個簡單的高斯分佈函數圖像。

在數學上,正態分佈的概率密度函數:

$$f(x)=\frac{1}{\sqrt{2π}\sigma}e^{\frac{-(x-u)^2}{2\sigma^2}}$$

當u=0,σ=1時,正態分佈稱爲標準正態分佈:

$$f(x)=\frac{1}{\sqrt{2π}}e^{\frac{-x^2}{2}}$$

def gaussian(x, mean, sigma):
    return (np.exp((-(x - mean) ** 2) / (2 * sigma ** 2)) / (np.sqrt(2 * np.pi) * sigma))

mean, sigma = 0, 1
x = np.arange(-3, 3, 0.001)
plt.plot(x, gaussian(x, mean, sigma))
plt.show()

在這裏插入圖片描述
從高斯分佈圖可知,[-2,2]之間的分佈佔大部分,啥意思呢,說的其實是預測房價跟真實房價大多數情況下都是差異不大的。

在我們的房價預測問題中,均值μ=0,所以可以把公式寫成:

$$f(x)=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{x^2}{2\sigma^2}}$$

之前所假設的是誤差ε<sub>(i)</sub>服從正態分佈,所以ε<sub>(i)</sub>就是正態分佈函數中的x,我們再把ε<sub>(i)</sub>代入到公式中:

$$f(ε{(i)})=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{ε{(i)}^2}{2\sigma^2}}$$

我們把之前推導出的結果

$$\epsiloni=y{(i)}-\theta^Tx_i$$

也就是預測房價與真實房價之間的差距,再代入到公式中:

$$f(y_{(i)}-θ^Txi)=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$

在這個公式中,y<sub>(i)</sub>表示的真實房價,是已知的,x<sub>(i)</sub>呢,是每間房子的特徵,也就是房屋的平均房間數之類的,也是已知的。

也就是說,整個公式中,只有θ<sup>T</sup>是未知的。

這樣的話,咱們把自變量換一下,整成一個關於未知數θ的函數:

$$L(θ)=\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$

我們一開始的目的是想讓誤差變小,在正態分佈中,對於自變量x,絕對值越小,越接近於0,因變量的值越大。

好了,現在我們的目的進階了一下,讓L(θ)的值越大越好。

那麼,怎麼才能讓L(θ)的值變大呢?

我們不是有往年的波士頓房價資料麼,把以前的一些資料全部代入進去不就行了。

代入一個,得到一個L(θ1),再代入一個得到一個L(θ2),然後一直代入,一直代入……

咱們是想讓建立的數學模型最好能夠擬合所有的樣本,也就是說,讓所有的L(θ)都最大。

現在把所有的L(θ)整合起來,做一個累乘:

$$L(θ)=\prod{i=1}^{n}\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$

爲什麼要做累乘而不是累加呢?

這個其實跟數學有關,多個樣本之間的累乘依然保留原本的分佈模式,並且會使常見的概率更常見,這個概率對所有的樣本關聯性更強。

累加當然可以用,假如說L(θi)={1,2,3,4,5,6,7,8,9},把所有的數累加起來,其結果sum_L(θi)=45,但是如果把所有的結果累乘起來,其結果ride_L(θi)=362880。

這個時候,如果缺了一個數7,那麼sum_L(θi)'=38,ride_L(θi)’=51840,累乘的結果降低的更多,說明累乘的結果對每一個樣本的關聯性更大。

對於L(θ),它有一個學名叫似然函數。

來看一下定義:似然函數也是一個概率密度函數L(θ∣x),表示在樣本值x已知的情況下求最可能的θ值;實際運用中,根據我們的樣本去估計參數值,找到最最符合的參數,使得與我們的數據組合後恰好是真實值。

暫時不需要去深刻的理解似然函數的概念,咱現在的主要目的是買房。

現在得到了一個累乘的結果L(θ),但是累乘算起來比較麻煩,咱們可以把累乘轉換爲累加,方法是對等式兩邊同時取對數:

$$ln^{L(θ)}=ln^{\prod{i=1}^{n}\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}}$$

雖然轉換了,但是效果還是一樣的,只是通過累加來計算而已。

根據對數運算的性質,可以將累乘計算提到ln前邊,變成累加運算:

$$ln^{L(θ)}=\sum{i=1}^nln^{\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}}$$

再看一下右式ln運算的真數:

$$\frac{1}{\sqrt{2π}\sigma}e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$

這也是一個乘法運算,而且前一項

$$\frac{1}{\sqrt{2π}\sigma}$$

是一個常數,後一項

$$e^{-\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}}$$

根據對數運算的性質可以消去e。

化簡一下,公式就變成了:

$$ln^{L(θ)}=\sum{i=1}^n(ln^{\frac{1}{\sqrt{2π}\sigma}}+ln^{e^{-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2}}})$$

$$=\sum{i=1}^n(ln^{\frac{1}{\sqrt{2π}\sigma}}-\frac{(y{(i)}-θ^Tx_i)^2}{2\sigma^2})$$

$$=\sum{i=1}^nln^{\frac{1}{\sqrt{2π}\sigma}}-\sum{i=1}^n\frac{(y_{(i)}-θ^Tx_i)^2}{2\sigma^2}$$

之前我們分析過了,整個式子裏只有θ<sup>

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