擬合損失函數

文章目錄

  • 擬合損失函數
    • 一、線性擬合
      • 1.1 介紹
      • 1.2 代碼可視化
        • 1.2.1 生成示例數據
        • 1.2.2 損失函數
        • 1.2.3 繪制三維圖像
        • 1.2.4 繪制等高線
        • 1.2.5 損失函數關于斜率的函數
    • 二、 多變量擬合
      • 2.1 介紹
      • 2.2 代碼可視化
        • 2.2.1 生成示例數據
        • 2.2.2 損失函數
        • 2.2.3 繪制等高線
    • 三、 多項式擬合
      • 3.1 介紹
      • 3.2 公式表示

擬合損失函數

下一篇文章有如何通過損失函數來進行梯度下降法。

一、線性擬合

1.1 介紹

使用最小二乘法進行線性擬合,即,

h θ ( x ) = θ 0 + θ 1 x h_{\theta}(x) = \theta_{0}+\theta_{1}x hθ?(x)=θ0?+θ1?x
其中, θ 0 \theta_{0} θ0? θ 1 \theta_{1} θ1?是參數,需要通過已經給出的數據進行擬合,這里不進行具體的計算.

損失函數為:
J ( θ 0 , θ 1 ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) ? y ( i ) ) 2 J(\theta_{0},\theta_{1})=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2 J(θ0?,θ1?)=2m1?i=1m?(hθ?(x(i))?y(i))2
即線性擬合的目的即是達到 min θ J ( θ 0 , θ 1 ) \text{min}_{\theta} J(\theta_{0},\theta_{1}) minθ?J(θ0?,θ1?)

因此我們可以采取梯度下降法進行擬合。

而,不同的 θ 0 \theta_{0} θ0? θ 1 \theta_{1} θ1?獲取到不同的損失,我們可以先繪制損失函數的圖像,進行參數的預估計。

即,使用matplotlib的三維圖像繪制來確定,以及可以使用等高線來進行完成。

1.2 代碼可視化

1.2.1 生成示例數據
import numpy as np
import matplotlib.pyplot as plt# 生成示例數據
x = np.linspace(0, 10, 100)
y = 2 * x + 3 + np.random.normal(0, 2, 100)  # y = 2x + 3 + 噪聲
# 繪制散點圖,根據散點圖大致確定參數范圍
plt.scatter(x, y)
plt.title("Data analysis")
plt.xlabel("x")
plt.ylabel("y")
plt.show()

在這里插入圖片描述

1.2.2 損失函數
def mse_loss(t0, t1, x, y):# 定義損失函數y_pred = t1 * x + t0return np.mean((y - y_pred) ** 2) / 2
1.2.3 繪制三維圖像
t0_, t1_ = np.linspace(0, 6, 100), np.linspace(0, 4, 100)  # 定義參數的取值范圍
t0, t1 = np.meshgrid(t0_, t1_)  # 生成矩陣網格,即形成三維圖的x軸和y軸,其為秩一陣
loss = np.zeros_like(t0)
for i in range(t0.shape[0]):for j in range(t0.shape[1]):loss[i, j] = mse_loss(t0[i, j],t1[i, j], x, y)# 繪制三維損失曲面
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')  # 創建三維坐標系
ax.plot_surface(t0, t1, loss, cmap='viridis', alpha=0.8)
ax.set_xlabel("Slope (t1)")
ax.set_ylabel("Intercept (t0)")
ax.set_zlabel("Loss (MSE)")
ax.set_title("3D Loss Surface")
plt.show()

1737978322_pszubtzpfk.png1737978321767.png

1.2.4 繪制等高線
# 繪制等高線圖
plt.figure(figsize=(8, 6))
contour = plt.contour(t0, t1, loss, levels=50, cmap='viridis')
plt.colorbar(contour)
plt.xlabel("Slope (t1)")
plt.ylabel("Intercept (t0)")
plt.title("Contour Plot of Loss Function")
plt.show()

1737978304_gg2zfaf42f.png1737978303357.png

1.2.5 損失函數關于斜率的函數

