国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

機器學(xué)習(xí)(四)-多變量線性回歸

tomorrowwu / 924人閱讀

摘要:多變量線性回歸應(yīng)用場景目前為止,我們探討了單變量特征的回歸模型,現(xiàn)在我們對房價模型增加更多的特征,例如房間數(shù)樓層等,構(gòu)成一個含有多個變量的模型。

1 多變量線性回歸應(yīng)用場景

目前為止,我們探討了單變量/特征的回歸模型,現(xiàn)在我們對房價模型增加更多的特征,例如房間數(shù)樓層等,構(gòu)成一個含有多個變量的模型.。

1.1 單變量線性回歸案例

模型: hθ(x) = θ0 + θ1x

1.2 多變量線性回歸案例

模型:

新的概念


例如:

         x(1) = [40, 1, 1, 10]
        x(2) = [96, 2, 1, 5]    
        x(3) = [135, 3, 2, 20]

例如:

x(1)1 = 40
x(1)2 = 1
.......

2 多元梯度下降法

模型:

參數(shù):

損失函數(shù):

梯度下降公式(重復(fù)執(zhí)行):

2.1 一元梯度下降n=1, 重復(fù)執(zhí)行,直到收斂


2.2 多元梯度下降n>1

2.3 多元批梯度下降代碼
import numpy as np

# 1). 模擬數(shù)據(jù)
X1 = 2 * np.random.randn(100, 1)
X2 = 4 * np.random.rand(100, 1)
X3 = 6 * np.random.rand(100, 1)
y = 4 + 3 * X1 + 4 * X2 + 5 * X3 + np.random.randn(100, 1)

#  2). 實現(xiàn)梯度下降算法
#  np.c_是將數(shù)據(jù)組合成向量格式: (n, 1) (n,1) = (n, 2)
X_b = np.c_[np.ones((100, 1)), X1, X2, X3]
# 初始化theta的值, 需要計算四個theta的值;
theta = np.random.randn(4, 1)
# 設(shè)置學(xué)習(xí)率和收斂次數(shù)
learning_rate = 0.1
n_iterations = 1000

# 根據(jù)公式計算
for iteration in range(n_iterations):
    # 梯度下降公式 = 1/樣本數(shù) * (預(yù)測值 - 真實值) *Xi
    gradients = 1 / 100 * X_b.T.dot(X_b.dot(theta) - y)
    # theta = theta - 學(xué)習(xí)率 * 梯度值
    theta = theta - learning_rate * gradients

print(theta)

代碼執(zhí)行結(jié)果:

3 梯度下降法實踐一:特征縮放 3.1 梯度下降法遇到的問題

在我們面對多維特征問題的時候,我們要保證這些特征都具有相近的尺度,這將幫助梯度下降算法更快地收斂。而特征縮放是為了確保特征在一個數(shù)量級上。

以房價問題為例,假設(shè)我們使用兩個特征,房屋的尺寸和房間的數(shù)量,其中x1 = 房屋面積(0-400 m2), x2 = 臥室數(shù)量(1-5), 以兩個參數(shù)分別為橫縱坐標(biāo),繪制代價函數(shù)的等高線圖能,看出圖像會顯得很扁,梯度下降算法需要非常多次的迭代才能收斂。

3.2 解決方法

解決方法一:

嘗試將所有特征的尺度都盡量縮放到-1到1之間。比如:

x1 = 房屋面積 / 400
x2 = 臥室數(shù)量 / 5

解決方法二: 平方均值法
在原來的基礎(chǔ)上把特征 xi 替換成 xi – μ;

也可以把最大值換成標(biāo)準(zhǔn)差,或者最大值 – 最小值。

4 梯度下降法實踐二: 學(xué)習(xí)率 4.1 梯度下降法遇到的問題

梯度下降算法收斂所需要的迭代次數(shù)根據(jù)模型的不同而不同,我們不能提前預(yù)知,我們可以繪制迭代次數(shù)和代價函數(shù)的圖表來觀測算法在何時趨于收斂。

梯度下降算法的每次迭代受到學(xué)習(xí)率的影響,

如果學(xué)習(xí)率過小,則達(dá)到收斂所需的迭代次數(shù)會非常高;

如果學(xué)習(xí)率過大,每次迭代可能不會減小代價函數(shù),可能會越過局部最小值導(dǎo)致無法收斂。

4.2 解決方法

