日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

1-2 用Python编写【房价预测】模型----paddle

發(fā)布時間:2023/11/28 生活经验 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1-2 用Python编写【房价预测】模型----paddle 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
課程>我的課程>百度架構(gòu)師手把手教深度學(xué)習(xí)>1-2 用Python編寫【房價預(yù)測】模型>1-2 用Python編寫【房價預(yù)測】模型paddle初級教程第一章 第二節(jié)王然(學(xué)生)Notebook教育初級深度學(xué)習(xí)Python32019-12-19 17:00:50啟動環(huán)境停 止部署版本內(nèi)容數(shù)據(jù)集在線服務(wù)請選擇版本草稿 2019-12-20 17:57:36查看教師發(fā)布的版本

使用Numpy構(gòu)建神經(jīng)網(wǎng)絡(luò)

本節(jié)將使用Python語言和Numpy庫來構(gòu)建神經(jīng)網(wǎng)絡(luò)模型,向讀者展示神經(jīng)網(wǎng)絡(luò)的基本概念和工作過程。

構(gòu)建神經(jīng)網(wǎng)絡(luò)/深度學(xué)習(xí)模型的基本步驟

如之前的介紹,應(yīng)用于不同場景的深度學(xué)習(xí)模型具備一定的通用性,均可以從下述五個步驟來完成模型的構(gòu)建和訓(xùn)練。

  • 數(shù)據(jù)處理:從本地文件或網(wǎng)絡(luò)地址讀取數(shù)據(jù),并做預(yù)處理操作,如校驗數(shù)據(jù)的正確性等。
  • 模型設(shè)計:完成網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(模型要素1),相當(dāng)于模型的假設(shè)空間,即模型能夠表達(dá)的關(guān)系集合。
  • 訓(xùn)練配置:設(shè)定模型采用的尋解算法(模型要素2),即優(yōu)化器,并指定計算資源。
  • 訓(xùn)練過程:循環(huán)調(diào)用訓(xùn)練過程,每輪均包括前向計算 、損失函數(shù)(優(yōu)化目標(biāo),模型要素3)和后向傳播這三個步驟。
  • 保存模型:將訓(xùn)練好的模型保存,以備預(yù)測時調(diào)用。

下面使用Python編寫預(yù)測波士頓房價的模型,一樣遵循這樣的五個步驟。 正是由于這個建模和訓(xùn)練的過程存在通用性,即不同的模型僅僅在模型三要素上不同,而五個步驟中的其它部分保持一致,深度學(xué)習(xí)框架才有用武之地。

波士頓房價預(yù)測

波士頓房價預(yù)測是一個經(jīng)典的機(jī)器學(xué)習(xí)問題,類似于程序員世界的“Hello World”。波士頓地區(qū)的房價是由諸多因素影響的,該數(shù)據(jù)集統(tǒng)計了13種可能影響房價的因素和該類型房屋的均價,期望構(gòu)建一個基于13個因素預(yù)測房價的模型。預(yù)測問題根據(jù)預(yù)測輸出的類型是連續(xù)的實數(shù)值,還是離散的標(biāo)簽,區(qū)分為回歸任務(wù)和分類任務(wù)。因為房價是一個連續(xù)值,所以房價預(yù)測顯然是一個回歸任務(wù)。下面我們嘗試用最簡單的線性回歸模型解決這個問題,并用神經(jīng)網(wǎng)絡(luò)來實現(xiàn)這個模型。

線性回歸模型

假設(shè)房價和各影響因素之間能夠用線性關(guān)系來描述(類似牛頓第二定律的案例):

y=∑j=1Mxjwj+by = {\sum_{j=1}^Mx_j w_j} + b y=j=1M?xj?wj?+b

模型的求解即是通過數(shù)據(jù)擬合出每個wjw_jwj?bbb。wjw_jwj?bbb分別表示該線性模型的權(quán)重和偏置。一維情況下,wjw_jwj?bbb就是直線的斜率和截距。

數(shù)據(jù)處理

在搭建模型之前,讓我們先導(dǎo)入數(shù)據(jù),查閱下內(nèi)容。房價數(shù)據(jù)存放在本地目錄下的housing.data文件中,通過執(zhí)行如下的代碼可以導(dǎo)入數(shù)據(jù)并查閱。