固定截距,繪制出損失函數關于斜率的圖像,通過等高線得出估計的最佳截距。

t1 = np.linspace(0, 6, 200)  # 得出斜率的范圍
loss = np.zeros_like(t1)
for i in range(loss.shape[0]):loss[i] = mse_loss(2.5, t1[i], x, y)  # 存儲損失值
plt.plot(t1, loss)
plt.xlabel(r"Slope($\theta_{1}$)")
plt.ylabel("Loss")
plt.title("Loss-Slope")
plt.show()  

1737978275_nn9aoav03l.png1737978274391.png
通過一系列圖像發現,損失值會收斂到一個值

故,可以使用梯度下降法(下一文會介紹)來進行線性擬合求解方程

二、 多變量擬合

2.1 介紹

顯然,一個結果會受到多種因素的影響,這時候,就需要引入多項式來進行擬合。需要一些線性代數的知識,小知識。
即,我們令:
y = ( x 1 ? x n 1 ) ? ( w 1 ? w n b ) = X W + b = w 1 x 1 + ? + w n x n + b \begin{array}{l} y &= \begin{pmatrix} x_1& \cdots& x_n&1 \end{pmatrix}\cdot\begin{pmatrix} w_1\\\vdots\\w_n\\b \end{pmatrix} \\ &= XW+b \\&= w_1x_1+\cdots+w_nx_n+b \end{array} y?=(x1????xn??1?)? ?w1??wn?b? ?=XW+b=w1?x1?+?+wn?xn?+b?
可以看出,使用向量表達,和線性擬合的表達式類似。即,這里使用二項式擬合:
h θ ( x ) ( i ) = θ 0 + θ 1 x 1 ( i ) + θ 2 x 2 ( i ) h θ ( x ) = ( 1 x 1 ( 1 ) x 2 ( 1 ) ? ? ? 1 x 1 ( m ) x 2 ( m ) ) m × 3 ? ( θ 0 θ 1 θ 2 ) 3 × 1 \begin{array}{l} h_{\theta}(x)^{(i)} &=\theta_{0}+\theta_{1}x_{1}^{(i)}+\theta_{2}x_{2}^{(i)}\\ h_{\theta}(x)&=\begin{pmatrix} 1&x_{1}^{(1)}&x_{2}^{(1)}\\ \vdots&\vdots&\vdots\\ 1&x_{1}^{(m)}&x_{2}^{(m)} \end{pmatrix}_{m\times 3}\cdot\begin{pmatrix} \theta_{0}\\\theta_{1}\\\theta_{2} \end{pmatrix}_{3\times1} \end{array} hθ?(x)(i)hθ?(x)?=θ0?+θ1?x1(i)?+θ2?x2(i)?= ?1?1?x1(1)??x1(m)??x2(1)??x2(m)?? ?m×3?? ?θ0?θ1?θ2?? ?3×1??
則,我們的損失函數定義為:

J ( θ 0 , ? , θ n ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) ? y ( i ) ) 2 J(\theta_{0},\cdots,\theta_{n}) = \frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)}) ^2 J(θ0?,?,θn?)=2m1?i=1m?(hθ?(x(i))?y(i))2

2.2 代碼可視化

2.2.1 生成示例數據
import numpy as np
import matplotlib.pyplot as plt# 這里迭代區間最好不要一樣,不然 x1 = x2
x1 = np.linspace(0, 10, 100)
x2 = np.linspace(-10, 0, 100)  
y = 2 * x1 + 3 * x2 + 4 + np.random.normal(0, 4, 100)  # 生成噪聲數據,即生成正態分布的隨機數# 繪制散點圖,三維散點圖
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')  
# 繪制三維散點圖
ax.scatter(x1, x2, y, alpha=0.6)# 設置坐標軸標簽
ax.set_xlabel('X1 Label')
ax.set_ylabel('X2 Label')
ax.set_zlabel('Y Data')# 設置標題
ax.set_title('3D Scatter Plot')
plt.show()

1737978238_io1t4keqnk.png1737978237756.png

2.2.2 損失函數

使用點積來進行損失函數的編寫:

其實,線性函數也可以用點積來編寫,不過運算較為簡單,就可以不考慮點積

def mse_loss(para, X, y):"""para: nx1 的列向量x: mxn 的數據矩陣y: nx1的列向量"""y_pre = np.dot(X, para)   # 使用點積定義擬合函數return np.mean((y_pre-y)**2) / 2
2.2.3 繪制等高線

這里等高線的繪制,先尋找一個大概截距,即固定一個值,而后再進行二維等高線的繪制:

# 對數據進行預處理
one_ = np.ones_like(x1)  # 生成一個全為1的列向量
X = np.array([one_, x1, x2]).T   # 合成為一個100行三列的數據矩陣x10, x20 = np.linspace(0, 6, 100), np.linspace(0, 6, 100)
x1_, x2_ = np.meshgrid(x10, x20)
loss = np.zeros_like(x1_)
for i in range(x1_.shape[0]):  # 批量計算損失函數for j in range(x1_.shape[1]):param = np.array([0, x1_[i][j], x2_[i][j]])  # 假設截距為0loss[i][j] = mse_loss(param, X, y)plt.figure(figsize=(8, 6))
contour = plt.contour(x1_, x2_, loss, levels=50, cmap='viridis')
plt.colorbar(contour)
plt.xlabel(r"$x_1$")
plt.ylabel(r"$x_2$")
plt.title(r"Contour Plot of Loss Function when $x_0$=4")
plt.show()

1737978180_a6cnb06cei.png1737978179094.png
通過等高線的繪制,可以大致確定 x 1 x_{1} x1? x 2 x_{2} x2?的估計值,而后使用梯度下降法進行進一步的求解。

三、 多項式擬合

3.1 介紹

在一些擬合過程中其實單變量影響,但是通過散點圖很容易發現,其并不是線性函數,因此并不能進行線性擬合,而是要進行多項式擬合,即使用x的多次方的加和形式進行擬合:
f ( x ) = ∑ i = 0 n a i x i f(x) = \sum_{i=0}^{n}a_{i}x^{i} f(x)=i=0n?ai?xi

1737979030_rt6k6zr6tz.png1737979029000.png
同時,也可以使用 y = θ 0 + θ 1 x + θ 2 x y=\theta_{0}+\theta_{1}x+\theta_{2}\sqrt{ x } y=θ0?+θ1?x+θ2?x ?來進行擬合。
具體的多項式擬合形式,需要結合其他數據,以及具體情況進行分析。

則,其損失函數為:
min θ J ( θ ) = min θ 1 2 m ∑ i = 0 m ( f ( x ( i ) ) ? y ( i ) ) 2 \text{min}_{\theta} J(\theta)=\text{min}_{\theta}\frac{1}{2m}\sum_{i=0}^{m} (f(x^{(i)})-y^{(i)})^2 minθ?J(θ)=minθ?2m1?i=0m?(f(x(i))?y(i))2

3.2 公式表示

擬合方式則是與多變量擬合的過程類似(令 φ ( x ) \varphi(x) φ(x)為x的多次方形式)


h θ ( x ) = ( 1 φ 1 ( x ( 1 ) ) ? φ n ( x ( 1 ) ) ? ? ? ? 1 φ 1 ( x ( m ) ) ? φ n ( x ( m ) ) ) m × ( n + 1 ) ? ( θ 0 θ 1 ? θ n ) ( n + 1 ) × 1 \begin{array}{l} h_{\theta}(x)=\begin{pmatrix} 1&\varphi_1(x^{(1)})&\cdots&\varphi_n(x^{(1)})\\ \vdots&\vdots&\ddots &\vdots\\ 1&\varphi_1(x^{(m)})&\cdots&\varphi_n(x^{(m)}) \end{pmatrix}_{m\times (n+1)}\cdot\begin{pmatrix} \theta_{0}\\\theta_{1}\\\vdots\\\theta_n \end{pmatrix}_{(n+1)\times1} \end{array} hθ?(x)= ?1?1?φ1?(x(1))?φ1?(x(m))?????φn?(x(1))?φn?(x(m))? ?m×(n+1)?? ?θ0?θ1??θn?? ?(n+1)×1??
而后進行相似的運算即可繪制出圖像。

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

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