自動測試是否收斂的方法,例如將代價函數(shù)的變化值與某個閥值(例如0.001)進(jìn)行比較,但通常看上面這樣的圖表更好。

嘗試在如下的數(shù)值中選擇α : …, 0.001, 0.003, 0.01, 0.03, 0.1, 0.3, 1,…

5 梯度下降算法補充 5.1 三種梯度下降總結(jié)

如何選擇?

訓(xùn)練集比較小: 使用批梯度下降(小于2000個)

訓(xùn)練集比較大:使用Mini-bitch梯度下降 一般的Mini-batch size 是64,128,256, 512,1024, Mini-batch size要適用CPU/GPU的內(nèi)存

5.2 隨機梯度下降

隨機梯度下降思想:把m個樣本分成m份,每次用1份做梯度下降;也就是說,當(dāng)有m個樣本時,批梯度下降只能做一次梯度下降,但是隨機梯度下降可以做m次。

實現(xiàn)代碼

import numpy as np
import random
X = 2 * np.random.rand(100, 1)
Y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# 每輪epochs處理m個樣本;
n_epochs = 1000
# 學(xué)習(xí)率
a0 = 0.1
# 定義衰減率
decay_rate = 1

def learning_schedule(epoch_num):
    """
    定義一個學(xué)習(xí)率衰減的函數(shù)
    """
    return (1.0 / (decay_rate * epoch_num + 1)) * a0


# 初始化theta值
theta = np.random.randn(2, 1)

# 初始化隨機值
num = [i for i in range(100)]
m = 100

for epoch in range(n_epochs):
    rand = random.sample(num, 100)
    for i in range(m):
        random_index = rand[i]
        xi = X_b[random_index:random_index + 1]
        yi = Y[random_index:random_index + 1]
        # 隨機梯度下降值
        gradients = xi.T.dot(xi.dot(theta) - yi)
        # 學(xué)習(xí)率
        learning_rate = learning_schedule(epoch+1)
        theta = theta - learning_rate * gradients

print(theta)

執(zhí)行結(jié)果展示:

5.3 Mini-batch梯度算法

隨機梯度下降會喪失向量帶來的加速,所以我們不會太用隨機梯度下降。

實現(xiàn)代碼

import numpy as np
import random

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# print(X_b)

n_epochs = 500
a = 0.03
m = 100
num = [i for i in range(100)]



theta = np.random.randn(2, 1)
batch_num = 5
batch_size = m // 5

# epoch 是輪次的意思,意思是用m個樣本做一輪迭代
for epoch in range(n_epochs):
    # 生成100個不重復(fù)的隨機數(shù)
    for i in range(batch_num):
        start = i*batch_size
        end = (i+1)*batch_size
        xi = X_b[start:end]
        yi = y[start:end]
        gradients = 1/batch_size * xi.T.dot(xi.dot(theta)-yi)
        print(a)
        learning_rate = a
        theta = theta - learning_rate * gradients

print(theta)

執(zhí)行結(jié)果展示:

5.4 Mini-batch梯度算法優(yōu)化: 學(xué)習(xí)率衰減

在做Mini-batch的時候,因為噪聲的原因,可能訓(xùn)練結(jié)果不是收斂的,而是在最低點周圍晃動,如果我們要解決這個問題,那我們就需要減少學(xué)習(xí)率,讓他在盡量小的范圍內(nèi)晃動
1 epoch = 1 次遍歷所有的數(shù)據(jù)

學(xué)習(xí)率衰減公式:

實現(xiàn)代碼

import numpy as np
import random

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
# print(X_b)

n_epochs = 500
t0, t1 = 5, 50

m = 100
num = [i for i in range(100)]

def learning_schedule(t):
    return float(t0) / (t + t1)

theta = np.random.randn(2, 1)

batch_num = 5
batch_size = m // 5

# epoch 是輪次的意思,意思是用m個樣本做一輪迭代
for epoch in range(n_epochs):
    # 生成100個不重復(fù)的隨機數(shù)
    for i in range(batch_num):
        start = i*batch_size
        end = (i+1)*batch_size
        xi = X_b[start:end]
        yi = y[start:end]
        gradients = 1/batch_size * xi.T.dot(xi.dot(theta)-yi)
        learning_rate = learning_schedule(epoch*m + i)
        theta = theta - learning_rate * gradients

print(theta)

執(zhí)行結(jié)果展示:

6 特征和多項式回歸 6.1 過擬合的問題

過擬合的問題出現(xiàn)在變量(θ)過多的時候,這時候我們沒有更多的數(shù)據(jù)去擬合模型,雖然損失函數(shù)的值基本接近于0。

6.2 過擬合的解決方法:

減少特征的數(shù)量(一般不用)
1)手動選擇特征數(shù)
2)模型選擇

正則化(特征縮放)
保留所有特征,但是減少量級或者參數(shù)θ_j的大小

6.2 特征縮放

房價預(yù)測時, 假設(shè)我們不知道房屋面積,但是知道房屋的長寬。

模型設(shè)計:
hθ(x) = θ0 + θ1 x 房屋的長度 + θ2 x 房屋的寬度

特征未縮放圖形展示

特征縮放圖形展示


注:如果我們采用多項式回歸模型,在運行梯度下降算法前,特征縮放非常有必要。

6.3 正則化

如何不想要theta3和theta4?


首先, 我們可以在損失函數(shù)中,加入關(guān)于theta3和theta4的項, 迫使若損失函數(shù)想要最小化, 必須讓theta3和theta4盡可能的小。

然后正則化, 公式如下圖:

6.4 L1 正則和 L2 正則的區(qū)別

L1 會趨向于減少特征值

L2 會趨向于保留特征值

7 正則化算法與代碼實現(xiàn) 7.1 Ridge(嶺)回歸 7.1.1 算法理解

7.1.2 實現(xiàn)公式

7.1.3 代碼實現(xiàn)

兩種實現(xiàn)嶺回歸的方法:

"""
嶺回歸
方法一: 嶺回歸運用了L2正則化
"""
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressor


X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# alpha是懲罰項里的alpha, solver處理數(shù)據(jù)的方法,auto是根據(jù)數(shù)據(jù)自動選擇,svd是解析解,sag就是隨機梯度下降
ridge_reg = Ridge(alpha=1, solver="auto")
# 學(xué)習(xí)過程
ridge_reg.fit(X, y)
# 預(yù)測
print(ridge_reg.predict([[1.5], [2], [2.5]]))
# 打印截距
print(ridge_reg.intercept_)
# 打印系數(shù)
print(ridge_reg.coef_)

"""
方法二: 嶺回歸和sgd & penalty=2是等價的
"""
sgd_reg = SGDRegressor(penalty="l2")
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict([[1.5], [2], [2.5]]))
# 打印截距
print("W0=", sgd_reg.intercept_)
# 打印系數(shù)
print("W1=", sgd_reg.coef_)

7.2 Lasso(拉索)回歸 7.2.1 算法理解

7.2.2 實現(xiàn)公式

7.2.3 代碼實現(xiàn)
"""
Lasso 回歸

Lasso用的是l1的正則化
"""
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.linear_model import SGDRegressor

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

lasso_reg = Lasso(alpha=0.15)
lasso_reg.fit(X, y)
print(lasso_reg.predict([[1.5]]))
print(lasso_reg.coef_)

sgd_reg = SGDRegressor(penalty="l1", n_iter=1000)
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict([[1.5]]))
print(sgd_reg.coef_)
7.3 Elastic Net回歸 7.3.1 算法理解

7.3.2 實現(xiàn)公式

7.3.3 代碼實現(xiàn)
import numpy as np
from sklearn.linear_model import ElasticNet

X = 2 * np.random.rand(100, 1)
Y = 4 + 3 * X + np.random.randn(100, 1)

elastic_reg = ElasticNet(alpha=0.15, l1_ratio=0.5)

elastic_reg.fit(X, Y)
print(elastic_reg.predict([[1.5]]))
print(elastic_reg.coef_)
print(elastic_reg.intercept_)


from sklearn.linear_model import SGDRegressor
elastic_reg = SGDRegressor(penalty="elasticnet")
elastic_reg.fit(X, Y)
print(elastic_reg.predict([[1.5]]))
print(elastic_reg.coef_)
8 正規(guī)方程和梯度下降比較

梯度下降:

需要選擇合適的α

需要多次迭代

當(dāng)n很大時,效果很好

正規(guī)方程:

不需要選擇學(xué)習(xí)率a

不需要迭代

需要計算X的轉(zhuǎn)置乘X整體的逆

當(dāng)n很大時,計算很慢