In[47]
# 導(dǎo)入需要用到的package
import numpy as np
import json
# 讀入訓(xùn)練數(shù)據(jù)
datafile = './work/housing.data'
data = np.fromfile(datafile, sep=' ')
data
./work/housing.data
array([6.320e-03, 1.800e+01, 2.310e+00, ..., 3.969e+02, 7.880e+00,1.190e+01])

因為讀入的原始數(shù)據(jù)是1維的,所有數(shù)據(jù)都連在了一起。所以將數(shù)據(jù)的形狀進(jìn)行變換,形成一個2維的矩陣。每行為一個數(shù)據(jù)樣本(14個值),每個數(shù)據(jù)樣本包含13個X(影響房價的特征)和一個Y(該類型房屋的均價)。

In[28]
# 讀入之后的數(shù)據(jù)被轉(zhuǎn)化成1維array,其中array的
# 第0-13項是第一條數(shù)據(jù),第14-27項是第二條數(shù)據(jù),.... 
# 這里對原始數(shù)據(jù)做reshape,變成N x 14的形式
feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE','DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ]
feature_num = len(feature_names)
data = data.reshape([data.shape[0] // feature_num, feature_num])
print(len(feature_names))
print(data.shape[0])
print(data.shape[0] // feature_num)
14
506
36
In[35]
# 查看數(shù)據(jù)
x = data[0]
print(x.shape)
print(x)
(14,)
[6.320e-03 1.800e+01 2.310e+00 0.000e+00 5.380e-01 6.575e+00 6.520e+014.090e+00 1.000e+00 2.960e+02 1.530e+01 3.969e+02 4.980e+00 2.400e+01]

取80%的數(shù)據(jù)作為訓(xùn)練集,預(yù)留20%的數(shù)據(jù)用于測試模型的預(yù)測效果(訓(xùn)練好的模型預(yù)測值與實際房價的差距)。打印訓(xùn)練集的形狀可見,我們共有404個樣本,每個樣本含有13個特征和1個預(yù)測值。

In[38]
ratio = 0.8
offset = int(data.shape[0] * ratio)
training_data = data[:offset]
training_data.shape
(404, 14)

對每個特征進(jìn)行歸一化處理,使得每個特征的取值縮放到0~1之間。這樣做有兩個好處:

  1. 模型訓(xùn)練更高效。
  2. 特征前的權(quán)重大小可代表該變量對預(yù)測結(jié)果的貢獻(xiàn)度(因為每個特征值本身的范圍相同)。
In[44]
# 計算train數(shù)據(jù)集的最大值,最小值,平均值
maximums, minimums, avgs = \training_data.max(axis=0), \training_data.min(axis=0), \training_data.sum(axis=0) / training_data.shape[0]
print(maximums)
print(minimums)
#print(avgs)
# 對數(shù)據(jù)進(jìn)行歸一化處理
for i in range(feature_num):#print(maximums[i], minimums[i], avgs[i])data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])
[0.97853679 0.85767327 0.64103506 0.91336634 0.69808245 0.46884290.36634938 0.72313892 0.74827809 0.65363071 0.42274068 0.05191120.73441086 0.57387239]
[-0.02146321 -0.14232673 -0.35896494 -0.08663366 -0.30191755 -0.5311571-0.63365062 -0.27686108 -0.25172191 -0.34636929 -0.57725932 -0.9480888-0.26558914 -0.42612761]
[-1.23663456e-18  5.45493244e-17 -1.09923072e-18 -5.13890360e-171.67632684e-17 -4.12211519e-19 -3.02288447e-18 -3.09158639e-18-3.02288447e-17  2.19846143e-18 -2.74807679e-18  1.68319704e-18-3.29769215e-18  4.25951903e-18]

將上述幾個數(shù)據(jù)處理操作合并成load data函數(shù),并確認(rèn)函數(shù)的執(zhí)行效果。

In[46]
def load_data():# 從文件導(dǎo)入數(shù)據(jù)datafile = './work/housing.data'data = np.fromfile(datafile, sep=' ')
<span class="hljs-comment"># 每條數(shù)據(jù)包括14項,其中前面13項是影響因素,第14項是相應(yīng)的房屋價格中位數(shù)</span>
feature_names = [ <span class="hljs-string">'CRIM'</span>, <span class="hljs-string">'ZN'</span>, <span class="hljs-string">'INDUS'</span>, <span class="hljs-string">'CHAS'</span>, <span class="hljs-string">'NOX'</span>, <span class="hljs-string">'RM'</span>, <span class="hljs-string">'AGE'</span>, \<span class="hljs-string">'DIS'</span>, <span class="hljs-string">'RAD'</span>, <span class="hljs-string">'TAX'</span>, <span class="hljs-string">'PTRATIO'</span>, <span class="hljs-string">'B'</span>, <span class="hljs-string">'LSTAT'</span>, <span class="hljs-string">'MEDV'</span> ]
feature_num = len(feature_names)<span class="hljs-comment"># 將原始數(shù)據(jù)進(jìn)行Reshape,變成[N, 14]這樣的形狀</span>
data = data.reshape([data.shape[<span class="hljs-number">0</span>] // feature_num, feature_num])<span class="hljs-comment"># 將原數(shù)據(jù)集拆分成訓(xùn)練集和測試集</span>
<span class="hljs-comment"># 這里使用80%的數(shù)據(jù)做訓(xùn)練,20%的數(shù)據(jù)做測試</span>
<span class="hljs-comment"># 測試集和訓(xùn)練集必須是沒有交集的</span>
ratio = <span class="hljs-number">0.8</span>
offset = int(data.shape[<span class="hljs-number">0</span>] * ratio)
training_data = data[:offset]<span class="hljs-comment"># 計算train數(shù)據(jù)集的最大值,最小值,平均值</span>
maximums, minimums, avgs = training_data.max(axis=<span class="hljs-number">0</span>), training_data.min(axis=<span class="hljs-number">0</span>), \training_data.sum(axis=<span class="hljs-number">0</span>) / training_data.shape[<span class="hljs-number">0</span>]<span class="hljs-comment"># 對數(shù)據(jù)進(jìn)行歸一化處理</span>
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> range(feature_num):<span class="hljs-comment">#print(maximums[i], minimums[i], avgs[i])</span>data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])<span class="hljs-comment"># 訓(xùn)練集和測試集的劃分比例</span>
training_data = data[:offset]
test_data = data[offset:]
<span class="hljs-keyword">return</span> training_data, test_data</code></pre></div></div></div></div><div><div class="cc cc-container"><div class="cc-aside"><div class="cc-in">In[7]</div></div><div class="cc-main"><div class="cc-output"><pre><code class="hljs"><span class="hljs-comment"># 獲取數(shù)據(jù)</span>

training_data, test_data = load_data()
x = training_data[:, :-1]
y = training_data[:, -1:]

In[8]
# 查看數(shù)據(jù)
print(x[0])
print(y[0])
[-0.02146321  0.03767327 -0.28552309 -0.08663366  0.01289726  0.04634817
0.00795597 -0.00765794 -0.25172191 -0.11881188 -0.29002528 0.0519112
-0.17590923]
[-0.00390539]

如果將輸入特征和輸出預(yù)測值均以向量表示,輸入特征x一共有13個分量,y只有1個分量,所以參數(shù)權(quán)重的形狀(shape)應(yīng)該是13×113\times113×1。假設(shè)我們以如下任意數(shù)字賦值參數(shù)做初始化:
w=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,?0.1,?0.2,?0.3,?0.4,0.0]w=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, -0.1, -0.2, -0.3,-0.4, 0.0]w=[0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,?0.1,?0.2,?0.3?0.4,0.0]

In[9]
w = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, -0.1, -0.2, -0.3, -0.4, 0.0]
w = np.array(w).reshape([13, 1])

取出第1條樣本數(shù)據(jù),觀察樣本的特征向量與參數(shù)向量相乘之后的結(jié)果。

In[10]
x1=x[0]
t = np.dot(x1, w)
print(t)
[0.03395597]

此外,完整的線性回歸公式,還需要初始化偏移量bbb,同樣隨意賦初值-0.2。 那么,線性回歸模型的完整輸出是z=t+bz=t+bz=t+b,這個從特征和參數(shù)計算輸出值的過程稱為“前向計算”。

In[11]
b = -0.2
z = t + b
print(z)
[-0.16604403]

構(gòu)建神經(jīng)網(wǎng)絡(luò)

將上述計算預(yù)測輸出的過程以“類和對象”的方式來描述,實現(xiàn)的方案如下所示。類成員變量有參數(shù) w 和 b,并寫了一個forward函數(shù)(代表“前向計算”)完成上述從特征和參數(shù)到輸出預(yù)測值的計算過程。

In[1]
class Network(object):def __init__(self, num_of_weights):# 隨機(jī)產(chǎn)生w的初始值# 為了保持程序每次運(yùn)行結(jié)果的一致性,# 此處設(shè)置固定的隨機(jī)數(shù)種子np.random.seed(0)self.w = np.random.randn(num_of_weights, 1)self.b = 0.
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, x)</span>:</span>z = np.dot(x, self.w) + self.b<span class="hljs-keyword">return</span> z</code></pre></div></div></div></div><div class="mc mc-container"><div class="mc-aside"></div><div class="mc-main"><div class="mc-preview"><p>基于Network類的定義,模型的計算過程可以按下述方式達(dá)成。</p>
In[13]
net = Network(13)
x1 = x[0]
y1 = y[0]
z = net.forward(x1)
print(z)
[-0.63182506]

通過模型計算x1x_1x1?表示的影響因素所對應(yīng)的房價應(yīng)該是zzz, 但實際數(shù)據(jù)告訴我們房價是yyy,這時我們需要有某種指標(biāo)來衡量預(yù)測值zzz跟真實值yyy之間的差距。對于回歸問題,最常采用的衡量方法是使用均方誤差作為評價模型好壞的指標(biāo),具體定義如下:

Loss=(y?z)2Loss = (y - z)^2 Loss=(y?z)2

上式中的LossLossLoss(簡記為: LLL) 通常也被稱作損失函數(shù),它是衡量模型好壞的指標(biāo),在回歸問題中均方誤差是一種比較常見的形式,分類問題中通常會采用交叉熵?fù)p失函數(shù),在后續(xù)的章節(jié)中會更詳細(xì)的介紹。 對一個樣本計算損失的代碼實現(xiàn)如下:

