Tensorflow 線性回歸預測房價實例

来源:http://www.cnblogs.com/vipyoumay/archive/2017/09/07/7488954.html
-Advertisement-
Play Games

在本節中將通過一個預測房屋價格的實例來講解利用線性回歸預測房屋價格,以及在tensorflow中如何實現 ...


在本節中將通過一個預測房屋價格的實例來講解利用線性回歸預測房屋價格,以及在tensorflow中如何實現

1.1. 準備工作

從網上得到的數據可以看到房屋價格與房屋尺寸的一個對比關係,如下圖:

2017-09-01-13-36-10

我們假設x軸(房屋尺寸)而Y軸(房屋價格)依據上表數據繪製折線圖

2017-09-01-13-37-04

現在我們使用簡單的線性模型來預測,

  • 紅線表述我們的預測曲線 : \[y_p=ax+b\]
  • 藍線表述房屋價格與尺寸的實際關係
  • 預測與實際的不同用黃線表示
    2017-09-01-13-39-58

接下來需要通過數據來找到a,b的最佳值從而使預測與實際的誤差最小。此次我們採用SSE(和方差)來判別誤差。該統計參數計算的是擬合數據和原始數據對應點的誤差的平方和,計算公式如下

\[\frac{1}{2}\sum_{k=1}^{n} \ {({y} -{y_p})^2}\]

在拿到原始的數據後,為方便運算,我們將數據進行歸一化處理,歸一化計算公式如下

\[\frac{x-x_{min}}{x_{max}-x_{min}}\]

1.2. 歸一化數據

我們將原始的數據進行歸一化處理,歸一化處理後的結果如圖:

2017-09-01-14-04-28


def normalize(arr):
    arr_min = np.min(arr)
    arr_max = np.max(arr)
    arr_out = []
    for item in arr:
        out = np.divide(np.subtract(item, arr_min), np.subtract(arr_max, arr_min))
        arr_out = np.append(arr_out, np.array(out))
    return arr_out

1.3. 用隨機的值填充a,b並計算誤差,誤差採用上文所使用SSE(和方差)

2017-09-01-14-07-11


def model(x, b, a):
    # linear regression is just b*x + a, so this model line is pretty simple
    return tf.multiply(x, b) + a

loss = tf.multiply(tf.square(Y - y_model), 0.5)

1.4. 計算誤差梯度

對sse分別求a,b的偏微分
\[\frac{\partial sse}{\partial a}\]
\[\frac{\partial sse}{\partial b}\]

2017-09-01-14-22-22

1.5. 調整參數直到SSE參數最小

2017-09-01-14-24-10

新 a = a – r * ∂SSE/∂a = 0.45-0.01*3.300 = 0.42

新 b = b – r * ∂SSE/∂b= 0.75-0.01*1.545 = 0.73

(r是學習率,表示調整的步長)


# construct an optimizer to minimize cost and fit line to mydata
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

然後再重覆上一步驟計算,直到所設定的次數完成

2017-09-01-14-26-44

for i in range(500):
    for (x, y) in zip(trX, trY):
        output = sess.run(train_op, feed_dict={X: x, Y: y})

通過剛纔幾步的組合,程式便能計算出最合適的a,b的值,完成代碼清單如下:

import tensorflow as tf
import numpy as np

sess = tf.Session()


# 線性模型 y=bx+a
def model(x, b, a):
    return tf.multiply(x, b) + a


# 歸一化函數
def normalize(arr):
    arr_min = np.min(arr)
    arr_max = np.max(arr)
    arr_out = []
    for item in arr:
        out = np.divide(np.subtract(item, arr_min), np.subtract(arr_max, arr_min))
        arr_out = np.append(arr_out, np.array(out))
    return arr_out

# 原始數據
trX_i = [1100., 1400., 1425., 1550., 1600., 1700., 1700., 1875., 2350., 2450.]
trY_i = [199000., 245000., 319000., 240000., 312000., 279000., 310000., 308000., 405000., 324000.]

# 數據歸一化
trX = normalize(trX_i)
trY = normalize(trY_i)

X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)

# 設一個權重變數b,和一個偏差變數a
b = tf.Variable(0.0, name="weights")
# create a variable for biases
a = tf.Variable(0.0, name="biases")
y_model = model(X, b, a)

# 損失函數
loss = tf.multiply(tf.square(Y - y_model), 0.5)

# 梯度下降
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)

init = tf.global_variables_initializer()
sess.run(init)

# 訓練數據
for i in range(500):
    for (x, y) in zip(trX, trY):
        output = sess.run(train_op, feed_dict={X: x, Y: y})

