使用tensorflow的線性回歸的例子(四)

與經典線性回歸比較

import matplotlib.pyplot as plt

%matplotlib inline

import tensorflow as tf

import numpy as np

from sklearn.linear_model import LinearRegression

#from sklearn.datasets.samples_generator import make_regression

Xdata = np.array([4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0])

Ydata = np.array([33, 42, 45, 51, 53, 61, 62])

plt.figure(figsize=(8,5))

plt.scatter(Xdata,Ydata, s = 80)

plt.xlabel('x', fontsize= 16)

plt.tick_params(labelsize=16)

這些點看來在一條直線上,因此線性回歸可能有用。

構建階段

這些點看來在一條直線上,因此線性回歸可能有用。

構建階段

我們來構建神經網絡。它只有一個神經元,使用線性激活函數。

#定義模型函數

def model(x,w,b):

??? return tf.multiply(x,w)+b

def loss_fun(x,y,w,b):

??? err = model(x,w,b)-y

??? squared_err = tf.square(err)

??? return tf.reduce_mean(squared_err)

def grad(x,y,w,b):

??? with tf.GradientTape() as tape:

??????? loss_ = loss_fun(x,y,w,b)

??? return tape.gradient(loss_,[w,b])

需要一些額外的節點:

  • 損失函數?J
  • 使損失函數最小的節點

改變數據集的形狀

我們然望?X?和?Y?是一行的張量。我們可以檢查一下

print(Xdata.shape)

print(Ydata.shape)

這不是我們想要的,所以我們要改變它們

x = Xdata.reshape(1,-1)

y = Ydata.reshape(1,-1)

print(x.shape)

print(y.shape)

現在更好了... 為了檢查不同的學習速率我們可以定義函數進行訓練

def run_linear_model(learning_rate, train_epochs, x,y, debug = False):???

??? #開始訓練,輪數為epoch,采用SGD隨機梯度下降優化方法

? w = tf.Variable(np.random.randn(),tf.float32)

? b = tf.Variable(0.0,tf.float32)

? #count = tf.Variable(0.0,tf.float32)

??? #開始訓練,輪數為epoch,采用SGD隨機梯度下降優化方法

? loss = []

? count = 0

? display_count = 10 #控制顯示粒度的參數,每訓練10個樣本輸出一次損失值

? for epoch in range(train_epochs):

??? for xs,ys in zip(x,y):? #for xs,ys in zip(x_data,y_data):

??????? #計算損失,并保存本次損失計算結果

??????? loss_ =loss_fun(xs,ys,w,b)

??????? loss.append(loss_)

??????? #計算當前[w,b]的梯度

??????? delta_w,delta_b = grad(xs,ys,w,b)

??????? change_w = delta_w * learning_rate

??????? change_b = delta_b * learning_rate

??????? w.assign_sub(change_w)

??????? b.assign_sub(change_b)

??????? #訓練步數加1

??????? count = count +1

??????? if count % display_count == 0:

??????????? print('train epoch : ','%02d'%(epoch+1),'step:%03d' % (count),'loss= ','{:.9f}'.format(loss_))

?????? #完成一輪訓練后,畫圖

??? #plt.plot(x,w.numpy() * x +b.numpy())?? #plt.plot(x_data,w.numpy() * x_data +b.numpy())

? return loss

ch = run_linear_model(0.1, 1000, x, y, True)

很有趣... 我們試一下更小的學習速率

ch1 = run_linear_model(1e-3, 1000, x, y, True)

ch2 = run_linear_model(1e-3, 5000, x, y, True)

檢查?J... 一直在變小。

繪制損失函數

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.plot(ch1, ls='solid', color = 'black')

ax.plot(ch2, ls='solid', color = 'red')

ax.set_xlabel('epochs', fontsize = 16)

ax.set_ylabel('Cost function $J$ (MSE)', fontsize = 16)

plt.xlim(0,1000)

plt.tick_params(labelsize=16)