In[15]
Loss = (y1 - z)*(y1 - z)
print(Loss)
[0.39428312]

因為計算損失時需要把每個樣本的損失都考慮到,所以我們需要對單個樣本的損失函數(shù)進(jìn)行求和,并除以樣本總數(shù)NNN

L=1N∑i(y(i)?z(i))2L= \frac{1}{N}\sum_i{(y^{(i)} - z^{(i)})^2} L=N1?i?(y(i)?z(i))2

對上面的計算代碼做出相應(yīng)的調(diào)整,在Network類下面添加損失函數(shù)的計算過程如下

In[16]
class Network(object):def __init__(self, num_of_weights):# 隨機(jī)產(chǎn)生w的初始值# 為了保持程序每次運(yùn)行結(jié)果的一致性,此處設(shè)置固定的隨機(jī)數(shù)種子np.random.seed(0)self.w = np.random.randn(num_of_weights, 1)self.b = 0.
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">forward</span><span class="hljs-params">(self, x)</span>:</span>z = np.dot(x, self.w) + self.b<span class="hljs-keyword">return</span> z<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">loss</span><span class="hljs-params">(self, z, y)</span>:</span>error = z - ycost = error * errorcost = np.mean(cost)<span class="hljs-keyword">return</span> cost

使用上面定義的Network類,可以方便的計算預(yù)測值和損失函數(shù)。
需要注意,類中的變量x, w,b, z, error等均是向量。以變量x為例,共有兩個維度,一個代表特征數(shù)量(=13),一個代表樣本數(shù)量(演示程序如下)。