print('b:' + str(sess.run(b)) + ' || a:' + str(sess.run(a)))


---result

b:0.682465 || a:0.1512

1.6. 概念

1.6.1. 簡單線性回歸

在房價預測例子中,我們發現房價數據呈一種比較明顯的線性關係,那麼自然我們可能會選擇簡單線性回歸對數據進行擬合,首先從線性模型著手:
\[y_p=ax+b\]
從上面的二元一次方程看出,我們的輸入x是已知向量,只要我們求出a,b的值,就能通過上述公式進行房價預測了,這就是簡單線性回歸的思想。

1.6.2. 梯度下降

梯度

如上一節中講的我們需要找出SSE最小化時的a,b的值,採用的這種方法就叫做梯度下降。梯度下降不僅僅局限於最小化這個函數,也可能根據實際情況需要最大化某個函數,這種情況叫做梯度上升。單純從數學上講,對一個函數來說,梯度表示某個向量的偏導數,同時還代表了該向量的方向,在這個方向上,函數增加得最快,在相反的方向上,函數減小得最快。
利用梯度這一性質,我們採用梯度下降演算法去最小化我們的損失函數,我們在梯度的反方向跨域一小步,再從一個新起點開始重覆這個過程,直到我們找到損失函數的最小值,最後確定我們的a, b值。
我們需要最小化的函數為(又稱為損失函數):
\[sse=\frac{1}{2}\sum_{k=1}^{n} \ {({y} -{y_p})^2}=\frac{1}{2}\sum_{k=1}^{n} \ {(y_k-ax_k-b)^2}\]
對a,b分別求偏導,並令偏導等於0:
\[\frac{\partial sse}{\partial a}=- \sum_{k=1}^n \ x_k(y_k-ax_k-b) \ =0\]
\[\frac{\partial sse}{\partial b}=- \sum_{k=1}^n \ (y_k-ax_k-b) =0\]
最後,輸入已知的xy值(均為向量),解兩個一次方程就計算出a,b的確切值。

步長

為了求SSE的最小值,我們需要向梯度相反的方法移動,每移動一步,梯度逐漸降低,但是移動多少才合適呢,這需要我們謹慎的選擇步長。目前,主流的選擇方法有:
• 使用固定步長
• 隨時間增長逐步減小步長
• 在每一步中通過最小化目標函數的值來選擇合適的步長
在上一例子中,我們選擇固定步長r=0.01,其實,最後一種方法很好,但它的計算代價很大。我們還可以嘗試一系列步長,並選出使目標函數值最小的那個步長來求其近似值。
stepSizes=[10, 1, 0.1, 0.01, 0.001]

1.6.3 損失函數

損失函數是用來評價模型的預測值與真實值的不一致程度,它是一個非負實值函數。通常使用L(Y,f(x))來表示,損失函數越小,模型的性能就越好。
在預測房價的例子中,我們使用了和方差來計算誤差,並把該函數稱為損失函數,即計算實際值和預測值的誤差平方和。為什麼要選擇這一函數來計算誤差,而不採用絕對值誤差,或誤差的三次方,四次方來定義誤差函數是因為:

  1. 相對於絕對值誤差,誤差平方和計算更加方便。
  2. 這裡的損失函數使用的是“最小二乘法”的思想,假定我們的誤差滿足均值為0的高斯分佈,這樣符合一般的統計規律,然後根據最大似然函數估計進行推導,就得出了求導結果,平方和最小公式:
    \[sse=\frac{1}{2}\sum_{k=1}^{n} \ {({y} -{y_p})^2}\]

除上面提到的損失函數外,還有其他的一些常見的損失函數:

0-1 Loss