你看不到有什么區別,我們來放大一下

你看不到有什么區別,我們來放大一下

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.plot(ch2, ls='solid', color = 'red')

ax.plot(ch1, ls='solid', color = 'black')

ax.set_ylim(3,3.6)

ax.set_xlabel('epochs', fontsize = 16)

ax.set_ylabel('Cost function $J$ (MSE)', fontsize = 16)

plt.xlim(0,5000)

plt.tick_params(labelsize=16)

注意到學習速率越小,收斂速度越慢... 我們試一下快一點的...

ch3 = run_linear_model(1e-2, 5000, x, y, True)

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.plot(ch3, ls='solid', lw = 3, color = 'blue', label = r"$\gamma = 10^{-2}$ up to 5000 epochs")

ax.plot(ch2, ls='solid', lw = 3, color = 'red', label = r"$\gamma = 10^{-3}$ up to 5000 epochs")

ax.plot(ch1, ls='--', lw = 5, color = 'black',label = r"$\gamma = 10^{-3}$, up to 1000 epochs")

ax.set_ylim(2.6,3.6)

ax.set_xlabel('epochs', fontsize = 16)

ax.set_ylabel('Cost function $J$ (MSE)', fontsize = 16)

plt.xlim(0,5000)

plt.legend(fontsize = 16)

plt.tick_params(labelsize=16)

現在接近扁平...

嘗度找到最佳參數

ch5 = run_linear_model(0.03, 5000, x, y, True)

#構建線性函數的斜率和截距

w = tf.Variable(np.random.randn(),tf.float32)

b = tf.Variable(0.0,tf.float32)

#設置迭代次數和學習率

train_epochs = 5000

learning_rate = 0.03

loss = []

count = 0

display_count = 10 #控制顯示粒度的參數,每訓練10個樣本輸出一次損失值

#開始訓練,輪數為epoch,采用SGD隨機梯度下降優化方法

for epoch in range(train_epochs):

??? for xs,ys in zip(x,y):? #for xs,ys in zip(x_data,y_data):

??????? #計算損失,并保存本次損失計算結果

??????? loss_ =loss_fun(xs,ys,w,b)

??????? loss.append(loss_)

??????? #計算當前[w,b]的梯度

??????? delta_w,delta_b = grad(xs,ys,w,b)

??????? change_w = delta_w * learning_rate

??????? change_b = delta_b * learning_rate

??????? w.assign_sub(change_w)

??????? b.assign_sub(change_b)

??????? #訓練步數加1

??????? count = count +1

??????? if count % display_count == 0:

??????????? print('train epoch : ','%02d'%(epoch+1),'step:%03d' % (count),'loss= ','{:.9f}'.format(loss_))

?????? #完成一輪訓練后,畫圖

#plt.plot(x,w.numpy() * x +b.numpy())?? #plt.plot(x_data,w.numpy() * x_data +b.numpy())

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.plot(ch5, ls='solid', lw = 3, color = 'green', label = r"$\gamma = 0.03$ up to 5000 epochs")

ax.plot(ch3, ls='solid', lw = 3, color = 'blue', label = r"$\gamma = 10^{-2}$ up to 5000 epochs")

ax.plot(ch2, ls='solid', lw = 3, color = 'red', label = r"$\gamma = 10^{-3}$ up to 5000 epochs")

ax.plot(ch1, ls='--', lw = 5, color = 'black',label = r"$\gamma = 10^{-3}$, up to 1000 epochs")

ax.set_ylim(2.6,3.6)

ax.set_xlabel('epochs', fontsize = 16)

ax.set_ylabel('Cost function $J$ (MSE)', fontsize = 16)

plt.xlim(0,5000)

plt.legend(fontsize = 16)

plt.tick_params(labelsize=16)

看來綠色或藍色線的值是可以達到的... 所以它們是好的候選...

pred_y = model(x,w.numpy(),b.numpy())?