In[17]
net = Network(13)
# 此處可以一次性計算多個樣本的預(yù)測值和損失函數(shù)
x1 = x[0:3]
y1 = y[0:3]
z = net.forward(x1)
print('predict: ', z)
loss = net.loss(z, y1)
print('loss:', loss)
predict:  [[-0.63182506][-0.55793096][-1.00062009]]
loss: 0.7229825055441156

神經(jīng)網(wǎng)絡(luò)的訓(xùn)練

上述計算過程描述了如何構(gòu)建神經(jīng)網(wǎng)絡(luò),通過神經(jīng)網(wǎng)絡(luò)完成預(yù)測值和損失函數(shù)的計算。接下來將介紹如何求解參數(shù)wwwbbb的數(shù)值,這個過程也稱為模型訓(xùn)練。模型訓(xùn)練的目標(biāo)是讓定義的損失函數(shù)盡可能的小,也就是說找到一個參數(shù)解wwwbbb使得損失函數(shù)取得極小值。

求解損失函數(shù)的極小值

基于最基本的微積分知識,函數(shù)在極值點(diǎn)處的導(dǎo)數(shù)為0。那么,讓損失函數(shù)取極小值的wwwbbb應(yīng)該是下述方程組的解:

?L?wj=0,??for???j=0,...,12\frac{\partial{L}}{\partial{w_j}}=0, \ \ for \ \ \ j = 0, ..., 12 ?wj??L?=0,??for???j=0,...,12

