多層 RNN原理以及實現

數學原理


多層 RNN 的核心思想是堆疊多個 RNN 層,每一層的輸出作為下一層的輸入,從而逐層提取更高層次的抽象特征。


1. 單層 RNN 的數學表示

首先,單層 RNN 的計算過程如下。對于一個時間步 t t t,單層 RNN 的隱藏狀態 h t h_t ht? 和輸出 y t y_t yt? 可以表示為:

h t = activation ( W i h x t + b i h + W h h h t ? 1 + b h h ) h_t = \text{activation}(W_{ih} x_t + b_{ih} + W_{hh} h_{t-1} + b_{hh}) ht?=activation(Wih?xt?+bih?+Whh?ht?1?+bhh?)
y t = W h o h t + b h o y_t = W_{ho} h_t + b_{ho} yt?=Who?ht?+bho?

其中:

  • x t x_t xt? 是時間步 t t t 的輸入。
  • h t h_t ht? 是時間步 t t t 的隱藏狀態。
  • h t ? 1 h_{t-1} ht?1? 是時間步 t ? 1 t-1 t?1 的隱藏狀態。
  • W i h W_{ih} Wih? W h h W_{hh} Whh? W h o W_{ho} Who? 是權重矩陣。
  • b i h b_{ih} bih? b h h b_{hh} bhh? b h o b_{ho} bho? 是偏置項。
  • activation \text{activation} activation 是激活函數(如 tanh ? \tanh tanh ReLU \text{ReLU} ReLU)。

2. 多層 RNN 的數學表示

假設我們有一個 L L L 層的 RNN,每一層的隱藏狀態為 h t ( l ) h_t^{(l)} ht(l)?,其中 l l l 表示第 l l l 層, t t t 表示時間步。多層 RNN 的計算過程如下:

