成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

tomorrowwu / 934人閱讀

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

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

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

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

# 根據(jù)公式計(jì)算
for iteration in range(n_iterations):
    # 梯度下降公式 = 1/樣本數(shù) * (預(yù)測(cè)值 - 真實(shí)值) *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 梯度下降法實(shí)踐一:特征縮放 3.1 梯度下降法遇到的問(wèn)題

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

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

3.2 解決方法

解決方法一:

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

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

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

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

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

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

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

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

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

4.2 解決方法

自動(dòng)測(cè)試是否收斂的方法,例如將代價(jià)函數(shù)的變化值與某個(gè)閥值(例如0.001)進(jìn)行比較,但通??瓷厦孢@樣的圖表更好。

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

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

如何選擇?

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

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

5.2 隨機(jī)梯度下降

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

實(shí)現(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個(gè)樣本;
n_epochs = 1000
# 學(xué)習(xí)率
a0 = 0.1
# 定義衰減率
decay_rate = 1

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


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

# 初始化隨機(jī)值
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]
        # 隨機(jī)梯度下降值
        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梯度算法

隨機(jī)梯度下降會(huì)喪失向量帶來(lái)的加速,所以我們不會(huì)太用隨機(jī)梯度下降。

實(shí)現(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個(gè)樣本做一輪迭代
for epoch in range(n_epochs):
    # 生成100個(gè)不重復(fù)的隨機(jī)數(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的時(shí)候,因?yàn)樵肼暤脑?,可能?xùn)練結(jié)果不是收斂的,而是在最低點(diǎn)周圍晃動(dòng),如果我們要解決這個(gè)問(wèn)題,那我們就需要減少學(xué)習(xí)率,讓他在盡量小的范圍內(nèi)晃動(dòng)
1 epoch = 1 次遍歷所有的數(shù)據(jù)

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

實(shí)現(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個(gè)樣本做一輪迭代
for epoch in range(n_epochs):
    # 生成100個(gè)不重復(fù)的隨機(jī)數(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 特征和多項(xiàng)式回歸 6.1 過(guò)擬合的問(wèn)題

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

6.2 過(guò)擬合的解決方法:

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

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

6.2 特征縮放

房?jī)r(jià)預(yù)測(cè)時(shí), 假設(shè)我們不知道房屋面積,但是知道房屋的長(zhǎng)寬。

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

特征未縮放圖形展示

特征縮放圖形展示


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

6.3 正則化

如何不想要theta3和theta4?


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

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

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

L1 會(huì)趨向于減少特征值

L2 會(huì)趨向于保留特征值

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

7.1.2 實(shí)現(xiàn)公式

7.1.3 代碼實(shí)現(xiàn)

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

"""
嶺回歸
方法一: 嶺回歸運(yù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是懲罰項(xiàng)里的alpha, solver處理數(shù)據(jù)的方法,auto是根據(jù)數(shù)據(jù)自動(dòng)選擇,svd是解析解,sag就是隨機(jī)梯度下降
ridge_reg = Ridge(alpha=1, solver="auto")
# 學(xué)習(xí)過(guò)程
ridge_reg.fit(X, y)
# 預(yù)測(cè)
print(ridge_reg.predict([[1.5], [2], [2.5]]))
# 打印截距
print(ridge_reg.intercept_)
# 打印系數(shù)
print(ridge_reg.coef_)

"""
方法二: 嶺回歸和sgd & penalty=2是等價(jià)的
"""
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 實(shí)現(xiàn)公式

7.2.3 代碼實(shí)現(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 實(shí)現(xiàn)公式

7.3.3 代碼實(shí)現(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很大時(shí),效果很好

正規(guī)方程:

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

不需要迭代

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

當(dāng)n很大時(shí),計(jì)算很慢

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

8.1 多項(xiàng)式回歸的梯度下降代碼


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). 將一個(gè)高階方程轉(zhuǎn)化為一個(gè)一階方程;(多元線性回歸)
# degree:用幾維處理數(shù)據(jù);
poly_features = PolynomialFeatures(degree=2, include_bias=False)
# fit_transform === fit() + transform(), 其中transform就是用來(lái)做歸一化的;
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). 將一個(gè)高階方程轉(zhuǎn)化為一個(gè)一階方程;(多元線性回歸)
    # degree:用幾維處理數(shù)據(jù);
    poly_features = PolynomialFeatures(degree=i, include_bias=False)
    # fit_transform === fit() + transform(), 其中transform就是用來(lái)做歸一化的;
    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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/19984.html

相關(guān)文章

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

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

    Lycheeee 評(píng)論0 收藏0
  • ApacheCN 人工智能知識(shí)樹(shù) v1.0

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

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

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

    qujian 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<