?L?b=0\frac{\partial{L}}{\partial}=0 ?b?L?=0

將樣本數(shù)據(jù)(x,y)(x, y)(x,y)帶入上面的方程組固然可以求解出wwwbbb的值,但是這種方法只對線性回歸這樣簡單的情況有效。如果模型中含有非線性變換,或者損失函數(shù)不是均方差這種簡單形式,則很難通過上式求解。為了避免這一情況,下面我們將引入更加普適的數(shù)值求解方法。

梯度下降法

訓(xùn)練的關(guān)鍵是找到一組(w,b)(w, b)(w,b)使得損失函數(shù)LLL取極小值。我們先看一下?lián)p失函數(shù)LLL只隨兩個參數(shù)變化時的簡單情形,啟發(fā)下尋解的思路。

L=L(w5,w9)L=L(w_5, w_9) L=L(w5?,w9?)

這里我們將w0,w1,...,w12w_0, w_1, ..., w_{12}w0?,w1?,...,w12?中除w5,w9w_5, w_9w5?,w9?之外的參數(shù)和bbb都固定下來,可以用圖畫出L(w5,w9)L(w_5, w_9)L(w5?,w9?)的形式。

In[19]
net = Network(13)
losses = []
#只畫出參數(shù)w5和w9在區(qū)間[-160, 160]的曲線部分,已經(jīng)包含損失函數(shù)的極值
w5 = np.arange(-160.0, 160.0, 1.0)
w9 = np.arange(-160.0, 160.0, 1.0)
losses = np.zeros([len(w5), len(w9)])

#計算設(shè)定區(qū)域內(nèi)每個參數(shù)取值所對應(yīng)的Loss
for i in range(len(w5)):
for j in range(len(w9)):
net.w[5] = w5[i]
net.w[9] = w9[j]
z = net.forward(x)
loss = net.loss(z, y)
losses[i, j] = loss

#將兩個變量和對應(yīng)的Loss作3D圖
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = Axes3D(fig)

w5, w9 = np.meshgrid(w5, w9)

ax.plot_surface(w5, w9, losses, rstride=1, cstride=1, cmap=‘rainbow’)
plt.show()

簡單情形——只考慮兩個參數(shù)w5w_5w5?w9w_9w9?

對于這種簡單情形,我們利用上面的程序在3維空間中畫出了損失函數(shù)隨參數(shù)變化的曲面圖,從上圖可以看出有些區(qū)域的函數(shù)值明顯比周圍的點(diǎn)小。需要說明的是:為什么這里我們選擇w5w_5w5?w9w_9w9?來畫圖?這是因為選擇這兩個參數(shù)的時候,可比較直觀的從損失函數(shù)的曲面圖上發(fā)現(xiàn)極值點(diǎn)的存在。其他參數(shù)組合,從圖形上觀測損失函數(shù)的極值點(diǎn)不夠直觀。

上文提到,直接求解導(dǎo)數(shù)方程的方式在多數(shù)情況下較困難,本質(zhì)原因是導(dǎo)數(shù)方程往往正向求解容易(已知X,求得Y),反向求解較難(已知Y,求得X)。這種特性的方程在很多加密算法中較為常見,與日常見到的鎖頭特性一樣:已知“鑰匙”,鎖頭判斷是否正確容易;已知“鎖頭”,反推鑰匙的形狀比較難。

這種情況特別類似于一位想從山峰走到坡谷的盲人,他看不見坡谷在哪(無法逆向求解出Loss導(dǎo)數(shù)為0時的參數(shù)值),但可以伸腳探索身邊的坡度(當(dāng)前點(diǎn)的導(dǎo)數(shù)值,也稱為梯度)。那么,求解Loss函數(shù)最小值可以“從當(dāng)前的參數(shù)取值,一步步的按照下坡的方向下降,直到走到最低點(diǎn)”實現(xiàn)。這種方法個人稱它為“瞎子下坡法”。哦不,有個更正式的說法“梯度下降法”。