相關文章

基于微信小程序的移動學習平臺的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

【公因數匹配——暴力、(質)因數分解、哈希】

題目 暴力代碼&#xff0c;Acwing 8/10&#xff0c;官網AC #include <bits/stdc.h> using namespace std; const int N 1e610; vector<int> nums[N]; int main() {ios::sync_with_stdio(0);cin.tie(0);int n;cin >> n;for(int i 1; i < n; i){int x;ci…

127周一復盤 (165)玩法與難度思考

1.上午測試&#xff0c;小改了點東西&#xff0c; 基本等于啥也沒干。 匆忙趕往車站。 從此進入春節期間&#xff0c;沒有開發&#xff0c;而思考與設計。 2.火車上思考玩法與難度的問題。 目前的主流作法實際上并不完全符合不同玩家的需求&#xff0c; 對這方面還是要有自…

【數據結構】_鏈表經典算法OJ(力扣版)

目錄 1. 移除鏈表元素 1.1 題目描述及鏈接 1.2 解題思路 1.3 程序 2. 反轉鏈表 2.1 題目描述及鏈接 2.2 解題思路 2.3 程序 3. 鏈表的中間結點 3.1 題目描述及鏈接 3.2 解題思路 3.3 程序 1. 移除鏈表元素 1.1 題目描述及鏈接 原題鏈接&#xff1a;203. 移除鏈表…

編譯器gcc/g++ --【Linux基礎開發工具】

文章目錄 一、背景知識二、gcc編譯選項1、預處理(進行宏替換)2、編譯&#xff08;生成匯編&#xff09;3、匯編&#xff08;生成機器可識別代碼&#xff09;4、鏈接&#xff08;生成可執行文件或庫文件&#xff09; 三、動態鏈接和靜態鏈接四、靜態庫和動態庫1、動靜態庫2、編譯…

Java 注解與元數據

Java學習資料 Java學習資料 Java學習資料 一、引言 在 Java 編程中&#xff0c;注解&#xff08;Annotation&#xff09;和元數據&#xff08;Metadata&#xff09;是兩個重要的概念。注解為程序提供了一種在代碼中嵌入額外信息的方式&#xff0c;這些額外信息就是元數據。元…

操作系統指定用戶密碼永不過期

背景 實際生產環境中&#xff0c;數據中心操作系統通常會有基線要求&#xff08;比如等保之類&#xff09;&#xff0c;要求設置操作系統密碼有效期&#xff0c;但是infra團隊或者操作系統管理員或者某些業務配置使用的操作系統用戶又需要密碼不能不停修改&#xff08;或者說一…

無用的知識又增加了:is_assignable means?

std::pair的默認operator被delete掉了&#xff0c;取而代之的是兩個enable_if版本。 為什么這么設計&#xff0c;我的理解是在std::map里&#xff0c;已經保存的元素的key值是不能被修改的&#xff0c;比如 注意&#xff0c;下面的代碼會修改key值&#xff0c;編譯時出現錯誤…

能量提升法三:贊美

前情回顧&#xff1a; 《能量提升法二&#xff1a;感恩》 片段&#xff1a;“感恩&#xff0c;就像是在跟世界說&#xff1a;謝謝你&#xff0c;我收到了&#xff0c;我很喜歡&#xff0c;請多來點” 把它歸還人海&#xff0c;就當作每一個人&#xff0c;都有可能是曾經幫助…

25美賽ABCDEF題詳細建模過程+可視化圖表+參考論文+寫作模版+數據預處理

詳情見該鏈接&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 25美國大學生數學建模如何準備&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;-CSDN博客文章瀏覽閱讀791次&#xff0c;點贊13次&#xff0c;收藏7次。通過了解比賽基本…

2025企業繁體鏡像站鏡像站群版 | 干擾碼+拼音插入

