運(yùn)用TensorFlow進(jìn)行簡(jiǎn)單實(shí)現(xiàn)線性回歸、梯度下降示例
線性回歸屬于監(jiān)督學(xué)習(xí),因此方法和監(jiān)督學(xué)習(xí)應(yīng)該是一樣的,先給定一個(gè)訓(xùn)練集,根據(jù)這個(gè)訓(xùn)練集學(xué)習(xí)出一個(gè)線性函數(shù),然后測(cè)試這個(gè)函數(shù)訓(xùn)練的好不好(即此函數(shù)是否足夠擬合訓(xùn)練集數(shù)據(jù)),挑選出最好的函數(shù)(cost function最小)即可。
單變量線性回歸:
a) 因?yàn)槭蔷€性回歸,所以學(xué)習(xí)到的函數(shù)為線性函數(shù),即直線函數(shù);
b) 因?yàn)槭菃巫兞?,因此只有一個(gè)x。
我們能夠給出單變量線性回歸的模型:
我們常稱(chēng)x為feature,h(x)為hypothesis。
上面介紹的方法中,我們肯定有一個(gè)疑問(wèn),怎樣能夠看出線性函數(shù)擬合的好不好呢?
所以此處,我們需要使用到Cost Function(代價(jià)函數(shù)),代價(jià)函數(shù)越小,說(shuō)明線性回歸也越好(和訓(xùn)練集合擬合的越好),當(dāng)然最小就是0,即完全擬合。
舉個(gè)實(shí)際的例子:
我們想要根據(jù)房子的大小,預(yù)測(cè)房子的價(jià)格,給定如下數(shù)據(jù)集:
根據(jù)上面的數(shù)據(jù)集,畫(huà)出如下所示的圖:
我們需要根據(jù)這些點(diǎn)擬合出一條直線,使得Cost Function最小。雖然現(xiàn)在我們還不知道Cost Function內(nèi)部到底是什么樣的,但是我們的目標(biāo)是:給定輸入向量x,輸出向量y,theta向量,輸出Cost值。
Cost Function:
Cost Function的用途:對(duì)假設(shè)的函數(shù)進(jìn)行評(píng)價(jià),Cost Function越小的函數(shù),說(shuō)明對(duì)訓(xùn)練數(shù)據(jù)擬合的越好。
下圖詳細(xì)說(shuō)明了當(dāng)Cost Function為黑盒的時(shí)候,Cost Function的作用:
但是我們肯定想知道Cost Function的內(nèi)部結(jié)構(gòu)是什么?因此我們給出下面的公式:
其中:
表示向量x中的第i個(gè)元素;
表示向量y中的第i個(gè)元素;
表示已知的假設(shè)函數(shù);m表示訓(xùn)練集的數(shù)量。
如果theta0一直為0,則theta1與J的函數(shù)為:
如果theta0和theta1都不固定,則theta0、theta1、J的函數(shù)為:
當(dāng)然我們也能夠用二維的圖來(lái)表示,即等高線圖:
注意如果是線性回歸,則cost function一定是碗狀的,即只有一個(gè)最小點(diǎn)。
Gradient Descent(梯度下降):
但是又一個(gè)問(wèn)題引出來(lái)了,雖然給定一個(gè)函數(shù),我們能夠根據(jù)cost function知道這個(gè)函數(shù)擬合的好不好,但是畢竟函數(shù)有這么多,總不能一個(gè)一個(gè)試吧?
于是我們引出了梯度下降:能夠找出cost function函數(shù)的最小值。(當(dāng)然解決問(wèn)題的方法有很多,梯度下降只是其中一個(gè),還有一種方法叫Normal Equation)。
梯度下降的原理:將函數(shù)比作一座山,我們站在某個(gè)山坡上,往四周看,從哪個(gè)方向向下走一小步,能夠下降的最快。
方法:
a) 先確定向下一步的步伐大小,我們稱(chēng)為learning rate;
b) 任意給定一個(gè)初始值:和
;
c) 確定一個(gè)向下的方向,并向下走預(yù)定的步伐,并更新和
;
d) 當(dāng)下降的高度小于某個(gè)定義的值,則停止下降。
算法:
特點(diǎn):
a)初始點(diǎn)不同,獲得的最小值也不同,因此梯度下降求得的只是局部最小值;
b)越接近最小值,下降速度越慢。
問(wèn)題1:如果和
初始值就在local minimum的位置,則
、
會(huì)如何變化?
答案:因?yàn)?img alt="" align="middle" src="http://img.jbzj.com/file_images/article/201803/2018030510045628.png" />、已經(jīng)在local minimum位置,所以derivative肯定是0,因此
、
不會(huì)改變。
問(wèn)題2:如果取到一個(gè)正確的值,則cost function應(yīng)該會(huì)越來(lái)越小。那么,怎么取
值?
答案:隨時(shí)觀察值,如果cost function變小了,則OK;反之,則再取一個(gè)更小的值。
下圖就詳細(xì)說(shuō)明了梯度下降的過(guò)程:
從上圖中可以看出:初始點(diǎn)不同,獲得的最小值也不同,因此,梯度下降求得的只是局部最小值。
注意:下降的步伐大小非常重要,因?yàn)?,如果太小,則找到函數(shù)最小值的速度就很慢;如果太大,則可能會(huì)出現(xiàn)overshoot the minimum現(xiàn)象。
下圖就是overshoot現(xiàn)象:
如果Learning Rate取值后發(fā)現(xiàn)J function增長(zhǎng)了,則需要減小Learning Rate的值。
Integrating with Gradient Descent & Linear Regression:
梯度下降能夠求出一個(gè)函數(shù)的最小值。
線性回歸需要求得最小的Cost Function。
因此我們能夠?qū)ost Function運(yùn)用梯度下降,即將梯度下降和線性回歸進(jìn)行整合,如下圖所示:
梯度下降是通過(guò)不停的迭代,而我們比較關(guān)注迭代的次數(shù),因?yàn)檫@關(guān)系到梯度下降的執(zhí)行速度,為了減少迭代次數(shù),因此引入了Feature Scaling。
Feature Scaling:
此種方法應(yīng)用于梯度下降,為了加快梯度下降的執(zhí)行速度。
思想:將各個(gè)feature的值標(biāo)準(zhǔn)化,使得取值范圍大致都在-1<=x<=1之間。
常用的方法是Mean Normalization,即,或者[X-mean(X)]/std(X)。
練習(xí)題
我們想要通過(guò)期中考試成績(jī)預(yù)測(cè)期末考試成績(jī),我們希望得到的方程為:
給定以下訓(xùn)練集:
我們想對(duì)(midterm exam)^2進(jìn)行feature scaling,則經(jīng)過(guò)feature scaling后的值為多少?
解答:其中max = 8836,min = 4761,mean = 6675.5,則 = (4761 - 6675.5)/(8836 - 4761) = -0.47 。
多變量線性回歸
前面我們只介紹了單變量的線性回歸,即只有一個(gè)輸入變量,現(xiàn)實(shí)世界可不只是這么簡(jiǎn)單,因此此處我們要介紹多變量的線性回歸。
舉個(gè)例子:房?jī)r(jià)其實(shí)受很多因素決定,比如size、number of bedrooms、number of floors、age of home等,這里我們假設(shè)房?jī)r(jià)由4個(gè)因素決定,如下圖所示:
我們前面定義過(guò)單變量線性回歸的模型:
這里我們可以定義出多變量線性回歸的模型:
Cost Function如下:
如果下面我們要用梯度下降解決多變量的線性回歸,則我們還是可以用傳統(tǒng)的梯度下降算法進(jìn)行計(jì)算:
總練習(xí)題
我們想要根據(jù)一個(gè)學(xué)生第一年的成績(jī)預(yù)測(cè)第二年的成績(jī),x為第一年得到A的數(shù)量,y為第二年得到A的數(shù)量,給定以下數(shù)據(jù)集:
(1) 訓(xùn)練集的個(gè)數(shù)?
答:4個(gè)。
(2) J(0, 1)的結(jié)果是多少?
解:J(0,1) = 1/(2*4)*[(3-4)^2+(2-1)^2+(4-3)^2+(0-1)^2] = 1/8*(1+1+1+1) = 1/2 = 0.5。
我們也可以通過(guò)vectorization的方法快速算出J(0, 1):
下面是通過(guò)TensorFlow進(jìn)行簡(jiǎn)單的實(shí)現(xiàn):
#!/usr/bin/env python from __future__ import print_function import tensorflow as tf import numpy as np trX = np.linspace(-1, 1, 101) # create a y value which is approximately linear but with some random noise trY = 2 * trX + \ np.ones(*trX.shape) * 4 + \ np.random.randn(*trX.shape) * 0.03 X = tf.placeholder(tf.float32) # create symbolic variables Y = tf.placeholder(tf.float32) def model(X, w, b): # linear regression is just X*w + b, so this model line is pretty simple return tf.mul(X, w) + b # create a shared for weight s w = tf.Variable(0.0, name="weights") # create a variable for biases b = tf.Variable(0.0, name="biases") y_model = model(X, w, b) cost = tf.square(Y - y_model) # use square error for cost function # construct an optimizer to minimize cost and fit line to mydata train_op = tf.train.GradientDescentOptimizer(0.01).minimize(cost) # launch the graph in a session with tf.Session() as sess: # you need to initialize variables (in this case just variable w) init = tf.initialize_all_variables() sess.run(init) # train for i in range(100): for (x, y) in zip(trX, trY): sess.run(train_op, feed_dict={X: x, Y: y}) # print weight print(sess.run(w)) # it should be something around 2 # print bias print(sess.run(b)) # it should be something atound 4
參考:
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- TensorFlow神經(jīng)網(wǎng)絡(luò)構(gòu)造線性回歸模型示例教程
- 詳解TensorFlow2實(shí)現(xiàn)線性回歸
- tensorflow基本操作小白快速構(gòu)建線性回歸和分類(lèi)模型
- Tensorflow實(shí)現(xiàn)神經(jīng)網(wǎng)絡(luò)擬合線性回歸
- 使用TensorFlow實(shí)現(xiàn)簡(jiǎn)單線性回歸模型
- 使用tensorflow實(shí)現(xiàn)線性回歸
- Tensorflow使用支持向量機(jī)擬合線性回歸
- TensorFlow實(shí)現(xiàn)iris數(shù)據(jù)集線性回歸
- 用tensorflow構(gòu)建線性回歸模型的示例代碼
- TensorFlow實(shí)現(xiàn)簡(jiǎn)單線性回歸
相關(guān)文章
Scrapy啟動(dòng)報(bào)錯(cuò)invalid syntax的解決
這篇文章主要介紹了Scrapy啟動(dòng)報(bào)錯(cuò)invalid syntax的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Python解決%matplotlib inline標(biāo)紅底報(bào)錯(cuò)問(wèn)題
在使用非Jupyter環(huán)境如Spyder或PyCharm時(shí),%matplotlib inline會(huì)因?yàn)槭荍upyter特有的魔法命令而導(dǎo)致報(bào)錯(cuò),這條命令是用于Jupyter Notebook或Jupyter Qt Console中,主要作用是將matplotlib的圖表直接嵌入到Notebook中顯示2024-09-09使用django-suit為django 1.7 admin后臺(tái)添加模板
前面我們介紹了Django-grappelli給admin添加模板,可是使用中發(fā)現(xiàn)inline有點(diǎn)問(wèn)題,所以就換了今天我們要談的Django-suit,貌似要稍微好一些2014-11-11python實(shí)現(xiàn)二次元圖片展示(屏保)
這篇文章主要介紹了python實(shí)現(xiàn)二次元圖片展示,用了API端口相關(guān)的知識(shí)實(shí)現(xiàn),下面詳細(xì)的文章內(nèi)容需要的小伙伴可以參考一下2022-02-02Python?生成多行重復(fù)數(shù)據(jù)的方法實(shí)現(xiàn)
本文主要介紹了Python?生成多行重復(fù)數(shù)據(jù)的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03虛擬環(huán)境下搭建一個(gè)Django項(xiàng)目
這篇文章主要為大家介紹了虛擬環(huán)境下搭建一個(gè)Django項(xiàng)目的實(shí)現(xiàn)過(guò)程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05如何利用Python解析超大的json數(shù)據(jù)(GB級(jí)別)
果不想從頭開(kāi)始創(chuàng)建數(shù)據(jù)格式來(lái)存儲(chǔ)數(shù)據(jù),JSON是一個(gè)不錯(cuò)的選擇,下面這篇文章主要給大家介紹了關(guān)于如何利用Python解析超大的json數(shù)據(jù)(GB級(jí)別)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07