總結(jié):根據(jù)經(jīng)驗,當(dāng)特征數(shù)量到10000的時候,是會換成梯度下降比較好

8.1 多項式回歸的梯度下降代碼


import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# 1). 數(shù)據(jù)準(zhǔn)備;
# 樣本數(shù)
m = 100
X = 6 * np.random.randn(m, 1) - 3
Y = 0.5 * X ** 2 + X + 2 + np.random.randn(m, 1)

# 2). 處理
# 2-1). 將一個高階方程轉(zhuǎn)化為一個一階方程;(多元線性回歸)
# degree:用幾維處理數(shù)據(jù);
poly_features = PolynomialFeatures(degree=2, include_bias=False)
# fit_transform === fit() + transform(), 其中transform就是用來做歸一化的;
X_poly = poly_features.fit_transform(X, Y)

# 2-2). 處理一階方程
line_reg = LinearRegression()
line_reg.fit(X_poly, Y)

print(line_reg.coef_)
print(line_reg.intercept_)
8.2 不同維度繪制的圖形
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression

# 1). 數(shù)據(jù)準(zhǔn)備;
# 樣本數(shù)
m = 100
X = 6 * np.random.randn(m, 1) - 3
Y = 7 * X ** 2 + 5 *X + 2 + np.random.randn(m, 1)

# plt.plot(X, Y, "b.")
# plt.show()


# 設(shè)置圖像維度及線條的字體顯示
d = {1: "g-", 2: "r.", 10: "y*"}
# d = {2: "g-"}


for i in d:
    # 2). 處理
    # 2-1). 將一個高階方程轉(zhuǎn)化為一個一階方程;(多元線性回歸)
    # degree:用幾維處理數(shù)據(jù);
    poly_features = PolynomialFeatures(degree=i, include_bias=False)
    # fit_transform === fit() + transform(), 其中transform就是用來做歸一化的;
    X_poly = poly_features.fit_transform(X)
    print(X_poly)

    # 2-2). 處理一階方程
    line_reg = LinearRegression()
    line_reg.fit(X_poly, Y)

    print(line_reg.coef_)
    print(line_reg.intercept_)

    y_predict = line_reg.predict(X_poly)
    plt.plot(X_poly[:, 0], y_predict, d[i])


plt.show()

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/19984.html

相關(guān)文章

  • 機器學(xué)習(xí)()-變量線性回歸

    摘要:多變量線性回歸應(yīng)用場景目前為止,我們探討了單變量特征的回歸模型,現(xiàn)在我們對房價模型增加更多的特征,例如房間數(shù)樓層等,構(gòu)成一個含有多個變量的模型。 1 多變量線性回歸應(yīng)用場景 目前為止,我們探討了單變量/特征的回歸模型,現(xiàn)在我們對房價模型增加更多的特征,例如房間數(shù)樓層等,構(gòu)成一個含有多個變量的模型.。 1.1 單變量線性回歸案例 模型: hθ(x) = θ0 + θ1x showIm...

    Lycheeee 評論0 收藏0
  • ApacheCN 人工智能知識樹 v1.0

    摘要:貢獻(xiàn)者飛龍版本最近總是有人問我,把這些資料看完一遍要用多長時間,如果你一本書一本書看的話,的確要用很長時間。為了方便大家,我就把每本書的章節(jié)拆開,再按照知識點合并,手動整理了這個知識樹。 Special Sponsors showImg(https://segmentfault.com/img/remote/1460000018907426?w=1760&h=200); 貢獻(xiàn)者:飛龍版...

    劉厚水 評論0 收藏0
  • 機器學(xué)習(xí)線性回歸python實現(xiàn)

    摘要:機器學(xué)習(xí)線性回歸原理介紹機器學(xué)習(xí)線性回歸實現(xiàn)機器學(xué)習(xí)線性回歸實現(xiàn)這里使用實現(xiàn)線性回歸,沒有使用等機器學(xué)習(xí)框架,目的是幫助理解算法的原理。單變量和雙變量的使用的自己模擬的一個簡單的房價數(shù)據(jù)集,多變量的使用的房價數(shù)據(jù)集。 【機器學(xué)習(xí)】線性回歸原理介紹 【機器學(xué)習(xí)】線性回歸python實現(xiàn) 【機器學(xué)習(xí)】線性回歸sklearn實現(xiàn) 這里使用python實現(xiàn)線性回歸,沒有使用sklearn等...

    qujian 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<