如果預測值與標值不等,則記為1;如果相等,則標記為0
\[L(Y, f(x)) = \left\{ \begin{array}{ll} 1 & \textrm{$Y\neq f(x)$}\\ 0 & \textrm{$Y= f(x)$} \end{array} \right. \]

Log對數損失函數

在邏輯回歸中損失函數的推導是假設樣本服從伯努利分佈(0-1分佈),然後求滿足該分佈的似然函數,最後推導出順勢函數的公式為:\[L(Y,P(Y|X)) = -logP(Y|X)\]

指數損失函數

出現在Adaboost演算法中
\[L(y,f(x))=\frac{1}{n}\sum_{i=1}^{n}\ {exp[-y_if(x_i)]}\]

Hinge損失函數

線上性支持向量機中,Hinge的損失函數標準形式為:
\[L(y)=\frac{1}{n}\sum_{i=1}^{n}\ {l(wx_i+by_i)}\]

絕對值損失函數

\[L(y,f(x))=|Y-f(x)|\]

1.6.4 特征歸一化

對於多屬性的樣本,我們在做分類預測的時候,應該把每個屬性看作同等重要,不能讓某個屬性的計算結果嚴重影響模型的預測結果。例如,以下有一個樣本數據:

玩游戲所耗時間百分比 描述每年獲得的飛行常客里程數 每周消費的冰淇淋公升數
0.8 400 0.5
12 134000 0.9
0 20000 1.1
67 32000 0.1

如果我們採用KNN演算法做分類預測,在計算歐式距離的時候,比如計算樣本3和樣本4之間的距離,很明顯我們發現每年獲得的飛行常客里程數由於本身數值很大,其計算結果的影響將遠遠大於其他兩個特征值的影響,對於三個等權重的特征之一,我們不能讓它嚴重的影響計算結果,所以,我們通常會採用特征歸一化的方法把值處理為0到1或者-1到1之間。
\[\sqrt{(0-67)^2+(20000-32000)^2+(1.1-0.1)^2}\]
即上面提到的公式:
\[\frac{x-x_{min}}{x_{max}-x_{min}}\]
其中\(x_{min}\)\(x_{max}\)是特征向量x的最小值和最大值,這樣通過對每個特征向量進行歸一化處理,所有特征值的計算都統一了,而計算得到的結果就更加準確。
在之前預測房價的例子中,我們對已有的特征向量,即房屋大小和實際價格做了歸一化處理,即便是只有一個特征向量,我們仍然需要這樣做,其目的與上面的樣本數據一樣,比如假設我們需要在該房屋預測中增加房間數量或房屋年齡等特征進行房屋價格預測,我們都可以採用同一類方法進行處理,以減少各特征值對計算結果的影響。


參考鏈接

【1】:http://www.kdnuggets.com/2017/04/simple-understand-gradient-descent-algorithm.html

作者:帥蟲哥 出處: http://www.cnblogs.com/vipyoumay/p/7488954.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 SELECT * from (SELECT * FROM dbo.xcqy2017_Article WHERE Kind=53) AS t1 2 LEFT JOIN (SELECT * FROM dbo.xcqy2017_News_Classification) AS t2 ON t2.Ncid ...
  • 1、比方現在有兩張表“分類表”和“商品表”,為了表明商品屬於哪個分類,通常我們將在商品表上添加一列,用於存放分類cid的信息,此列稱為:外鍵。 此時分類表category稱為主表,cid稱為主鍵;商品表products稱為從表,category_id稱為外鍵。 外鍵特點:1)從表外鍵的值是對主表主鍵 ...
  • query($sql); return $res; } ?> ...
  • 數據類型 數據類型 1、從數據表的優化層面考慮,我們有必要知道一個數據所占空間的大小,那麼如何查看數據所占空間的大小呢? 兩個函數可以查看數據所占空間: --查看所占位元組數使用length()函數 select length('你好,世界') from dual; --其中dual是一個虛表 --查 ...
  • 第二章:用戶與許可權 本章目標 瞭解Oracle資料庫中用戶的含義 掌握資料庫中用戶的用戶以及如何創建用戶 瞭解profile數據文件的創建與使用 掌握創建用戶以及對用戶的管理 掌握系統許可權與對象許可權的管理 瞭解角色的創建以及它的許可權管理 Oracle預設用戶有哪幾個? 兩個: sys和system ...
  • 函數整理(T-SQL 版) 一、數學函數 1.求絕對值 ABS() 函數用來返回一個數值的絕對值。 2.求指數 POWER() 函數是用來計算指數的函數。該函數接受兩個參數,第一個參數為待求冪的表達式,第二個參數為冪。 3.求平方根 SQRT() 函數是用來計算平方根的函數。該函數接受一個參數,這個 ...
  • 資料庫查詢優化 1.使用索引 應儘量避免全表掃描,首先應考慮在 where 及 order by ,group by 涉及的列上建立索引。 2.優化sql語句 通過 explain(查詢優化神器)用來查看 SQL 語句的執行效果, 可以幫助選擇更好的索引和優化查詢語句,寫出更好的優化語句。 任何地方 ...
  • Oracle第二章:用戶與許可權 用戶 安裝完Oracle,Oracle預設有兩個用戶: 1、sys用戶,又叫資料庫系統管理員、特權用戶,該數據的地位至高無上。 它是資料庫的系統管理員,負責資料庫的安裝、維護、升級、備份、恢復、優化等操作 在sys用戶之下,保存著資料庫所有的系統字典。 不能用norm ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...