現(xiàn)在我們要找出一組[w5,w9][w_5, w_9][w5?,w9?]的值,使得損失函數(shù)最小,實現(xiàn)梯度下降法的方案如下:

  • 隨機(jī)的選一組初始值,例如: [w5,w9]=[?100.0,?100.0][w_5, w_9] = [-100.0, -100.0][w5?,w9?]=[?100.0,?100.0]
  • 選取下一個點(diǎn)[w5′,w9′][w_5^{'} , w_9^{'}][w5?,w9?]使得 L(w5′,w9′)<L(w5,w9)L(w_5^{'} , w_9^{'}) < L(w_5, w_9)L(w5?,w9?)<L(w5?,w9?)
  • 重復(fù)上面的步驟2,直到損失函數(shù)幾乎不再下降

圖1-2-1 :梯度下降方向示意圖

如何選擇[w5′,w9′][w_5^{'} , w_9^{'}][w5?,w9?]是至關(guān)重要的,第一要保證LLL是下降的,第二要使得下降的趨勢盡可能的快。微積分的基礎(chǔ)知識告訴我們,沿著梯度的反方向,是函數(shù)值下降最快的方向,如下圖所示在點(diǎn)P0P_0P0?[w5,w9]=[?100.0,?100.0][w_5, w_9] = [-100.0, -100.0][w5?,w9?]=[?100.0,?100.0],梯度方向是圖中P0P_0P0?點(diǎn)的箭頭指向的方向,沿著箭頭方向向前移動一小步,可以觀察損失函數(shù)的變化。 在P0P_0P0?點(diǎn),[w5,w9]=[?150.0,?150.0][w_5, w_9] = [-150.0, -150.0][w5?,w9?]=[?150.0,?150.0],可以計算出,此時的loss在1300左右。

計算梯度

上面我們講過了損失函數(shù)的計算方法,這里稍微加以改寫,引入因子12\frac{1}{2}21?,定義損失函數(shù)如下

L=12N∑i=1N(y(i)?z(i))2L= \frac{1}{2N}\sum_{i=1}^N{(y^{(i)} - z^{(i)})^2} L=2N1?i=1N?(y(i)?z(i))2

其中ziz_izi?是網(wǎng)絡(luò)對第iii個樣本的預(yù)測值

z(i)=∑j=012xj(i)w(j)+bz^{(i)} = \sum_{j=0}^{12}{x_j^{(i)} w^{(j)}} + b z(i)=j=012?xj(i)?w(j)+b

可以計算出LLLwwwbbb的偏導(dǎo)數(shù)

?L?wj=1N∑iN(z(i)?y(i))?z(i)wj=1N∑iN(z(i)?y(i))xj(i)\frac{\partial{L}}{\partial{w_j}} = \frac{1}{N}\sum_i^N{(z^{(i)} - y^{(i)})\frac{\partial{z^{(i)}}}{w_j}} = \frac{1}{N}\sum_i^N{(z^{(i)} - y^{(i)})x_j^{(i)}} ?wj??L?=N1?iN?(z(i)?y(i))wj??z(i)?=N1?iN?(z(i)?y(i))xj(i)?

?L?b=1N∑iN(z(i)?y(i))?z(i)b=1N∑iN(z(i)?y(i))\frac{\partial{L}}{\partial} = \frac{1}{N}\sum_i^N{(z^{(i)} - y^{(i)})\frac{\partial{z^{(i)}}}} = \frac{1}{N}\sum_i^N{(z^{(i)} - y^{(i)})} ?b?L?=N1?iN?(z(i)?y(i))b?z(i)?=N1?iN?(z(i)?y(i))

從導(dǎo)數(shù)的計算過程可以看出,因子12\frac{1}{2}21?被消掉了,這是因為二次函數(shù)求導(dǎo)的時候會產(chǎn)生因子222,這也是我們將損失函數(shù)改寫的原因

這里我們感興趣的是w5w_5w5?w9w_9w9?

?C?w5=1N∑iN(z(i)?y(i))x5(i)\frac{\partial{C}}{\partial{w_5}} = \frac{1}{N}\sum_i^N{(z^{(i)} - y^{(i)})x_5^{(i)}} ?w5??C?=N1?iN?(z(i)?y(i))x5(i)?

?C?w9=1N∑iN(z(i)?y(i))x9(i)\frac{\partial{C}}{\partial{w_9}} = \frac{1}{N}\sum_i^N{(z^{(i)} - y^{(i)})x_9^{(i)}} ?w9??C?=N1?i<

總結(jié)

以上是生活随笔為你收集整理的1-2 用Python编写【房价预测】模型----paddle的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。