技術背景 高效的SEO優化和內容采集是企業站群系統的核心競爭力。本文將詳細介紹一套企業級網站鏡像工具包&#xff0c;重點展示其在SEO優化、內容采集、智能處理等方面的創新實現。 系統特性 1. SEO優化功能 關鍵詞智能布局標題標簽優化鏈接結構優化移動端適配頁面加速優化…

動態規劃<九>兩個數組的dp

目錄 引例 LeetCode經典OJ題 1.第一題 2.第二題 3.第三題 4.第四題 5.第五題 6.第六題 7.第七題 引例 OJ傳送門LeetCode<1143>最長公共子序列 畫圖分析&#xff1a; 使用動態規劃解決 1.狀態表示 ------經驗題目要求 經驗為選取第一個字符串的[0,i]區間以及第二個字…

大數據學習之SCALA分布式語言三

7.集合類 111.可變set一 112.可變set二 113.不可變MAP集合一 114.不可變MAP集合二 115.不可變MAP集合三 116.可變map一 package com . itbaizhan . chapter07 //TODO 2. 使用 mutable.Map 前導入如下包 import scala . collection . mutable // 可變 Map 集合 object Ma…

MongoDB中常用的幾種高可用技術方案及優缺點

MongoDB 的高可用性方案主要依賴于其內置的 副本集 (Replica Set) 和 Sharding 機制。下面是一些常見的高可用性技術方案&#xff1a; 1. 副本集 (Replica Set) 副本集是 MongoDB 提供的主要高可用性解決方案&#xff0c;確保數據在多個節點之間的冗余存儲和自動故障恢復。副…

基于OSAL的嵌入式裸機事件驅動框架——整體架構調度機制

參考B站up主【架構分析】嵌入式祼機事件驅動框架 感謝大佬分享 任務ID &#xff1a; TASK_XXX TASK_XXX 在系統中每個任務的ID是唯一的&#xff0c;范圍是 0 to 0xFFFE&#xff0c;0xFFFF保留為SYS_TSK_INIT。 同時任務ID的大小也充當任務調度的優先級&#xff0c;ID越大&#…

WGCLOUD運維工具從入門到精通 - 如何設置主題背景

需要升級到WGCLOUD的v3.5.7或者以上版本&#xff0c;才會支持自定義設置主題背景色 WGCLOUD下載&#xff1a;www.wgstart.com 我們登錄后&#xff0c;在右上角點擊如下的小圖標&#xff0c;就可以設置主題背景色了&#xff0c;包括&#xff1a;經典白&#xff08;默認&#x…

LigerUI在MVC模式下的響應原則

LigerUI是基于jQuery的UI框架&#xff0c;故他也是遵守jQuery的開發模式&#xff0c;但是也具有其特色的偵聽函數&#xff0c;那么當LigerUI作為View層的時候&#xff0c;他所發送后端的必然是表單的數據&#xff0c;在此我們以倆個div為例&#xff1a; {Layout "~/View…

基于RIP的MGRE VPN綜合實驗

實驗拓撲 實驗需求 1、R5為ISP&#xff0c;只能進行IP地址配置&#xff0c;其所有地址均配為公有IP地址&#xff1b; 2、R1和R5間使用PPP的PAP認證&#xff0c;R5為主認證方&#xff1b; R2與R5之間使用ppp的CHAP認證&#xff0c;R5為主認證方&#xff1b; R3與R5之間使用HDLC封…

git的理解與使用

本地的git git除了最經典的add commit push用來做版本管理&#xff0c;其實他的分支管理也非常強大 可以說你學好了分支管理&#xff0c;就可以完成團隊的配合協作了 git倉庫 我們可以使用git init來初始化一個git倉庫&#xff0c;只要能看見.git文件夾&#xff0c;就代表這…

Java 編程初體驗

Java學習資料 Java學習資料 Java學習資料 一、引言 在當今數字化的時代&#xff0c;編程已然成為一項極具價值的技能。而 Java 作為一門廣泛應用于企業級開發、移動應用、大數據等眾多領域的編程語言&#xff0c;吸引著無數初學者投身其中。當我們初次踏入 Java 編程的世界&…