mse_y = tf.reduce_mean(tf.square(pred_y - y))

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

???

plt.tight_layout()

fig = plt.figure(figsize=(10, 7))

ax = fig.add_subplot(1, 1, 1)

ax.scatter(y, pred_y, lw = 5)

ax.plot([y.min(), y.max()], [y.min(), y.max()], 'k--', lw = 5)

ax.set_xlabel('Measured Target Value', fontsize = 16)

ax.set_ylabel('Predicted Target Value', fontsize = 16)

plt.tick_params(labelsize=16)

如何找到權重?

通常我們感興趣于線性回歸的參數。使用神經網絡時我們只對預測感興趣,因為參數太多,但看一下如何是從計算圖獲得參數是很有啟發性的。我們的線性方程 為

y=wx1+b

且?w?包含于?tf.Variable?W, 且偏置bias在?tf.Variable?b里。所以要得到它們我們只要簡單的要求tensorflow評估節點。

參數為

#顯示訓練結果

print('w: ',w.numpy())

print('b: ',b.numpy())

所以我們可以用最佳擬合繪制數據

x_ = np.arange(4, 7, 0.05).reshape(1,-1)

yfit_ = model(x_ ,w.numpy(),b.numpy())

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

???

fig = plt.figure(figsize=(8, 5))

ax = fig.add_subplot(1, 1, 1)

ax.plot(x_[0], yfit_[0], label = "Linear Regression")

ax.scatter (x,y, color = 'red', s = 80, label = "True Data")

ax.set_xlabel('x', fontsize = 16)

ax.set_ylabel('y', fontsize = 16)

plt.legend(fontsize = 16)

plt.tick_params(labelsize=16)

與經典的線性回歸進行比較

我們比較一下經典線性回歸的結果?sklearn

xt = x.reshape(7,-1)

yt = y.reshape(7,-1)

reg = LinearRegression().fit(xt,yt)

reg.score(xt,yt)

reg.coef_

reg.intercept_

xt_ = x_[0].reshape(60,-1)

yfitsk_ = reg.predict(xt_.reshape(60,-1))

plt.rc('font', family='arial')

plt.rc('xtick', labelsize='x-small')

plt.rc('ytick', labelsize='x-small')

???

fig = plt.figure(figsize=(8, 5))

ax = fig.add_subplot(1, 1, 1)

ax.plot(x_[0], yfit_[0], label = "Linear Regression")

ax.plot(x_[0], yfitsk_, label = "sklearn Linear Regression")

ax.scatter (x,y, color = 'red', s = 80, label = "True Data")

ax.set_xlabel('x', fontsize = 16)

ax.set_ylabel('y', fontsize = 16)

plt.legend(fontsize = 16)

plt.tick_params(labelsize=16)

ch4 = run_linear_model(1e-2, 15000, x, y, True)

#構建線性函數的斜率和截距

w = tf.Variable(np.random.randn(),tf.float32)

b = tf.Variable(0.0,tf.float32)

#設置迭代次數和學習率

train_epochs = 15000

learning_rate = 1e-2

loss = []

count = 0

display_count = 10 #控制顯示粒度的參數,每訓練10個樣本輸出一次損失值

#開始訓練,輪數為epoch,采用SGD隨機梯度下降優化方法

for epoch in range(train_epochs):

??? for xs,ys in zip(x,y):? #for xs,ys in zip(x_data,y_data):

??????? #計算損失,并保存本次損失計算結果

??????? loss_ =loss_fun(xs,ys,w,b)

??????? loss.append(loss_)

??????? #計算當前[w,b]的梯度

??????? delta_w,delta_b = grad(xs,ys,w,b)

??????? change_w = delta_w * learning_rate

??????? change_b = delta_b * learning_rate

??????? w.assign_sub(change_w)

??????? b.assign_sub(change_b)

??????? #訓練步數加1

??????? count = count +1

??????? if count % display_count == 0:

??????????? print('train epoch : ','%02d'%(epoch+1),'step:%03d' % (count),'loss= ','{:.9f}'.format(loss_))

?????? #完成一輪訓練后,畫圖

#print(W_, b_)

print('w: ',w.numpy())

print('b: ',b.numpy())

經典線性回歸的結果為

9.5, -2.67857143

所以非常的接近!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90031.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90031.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90031.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

服務器中故障轉移機制是指什么意思?

在企業服務器和數據中心當中,電源冗余機制和故障轉移機制是保障系統高可用性和穩定性的重要組成部分,電源故障轉移系統可以幫助企業有效減少服務器因為硬件故障導致業務中斷的情況,本文就來詳細了解一下服務器中故障轉移機制。服務器中的故障…

rook-ceph的osd沒有啟動rook-ceph-osd-prepare狀態異常處理

rook-ceph搭建好ceph之后,查看ceph集群狀態,發現三節點只有兩個osd狀態正常注:這里是已經恢復后的截圖。 使用kubectl get pod -n rook-ceph查看pod都是處于運行狀態 rook-ceph-osd-prepare也都是Completed沒問題,實際使用kubectl…

ubuntu手動編譯VTK9.3 Generating qmltypes file 失敗

?在Ubuntu上手動編譯VTK 9.3時,可能會遇到 Generating qmltypes file失敗的問題。這個問題通常與VTK在處理Qt依賴時發生的錯誤有關。以下是解決該問題的詳細步驟和相關解釋。一、確保系統依賴正確安裝在編譯VTK之前,需要確保所有依賴項已經正確安裝&…

計算機科學導論(1)哈佛架構

文章目錄一、哈佛架構的定義與起源二、哈佛架構的核心組成與工作原理1. **物理結構:獨立的存儲與總線**2. **工作流程:并行處理的實現**三、哈佛架構與馮諾依曼架構的對比四、哈佛架構的優缺點分析1. **優勢**2. **局限性**五、哈佛架構的實際應用場景1.…

VBScript 安裝使用教程

一、VBScript 簡介 VBScript(Visual Basic Scripting Edition)是微軟推出的一種輕量級腳本語言,語法類似于 Visual Basic,廣泛應用于系統管理、自動化腳本、網頁客戶端(IE 專屬)以及 Windows 批處理等場景…

RSTP 拓撲收斂機制

RSTP拓撲收斂觸發條件 RSTP中檢測到拓撲變化只有一個標準:以一個非邊緣端口遷移到Forwarding狀態 收斂過程 為本交換設備的所有非邊緣指定端口和根端口啟動TC While Timer,該計時器是Hello Time(默認2s)的兩倍,然后…

支持向量機(SVM)分類

支持向量機(Support Vector Machine,SVM)是一種經典的監督學習算法,主要用于分類任務,也可擴展到回歸問題(稱為支持向量回歸,SVR)。其核心思想是通過尋找一個最優超平面,…

Linux操作系統從入門到精通!第二天(命令行)

一、Linux的命令行 1.Linux介紹:剛出世的時候,沒有什么節目,所有的操作都是靠命令行來執行,后來Linux發展迅速,也出現了圖形界面,但是由于命令行的執行速度比圖形界面塊,所以也得到了…

使用Go高效對接印度金融市場數據:K線、新股與實時行情開發指南

使用Go高效對接印度金融市場數據:K線、新股與實時行情開發指南 印度國家交易所(NSE)日均交易額超79億美元,孟買交易所(BSE)覆蓋上市公司超5000家,雙交易所體系為投資者提供了豐富機會。本文基于…

【計算機網絡】補充