(1) 第一層( l = 1 l = 1 l=1

第一層的輸入是原始輸入序列 x t x_t xt?,隱藏狀態 h t ( 1 ) h_t^{(1)} ht(1)? 的計算公式為:

h t ( 1 ) = activation ( W i h ( 1 ) x t + b i h ( 1 ) + W h h ( 1 ) h t ? 1 ( 1 ) + b h h ( 1 ) ) h_t^{(1)} = \text{activation}(W_{ih}^{(1)} x_t + b_{ih}^{(1)} + W_{hh}^{(1)} h_{t-1}^{(1)} + b_{hh}^{(1)}) ht(1)?=activation(Wih(1)?xt?+bih(1)?+Whh(1)?ht?1(1)?+bhh(1)?)

其中:

  • W i h ( 1 ) W_{ih}^{(1)} Wih(1)? W h h ( 1 ) W_{hh}^{(1)} Whh(1)? 是第一層的權重矩陣。
  • b i h ( 1 ) b_{ih}^{(1)} bih(1)? b h h ( 1 ) b_{hh}^{(1)} bhh(1)? 是第一層的偏置項。
(2) 第 l l l 層( l > 1 l > 1 l>1

l l l 層的輸入是第 l ? 1 l-1 l?1 層的輸出 h t ( l ? 1 ) h_t^{(l-1)} ht(l?1)?,隱藏狀態 h t ( l ) h_t^{(l)} ht(l)? 的計算公式為:

h t ( l ) = activation ( W i h ( l ) h t ( l ? 1 ) + b i h ( l ) + W h h ( l ) h t ? 1 ( l ) + b h h ( l ) ) h_t^{(l)} = \text{activation}(W_{ih}^{(l)} h_t^{(l-1)} + b_{ih}^{(l)} + W_{hh}^{(l)} h_{t-1}^{(l)} + b_{hh}^{(l)}) ht(l)?=activation(Wih(l)?ht(l?1)?+bih(l)?+Whh(l)?ht?1(l)?+bhh(l)?)

其中:

  • W i h ( l ) W_{ih}^{(l)} Wih(l)? W h h ( l ) W_{hh}^{(l)} Whh(l)? 是第 l l l 層的權重矩陣。
  • b i h ( l ) b_{ih}^{(l)} bih(l)? b h h ( l ) b_{hh}^{(l)} bhh(l)? 是第 l l l 層的偏置項。
(3) 輸出層

最后一層(第 L L L 層)的輸出 h t ( L ) h_t^{(L)} ht(L)? 作為整個網絡的輸出 y t y_t yt?

y t = W h o h t ( L ) + b h o y_t = W_{ho} h_t^{(L)} + b_{ho} yt?=Who?ht(L)?+bho?

其中:

  • W h o W_{ho} Who? b h o b_{ho} bho? 是輸出層的權重矩陣和偏置項。

3. 多層 RNN 的數據流向

以下是一個 L L L 層 RNN 的數據流向的數學描述:

(1) 輸入序列

輸入序列為 x 1 , x 2 , … , x T x_1, x_2, \dots, x_T x1?,x2?,,xT?,其中 T T T 是序列長度。

(2) 初始化隱藏狀態

每一層的初始隱藏狀態 h 0 ( l ) h_0^{(l)} h0(l)? 通常初始化為零或隨機值:

h 0 ( l ) = 0 或 h 0 ( l ) ~ N ( 0 , σ 2 ) h_0^{(l)} = \mathbf{0} \quad \text{或} \quad h_0^{(l)} \sim \mathcal{N}(0, \sigma^2) h0(l)?=0h0(l)?N(0,σ2)

(3) 時間步 t t t 的計算

對于每個時間步 t t t,從第一層到第 L L L 層依次計算隱藏狀態:

  1. 第一層
    h t ( 1 ) = activation ( W i h ( 1 ) x t + b i h ( 1 ) + W h h ( 1 ) h t ? 1 ( 1 ) + b h h ( 1 ) ) h_t^{(1)} = \text{activation}(W_{ih}^{(1)} x_t + b_{ih}^{(1)} + W_{hh}^{(1)} h_{t-1}^{(1)} + b_{hh}^{(1)}) ht(1)?=activation(Wih(1)?xt?+bih(1)?+Whh(1)?ht?1(1)?+bhh(1)?)

  2. l l l 層( l > 1 l > 1 l>1
    h t ( l ) = activation ( W i h ( l ) h t ( l ? 1 ) + b i h ( l ) + W h h ( l ) h t ? 1 ( l ) + b h h ( l ) ) h_t^{(l)} = \text{activation}(W_{ih}^{(l)} h_t^{(l-1)} + b_{ih}^{(l)} + W_{hh}^{(l)} h_{t-1}^{(l)} + b_{hh}^{(l)}) ht(l)?=activation(Wih(l)?ht(l?1)?+bih(l)?+Whh(l)?ht?1(l)?+bhh(l)?)

  3. 輸出
    y t = W h o h t ( L ) + b h o y_t = W_{ho} h_t^{(L)} + b_{ho} yt?=Who?ht(L)?+bho?

(4) 序列輸出

最終,整個序列的輸出為 y 1 , y 2 , … , y T y_1, y_2, \dots, y_T y1?,y2?,,yT?


4. 多層 RNN 的特點

(1) 逐層抽象
  • 每一層 RNN 可以看作是對輸入序列的不同層次的抽象。
  • 較低層捕捉局部和細節信息,較高層捕捉全局和語義信息。
(2) 參數共享
  • 每一層的參數(權重矩陣和偏置項)在時間步之間共享。
  • 不同層的參數是獨立的。
(3) 梯度傳播
  • 在反向傳播時,梯度會通過時間步和層數傳播。
  • 由于梯度消失或爆炸問題,訓練深層 RNN 可能會比較困難。

可視化原理

下面是一個可視化的結構顯示圖:其中每一層神經元都要有兩個方向的輸出,一個是向本時間步的下一層傳送,另一個是向下一個時間步的本層傳送。而且,每一個神經元都有兩個權重矩陣。注意:下方右圖僅僅是邏輯上展開的數據流,其中不同世間步上的同一層,用的是同一個權重矩陣。

在這里插入圖片描述

代碼實現


1. 示例任務

假設有一個簡單的任務:

  • 處理一個長度為 4 的序列
  • 批次大小為 2
  • 每個時間步的輸入特征維度為 3
  • 希望使用一個 2 層的單向 RNN
  • 隱藏狀態維度為 5。

2. 輸入數據

輸入句子
  • 句子 1: “I love PyTorch”
  • 句子 2: “RNN is fun”
輸入數據的形狀
  • 序列長度 (seq_len): 4(假設每個單詞是一個時間步)
  • 批次大小 (batch_size): 2
  • 輸入特征維度 (input_size): 3(假設每個單詞用一個 3 維向量表示)
具體輸入數據
import torch# 輸入數據形狀: (seq_len, batch_size, input_size)
input_data = torch.tensor([# 時間步 1[[0.1, 0.2, 0.3],  # 句子 1 的第一個單詞[0.4, 0.5, 0.6]], # 句子 2 的第一個單詞# 時間步 2[[0.7, 0.8, 0.9],  # 句子 1 的第二個單詞[1.0, 1.1, 1.2]], # 句子 2 的第二個單詞# 時間步 3[[1.3, 1.4, 1.5],  # 句子 1 的第三個單詞[1.6, 1.7, 1.8]], # 句子 2 的第三個單詞# 時間步 4[[1.9, 2.0, 2.1],  # 句子 1 的第四個單詞[2.2, 2.3, 2.4]]  # 句子 2 的第四個單詞
])
print("Input shape:", input_data.shape)  # 輸出: torch.Size([4, 2, 3])

3. 初始隱藏狀態

初始隱藏狀態的形狀
  • RNN 層數 (num_layers): 2
  • 方向數 (num_directions): 1(單向 RNN)
  • 批次大小 (batch_size): 2
  • 隱藏狀態維度 (hidden_size): 5
具體初始隱藏狀態
# 初始隱藏狀態形狀: (num_layers * num_directions, batch_size, hidden_size)
h0 = torch.zeros(2, 2, 5)  # 2層RNN,批次大小為2,隱藏狀態維度為5
print("h0 shape:", h0.shape)  # 輸出: torch.Size([2, 2, 5])

4. 定義 RNN 模型

import torch.nn as nn# 定義 RNN
rnn = nn.RNN(input_size=3,  # 輸入特征維度hidden_size=5, # 隱藏狀態維度num_layers=2,  # RNN 層數batch_first=False  # 輸入形狀為 (seq_len, batch_size, input_size)
)

5. 前向傳播

計算輸出
# 前向傳播
output, hn = rnn(input_data, h0)print("Output shape:", output.shape)  # 輸出: torch.Size([4, 2, 5])
print("hn shape:", hn.shape)          # 輸出: torch.Size([2, 2, 5])
輸出解析
  1. output:

    • 形狀為 (seq_len, batch_size, hidden_size),即 (4, 2, 5)
    • 包含了每個時間步的隱藏狀態。
    • 例如,output[0] 是第一個時間步的隱藏狀態,output[-1] 是最后一個時間步的隱藏狀態。
  2. hn:

    • 形狀為 (num_layers, batch_size, hidden_size),即 (2, 2, 5)
    • 包含了最后一個時間步的隱藏狀態。
    • 例如,hn[0] 是第一層的最終隱藏狀態,hn[1] 是第二層的最終隱藏狀態。

6. 具體輸出值

output 的值
print("Output (所有時間步的隱藏狀態):")
print(output)

輸出示例:

tensor([[[ 0.1234,  0.5678,  0.9101,  0.1121,  0.3141],[ 0.4151,  0.6171,  0.8191,  0.0212,  0.2232]],[[ 0.4252,  0.6272,  0.8292,  0.0313,  0.2333],[ 0.4353,  0.6373,  0.8393,  0.0414,  0.2434]],[[ 0.4454,  0.6474,  0.8494,  0.0515,  0.2535],[ 0.4555,  0.6575,  0.8595,  0.0616,  0.2636]],[[ 0.4656,  0.6676,  0.8696,  0.0717,  0.2737],[ 0.4757,  0.6777,  0.8797,  0.0818,  0.2838]]],grad_fn=<StackBackward>)
hn 的值
print("hn (最后一個時間步的隱藏狀態):")
print(hn)

輸出示例:

tensor([[[ 0.4656,  0.6676,  0.8696,  0.0717,  0.2737],[ 0.4757,  0.6777,  0.8797,  0.0818,  0.2838]],[[ 0.4858,  0.6878,  0.8898,  0.0919,  0.2939],[ 0.4959,  0.6979,  0.8999,  0.1020,  0.3040]]],grad_fn=<StackBackward>)

batch_first=True時

以下是一個具體的例子,展示當 batch_first=True 時,PyTorch 中 torch.nn.RNN 的輸入、輸出以及參數的作用。


任務

假設有一個簡單的任務:

  • 處理一個長度為 4 的序列
  • 批次大小為 2
  • 每個時間步的輸入特征維度為 3
  • 希望使用一個 2 層的單向 RNN
  • 隱藏狀態維度為 5
  • 并且設置 batch_first=True

2. 輸入數據

輸入句子
  • 句子 1: “I love PyTorch”
  • 句子 2: “RNN is fun”
輸入數據的形狀
  • 批次大小 (batch_size): 2
  • 序列長度 (seq_len): 4(假設每個單詞是一個時間步)
  • 輸入特征維度 (input_size): 3(假設每個單詞用一個 3 維向量表示)
具體輸入數據
import torch# 輸入數據形狀: (batch_size, seq_len, input_size)
input_data = torch.tensor([# 句子 1[[0.1, 0.2, 0.3],  # 第一個單詞[0.7, 0.8, 0.9],  # 第二個單詞[1.3, 1.4, 1.5],  # 第三個單詞[1.9, 2.0, 2.1]], # 第四個單詞# 句子 2[[0.4, 0.5, 0.6],  # 第一個單詞[1.0, 1.1, 1.2],  # 第二個單詞[1.6, 1.7, 1.8],  # 第三個單詞[2.2, 2.3, 2.4]]  # 第四個單詞
])
print("Input shape:", input_data.shape)  # 輸出: torch.Size([2, 4, 3])

3. 初始隱藏狀態

初始隱藏狀態的形狀
  • RNN 層數 (num_layers): 2
  • 方向數 (num_directions): 1(單向 RNN)
  • 批次大小 (batch_size): 2
  • 隱藏狀態維度 (hidden_size): 5
具體初始隱藏狀態
# 初始隱藏狀態形狀: (num_layers * num_directions, batch_size, hidden_size)
h0 = torch.zeros(2, 2, 5)  # 2層RNN,批次大小為2,隱藏狀態維度為5
print("h0 shape:", h0.shape)  # 輸出: torch.Size([2, 2, 5])

4. 定義 RNN 模型

import torch.nn as nn# 定義 RNN
rnn = nn.RNN(input_size=3,  # 輸入特征維度hidden_size=5, # 隱藏狀態維度num_layers=2,  # RNN 層數batch_first=True  # 輸入形狀為 (batch_size, seq_len, input_size)
)

5. 前向傳播

計算輸出
# 前向傳播
output, hn = rnn(input_data, h0)print("Output shape:", output.shape)  # 輸出: torch.Size([2, 4, 5])
print("hn shape:", hn.shape)          # 輸出: torch.Size([2, 2, 5])
輸出解析
  1. output:

    • 形狀為 (batch_size, seq_len, hidden_size),即 (2, 4, 5)
    • 包含了每個時間步的隱藏狀態。
    • 例如,output[0] 是第一個句子的所有時間步的隱藏狀態,output[1] 是第二個句子的所有時間步的隱藏狀態。
  2. hn:

    • 形狀為 (num_layers, batch_size, hidden_size),即 (2, 2, 5)
    • 包含了最后一個時間步的隱藏狀態。
    • 例如,hn[0] 是第一層的最終隱藏狀態,hn[1] 是第二層的最終隱藏狀態。

6. 具體輸出值

output 的值
print("Output (所有時間步的隱藏狀態):")
print(output)

輸出示例:

tensor([[[ 0.1234,  0.5678,  0.9101,  0.1121,  0.3141],[ 0.4252,  0.6272,  0.8292,  0.0313,  0.2333],[ 0.4454,  0.6474,  0.8494,  0.0515,  0.2535],[ 0.4656,  0.6676,  0.8696,  0.0717,  0.2737]],[[ 0.4151,  0.6171,  0.8191,  0.0212,  0.2232],[ 0.4353,  0.6373,  0.8393,  0.0414,  0.2434],[ 0.4555,  0.6575,  0.8595,  0.0616,  0.2636],[ 0.4757,  0.6777,  0.8797,  0.0818,  0.2838]]],grad_fn=<TransposeBackward0>)
hn 的值
print("hn (最后一個時間步的隱藏狀態):")
print(hn)

輸出示例:

tensor([[[ 0.4656,  0.6676,  0.8696,  0.0717,  0.2737],[ 0.4757,  0.6777,  0.8797,  0.0818,  0.2838]],[[ 0.4858,  0.6878,  0.8898,  0.0919,  0.2939],[ 0.4959,  0.6979,  0.8999,  0.1020,  0.3040]]],grad_fn=<StackBackward>)

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

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

相關文章

RNA 測序技術概覽(RNA-seq)

前言 轉錄組測序&#xff08;RNA-seq&#xff09;是當下最流行的二代測序&#xff08;NGS&#xff09;方法之一&#xff0c;使科研工作者實現在轉錄水平上定量、定性的研究&#xff0c;它的出現已經革命性地改變了人們研究基因表達調控的方式。然而&#xff0c;轉錄組測序&…

C語言練習(16)

猴子吃桃問題。猴子第一天摘下若干個桃子&#xff0c;當即吃了一半&#xff0c;還不過癮&#xff0c;又多吃了一個。第二天早上又將剩下的桃子吃掉一半&#xff0c;又多吃了一個。以后每天早上都吃了前一天剩下的一半加一個。到第10天早上想再吃時&#xff0c;見只剩一個桃子了…

【機器學習】自定義數據集使用框架的線性回歸方法對其進行擬合

一、使用框架的線性回歸方法 1. 基礎原理 在自求導線性回歸中&#xff0c;我們需要先自定義參數&#xff0c;并且需要通過數學公式來對w和b進行求導&#xff0c;然后在反向傳播過程中通過梯度下降的方式來更新參數&#xff0c;從而降低損失值。 2. 實現步驟 ① 散點輸入 有一…

pytest執行報錯:found no collectors

今天在嘗試使用pytest運行用例的時候出現報錯&#xff1a;found no collectors&#xff1b;從兩個方向進行排查&#xff0c;一是看文件名和函數名是不是符合規范&#xff0c;命名要是"test_*"格式&#xff1b;二是是否存在修改文件名的情況&#xff0c;如果修改過文件…

mysql-06.JDBC

目錄 什么是JDBC: 為啥存在JDBC: JDBC工作原理&#xff1a; JDBC的優勢&#xff1a; 下載mysql驅動包&#xff1a; 用java程序操作數據庫 1.創建dataSource: 2.與服務端建立連接 3.構造sql語句 4.執行sql 5.關閉連接&#xff0c;釋放資源 參考代碼&#xff1a; 插…

微信小程序wxs實現UTC轉北京時間

微信小程序實現UTC轉北京時間 打臉一刻&#xff1a;最近在迭代原生微信小程序&#xff0c;好一段時間沒寫原生的&#xff0c;有點不習慣&#xff1b; 咦&#xff0c;更新數據咋不生效呢&#xff1f;原來還停留在 this.xxx&#xff1b; 喲&#xff0c;事件又沒反應了&#xff1f…

機器學習-線性回歸(對于f(x;w)=w^Tx+b理解)

一、&#x1d453;(&#x1d499;;&#x1d498;) &#x1d498;T&#x1d499;的推導 學習線性回歸&#xff0c;我們那先要對于線性回歸的表達公示&#xff0c;有所認識。 我們先假設空間是一組參數化的線性函數&#xff1a; 其中權重向量&#x1d498; ∈ R&#x1d437; …

R語言學習筆記之語言入門基礎

一、R語言基礎 快速熟悉R語言中的基本概念&#xff0c;先入個門。 1、運算符 運算符含義例子加1 1-減3 - 2*乘3 * 2/除9 / 3^(**)乘方2 ^ 3 2 ** 3%%取余5 %% 2%/%取整5 %/% 2 2、賦值符號 等號a 1三者等價&#xff1a;把1賦值給變量a左箭頭<?a <- 1右箭頭?&g…

計算機網絡三張表(ARP表、MAC表、路由表)總結

參考&#xff1a; 網絡三張表&#xff1a;ARP表, MAC表, 路由表&#xff0c;實現你的網絡自由&#xff01;&#xff01;_mac表、arp表、路由表-CSDN博客 網絡中的三張表&#xff1a;ARP表、MAC表、路由表 首先要明確一件事&#xff0c;如果一個主機要發送數據&#xff0c;那么必…

【Nomoto 船舶模型】

【Nomoto 船舶模型】 1. Nomoto 船舶模型簡介2. 來源及發展歷程3. 構建 一階模型Nomoto 船舶模型3.1 C 實現3.2 Python 實現3.3 說明 5. 參數辨識方法5.1 基于最小二乘法的參數辨識5.2 數學推導5.3 Python 實現5.4 說明 4. 結論參考文獻 1. Nomoto 船舶模型簡介 Nomoto 模型是…

差分進化算法 (Differential Evolution) 算法詳解及案例分析

差分進化算法 (Differential Evolution) 算法詳解及案例分析 目錄 差分進化算法 (Differential Evolution) 算法詳解及案例分析1. 引言2. 差分進化算法 (DE) 算法原理2.1 基本概念2.2 算法步驟3. 差分進化算法的優勢與局限性3.1 優勢3.2 局限性4. 案例分析4.1 案例1: 單目標優化…

深入理解GPT底層原理--從n-gram到RNN到LSTM/GRU到Transformer/GPT的進化

從簡單的RNN到復雜的LSTM/GRU,再到引入注意力機制,研究者們一直在努力解決序列建模的核心問題。每一步的進展都為下一步的突破奠定了基礎,最終孕育出了革命性的Transformer架構和GPT大模型。 1. 從n-gram到循環神經網絡(RNN)的誕生 1.1 N-gram 模型 在深度學習興起之前,處理…

【JWT】jwt實現HS、RS、ES、ED簽名與驗簽

JWT 實現 HS、RS、ES 和 ED 簽名與驗簽 簽名方式算法密鑰類型簽名要點驗簽要點HSHMAC-SHA256對稱密鑰- 使用 crypto/hmac 和對稱密鑰生成 HMAC 簽名- 將 header.payload 作為數據輸入- 使用同一密鑰重新計算 HMAC 簽名- 比較計算結果與接收到的簽名是否一致RSRSA-SHA256公鑰 …

地址欄信息location

獲取信息 頁面跳轉 location.href當前地址欄信息 location.assign()設置跳轉新的頁面 location.replace() location.reload()刷新頁面

程序員轉型測試:解鎖漏洞挖掘新旅程

前言&#xff1a;哈嘍&#xff0c;大家好&#xff0c;今天給大家分享一篇文章&#xff01;并提供具體代碼幫助大家深入理解&#xff0c;徹底掌握&#xff01;創作不易&#xff0c;如果能幫助到大家或者給大家一些靈感和啟發&#xff0c;歡迎收藏關注哦 &#x1f495; 目錄 程序…

StarRocks常用命令

目錄 1、StarRocks 集群管理&配置命令 2、StarRocks 常用操作命令 3、StarRocks 數據導入和導出 1、StarRocks 集群管理&配置命令 查詢 FE 節點信息 SHOW frontends; SHOW PROC /frontends; mysql -h192.168.1.250 -P9030 -uroot -p -e "SHOW PROC /dbs;"…

08-ArcGIS For JavaScript-通過Mesh繪制幾何體(Cylinder,Circle,Box,Pyramid)

目錄 概述代碼實現1、Mesh.createBox2、createPyramid3、Mesh.createSphere4、Mesh.createCylinder 完整代碼 概述 對于三維場景而言&#xff0c;二位的點、線、面&#xff0c;三維的圓、立方體、圓柱等都是比較常見的三維對象&#xff0c;在ArcGIS For JavaScript中我們知道點…

Linux中page、buffer_head、bio的關系

在Linux中&#xff0c;page、buffer_head、bio這三個概念緊密相關&#xff0c;共同構成了塊設備I/O和內存管理的重要部分&#xff0c;它們的聯系主要體現在以下方面&#xff1a; page與buffer_head 基于page構建&#xff1a;buffer_head通常是基于page來構建的&#xff0c;一…

直線擬合例子 ,嶺回歸擬合直線

目錄 直線擬合,算出離群點 嶺回歸擬合直線&#xff1a; 直線擬合,算出離群點 import cv2 import numpy as np# 輸入的點 points np.array([[51, 149],[122, 374],[225, 376],[340, 382],[463, 391],[535, 298],[596, 400],[689, 406],[821, 407] ], dtypenp.float32)# 使用…

SpringCloud兩種注冊中心

SpringCloud 基本概念 系統架構 我們之前做的所有的項目都屬于單體架構&#xff0c;下面我們將要學習更適合大型項目的分布式架構 單體架構&#xff1a; 將業務的所有功能幾種在一個項目中開發&#xff0c;打成一個包部署。 優點&#xff1a;架構簡單、部署成本低 缺點&am…