貝葉斯分析之利用線性迴歸模型理解並預測數據(三)

這一節主要講多元線性迴歸模型


一元線性迴歸討論的是一個因變量與一個自變量的關係,但是在很多例子中,模型可能包含多個自變量。在一元線性迴歸模型中,我們希望一條直線來解釋數據,而在多元線性迴歸模型中,我們希望找到一個維度爲 m 的超平面。


y=α+0.9x1+1.5x2y = \alpha + 0.9 * x_1 + 1.5 * x_2 爲例講解多元線性迴歸模型
先生成數據(導入的庫與第一節基本一樣)

np.random.seed(314)
N = 100
alpha_real = 2.5
beta_real = [0.9, 1.5]
eps_real = np.random.normal(0, 0.5, size=N)

X = np.array([np.random.normal(i, j, N) for i,j in zip([10, 2], [1, 1.5])])
X_mean = X.mean(axis=1, keepdims=True)
X_centered = X - X_mean
y = alpha_real + np.dot(beta_real, X) + eps_real
def scatter_plot(x, y):
    plt.figure(figsize=(10, 10))
    for idx, x_i in enumerate(x):
        plt.subplot(2, 2, idx+1)
        plt.scatter(x_i, y)
        plt.xlabel('$x_{}$'.format(idx), fontsize=16)
        plt.ylabel('$y$', rotation=0, fontsize=16)

    plt.subplot(2, 2, idx+2)
    plt.scatter(x[0], x[1])
    plt.xlabel('$x_{}$'.format(idx-1), fontsize=16)
    plt.ylabel('$x_{}$'.format(idx), rotation=0, fontsize=16)

scatter_plot(X_centered, y)
plt.savefig('B04958_04_25.png', dpi=300, figsize=(5.5, 5.5))

在這裏插入圖片描述
再建立多元線性迴歸模型

with pm.Model() as model_mlr:
    alpha_tmp = pm.Normal('alpha_tmp', mu=0, sd=10)
    beta = pm.Normal('beta', mu=0, sd=1, shape=2)
    epsilon = pm.HalfCauchy('epsilon', 5)

    mu = alpha_tmp + pm.math.dot(beta, X_centered)

    alpha = pm.Deterministic('alpha', alpha_tmp - pm.math.dot(beta, X_mean)) 

    y_pred = pm.Normal('y_pred', mu=mu, sd=epsilon, observed=y)

    start = pm.find_MAP()
    step = pm.NUTS(scaling=start)
    trace_mlr = pm.sample(5000, step=step, start=start, nchains=1)

varnames = ['alpha', 'beta','epsilon']
pm.traceplot(trace_mlr, varnames)
plt.savefig('B04958_04_26.png', dpi=300, figsize=(5.5, 5.5));

這裏使用 pm.math.dot() 來定義變量 mu,即線性代數中的點乘(或矩陣相乘)。

在這裏插入圖片描述

現在看一下推斷出來的參數的總結
在這裏插入圖片描述

學了怎麼多的線性迴歸模型,模型顯然已經不是重點,接下來講解多元迴歸模型中的三個重點:

  1. 混淆變量
  2. 多重共線性或相關性太高
  3. 隱藏的有效變量

1. 混淆變量

一個變量 z 與預測變量 x,y 都相關,如果去掉 z 之後能用 x 預測出 y,則稱 z 爲混淆變量。

看上面的概念闡述可能很難理解,我們從數據上來理解一下

np.random.seed(314)
N = 100
x_1 = np.random.normal(size=N)
# 其實是 x_1 決定着 x2,並且 x_1 決定着 y,所以 x_1 在分析過程中容易被忽略(混淆變量)
x_2 = x_1 + np.random.normal(size=N, scale=1)
y = x_1 + np.random.normal(size=N)
X = np.vstack((x_1, x_2))

scatter_plot(X, y)
plt.savefig('B04958_04_27.png', dpi=300, figsize=(5.5, 5.5));

在這裏插入圖片描述建立多元線性迴歸模型,對各個係數進行求解
在這裏插入圖片描述
在這裏插入圖片描述
可以看到 β1\beta_1 接近 0,這意味着 x2x_2yy 來說幾乎沒有作用(即多餘的變量)。

2. 多重共線性或相關性太高

修改上述代碼給 x1x_1 增加一個很小的擾動,因而兩個變量可以看做是一樣的,即 x1x_1x2x_2 之間的關係是一條斜率接近於 1 的直線。

x_2 = x_1 + np.random.normal(size=N, scale=0.01) 

在這裏插入圖片描述
根據 β\beta 係數畫出2D的核密度估計圖
在這裏插入圖片描述

3. 隱藏的有效變量

每個單獨變量 x 不足以預測 y,如果將 x 組合在一起後就可以預測 y。因變量之間具有相關性,每個因變量都有反作用,因而忽略其中任何一個都會造成對變量影響力的低估>

先生成模擬數據,注意觀察 x_0 與 x_1 的聯繫

np.random.seed(314)
N = 100
r = 0.8
x_0 = np.random.normal(size=N)
x_1 = np.random.normal(loc=x_0 * r, scale=(1 - r ** 2) ** 0.5)
y = np.random.normal(loc=x_0 - x_1)
X = np.vstack((x_0, x_1))

scatter_plot(X, y)
plt.savefig('B04958_04_31.png', dpi=300, figsize=(5.5, 5.5));

在這裏插入圖片描述
再建立模型並求解

with pm.Model() as model_ma:
    alpha = pm.Normal('alpha', mu=0, sd=10)
    beta = pm.Normal('beta', mu=0, sd=10, shape=2)
    #beta = pm.Normal('beta', mu=0, sd=10)
    epsilon = pm.HalfCauchy('epsilon', 5)

    mu = alpha + pm.math.dot(beta, X)
    #mu = alpha + beta * X[0]

    y_pred = pm.Normal('y_pred', mu=mu, sd=epsilon, observed=y)

    start = pm.find_MAP()
    step = pm.NUTS(scaling=start)
    trace_ma = pm.sample(5000, step=step, start=start, nchains=1)

pm.traceplot(trace_ma)
plt.savefig('B04958_04_32.png', dpi=300, figsize=(5.5, 5.5));

在這裏插入圖片描述
在這裏插入圖片描述

我們根據結果發現,beta 的值接近 1 和 -1,即 x1x_1yy 正相關,而 x2x_2yy 負相關。

項目源碼:https://github.com/dhuQChen/BayesianAnalysis

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