僅供參考 如果本地域名服務器無緩存,當采用遞歸方法解析另一網絡某主機域名時,用戶主機和本地域名服務器發送的域名請求條數分別為() A.1條 1條 B.1條 多條 C.多條 1條 D.多條 多條 A CSMA/CD的中文含義是(&#x…

最新PDF轉markdown軟件MonkeyOCR整合包,文檔圖片解析工具

MonkeyOCR是上個月剛發布的一款文檔解析工具,可以將PDF文檔或圖片識別轉換為markdown格式文件。官方測試顯示性能極佳。我基于當前最新版制作了免安裝一鍵啟動整合包,支持批量操作,并降低了顯卡要求。 MonkeyOCR官方介紹 MonkeyOCR 采用結構…

創客匠人深度剖析:家庭教育賽道創始人 IP 打造與知識變現的破局之道

在知識付費領域,家庭教育賽道的競爭日益激烈,如何從 0-1 打造創始人 IP 并實現高效拓客,成為創業者的核心難題。創客匠人服務的慈航德教育創始人陳向杰老師,通過視頻號運營、產品矩陣設計與社群生態構建,實現單月拓客 …

UDP服務器主要是指什么意思?

UDP的全稱為用戶數據報協議,是一種在計算機網絡中常用的傳輸協議,屬于是傳輸層協議,UDP屬于是一種無連接的協議,在發送數據信息之前,發送方和接收方不需要建立任何握手連接,主要是用于發送小量數據的實時應…

arm 精準總線錯誤與非精準總線錯誤

一、總線錯誤 1.1 arm總線設計 要了解什么是總線錯誤,就要先了解arm的總線設計。 AMBA(Advanced Micro-Controller Bus Architecture)是由ARM Limited公司推出的On-Chip Bus片上總線規范,是目前芯片總線的主流標準(該標準在不斷演進&#…

Unity UGUI的Canvas以及內部元素之間遮擋關系調整

調UI遮擋關系有三種思路: 調Sorting Layer,層級越后渲染到越前面調Order in Layer,數字越大渲染到越前面修改UI材質調RenderQueue,數字越大越后渲染 對前兩種比較陌生的同學可以看一下我以前寫的這篇,不看也沒事&…

SpringCloud系列(46)--SpringCloud Bus實現動態刷新全局廣播

前言:上一節中我們簡單的介紹了什么是SpringCloud Bus,SpringCloud Bus的用處,而本節內容則是使用SpringCloud Bus來實現動態刷新全局廣播。 實現動態刷新全局廣播的設計思想的架構圖 注:在實現SpringCloud Bus動態刷新全局廣播前…

Java+Vue開發的電子招投標管理系統,實現全流程線上操作,高效規范,助力招投標活動透明公正開展

前言: 在數字化浪潮席卷全球的當下,傳統招投標模式面臨著效率低下、信息不透明、管理成本高等諸多挑戰。電子招投標管理系統應運而生,它借助先進的互聯網技術和信息化手段,實現了招投標全流程的電子化、自動化和智能化管理。該系…

MyBatisPlus-02-核心功能

文章目錄【README】【1】MyBatis-plus常見注解【2】MyBatis-Plus常見配置【2.1】MyBatis-Plus配置示例【3】MyBatisPlus核心內容【3.1】條件構造器【3.1.1】業務場景1-帶多字段條件的查詢-使用QueryWrapper【3.1.2】業務場景2-帶條件的更新-使用QueryWrapper【3.1.3】業務場景3…

ZYNQ MPSOC GTH aurora8b10b IP的修改與仿真

1 ip設置好后的頂層模塊接口: 根據自己的開發板修改接口如下: odule gtwizard_ultrascale_0_example_top (// Differential reference clock inputsinput wire mgtrefclk0_x0y1_p,input wire mgtrefclk0_x0y1_n,// Serial data ports for transceiver channel 0input w…

機器學習之線性回歸

主要參考: 機器學習| 算法筆記-線性回歸(Linear Regression) - 知乎 (zhihu.com) 2-2 線性回歸_嗶哩嗶哩_bilibili Python機器學習實戰:線性回歸模型預測波士頓房價_嗶哩嗶哩_bilibili 回歸分析 在數學和統計學中,回歸…