2025-03-23 吳恩達機器學習3——多維特征

文章目錄

  • 1 多元引入
  • 2 矢量化
    • 2.1 示例
    • 2.2 非矢量化實現
    • 2.3 矢量化實現
    • 2.4 應用
  • 3 特征縮放
    • 3.1 舉例
    • 3.2 必要性
    • 3.3 方法
      • 3.3.1 最大最小值縮放(Min-Max Scaling)
      • 3.3.2 均值歸一化(Mean Normalization)
      • 3.3.3 Z 分數歸一化(Z-Score Normalization)
    • 3.4 小結
  • 4 梯度下降與學習率
    • 4.1 梯度下降
    • 4.2 學習率
  • 5 特征工程
    • 5.1 示例
    • 5.2 創建特征
  • 6 多項式回歸

1 多元引入

? 在原始的線性回歸模型中,我們只有一個特征 x x x(例如房屋的大小),并預測目標變量 y y y(例如房屋的價格)。模型的形式為:
f w , b ( x ) = w x + b f_{w,b}(x)=wx+b fw,b?(x)=wx+b
? 然而,在實際應用中,我們通常有多個特征來預測目標變量。例如,

  • 房屋大小
  • 臥室數量
  • 樓層數量
  • 房屋的使用年限

? 這些額外的特征可以提供更多的信息,幫助我們更準確地預測價格。

? 為了處理多個特征,引入以下符號:

  • X 1 X_1 X1?, X 2 X_2 X2?, X 3 X_3 X3?, X 4 X_4 X4? 分別表示四個特征(例如房屋大小、臥室數量、樓層數量、房屋使用年限)。
  • X j X_j Xj? 表示第 j j j 個特征,其中 j j j 從 1 到 4。
  • n n n 表示特征的總數,在這個例子中 n = 4 n=4 n=4
  • X ( i ) X^{(i)} X(i)表示第 i i i 個訓練示例的特征向量,例如 X ( 2 ) = [ 1416 , 3 , 2 , 40 ] X^{(2)} = [1416, 3, 2, 40] X(2)=[1416,3,2,40]
  • X j ( i ) X_j^{(i)} Xj(i)? 表示第 i i i 個訓練示例的第 j j j 個特征的值,例如 X 3 ( 2 ) = 2 X_3^{(2)}=2 X3(2)?=2(表示第二個訓練示例的樓層數量)。
image-20250323122207801

? 此時,線性回歸模型的形式變為:
f w , b ( X ) = w 1 X 1 + w 2 X 2 + w 3 X 3 + w 4 X 4 + b f_{w,b}(X)=w_1X_1+w_2X_2+w_3X_3+w_4X_4+b fw,b?(X)=w1?X1?+w2?X2?+w3?X3?+w4?X4?+b
? 例如,一個可能的房價預測模型可能是:
f w , b ( X ) = 0.1 X 1 + 4 X 2 + 10 X 3 ? 2 X 4 + 80 f_{w,b}(X)=0.1X_1+4X_2+10X_3-2X_4+80 fw,b?(X)=0.1X1?+4X2?+10X3??2X4?+80

  • b = 80 b=80 b=80 表示房屋的基本價格為 80,000 美元(假設沒有大小、臥室、樓層和年齡)。
  • w 1 = 0.1 w1=0.1 w1=0.1 表示每增加一平方英尺,價格增加 100 美元。
  • w 2 = 4 w2=4 w2=4 表示每增加一個臥室,價格增加 4,000 美元。
  • w 3 = 10 w3=10 w3=10 表示每增加一層,價格增加 10,000 美元。
  • w 4 = ? 2 w4=?2 w4=?2 表示每增加一年房屋使用年限,價格減少 2,000 美元。
image-20250323122524158

? 為了簡化表示,我們可以將參數 w w w 和特征 X X X 表示為向量:
w ? = [ w 1 , w 2 , ? , w n ] X ? = [ X 1 , X 2 , ? , X n ] \vec{w}=[w_1,w_2,\cdots,w_n]\\ \vec{X}=[X_1,X_2,\cdots,X_n] w =[w1?,w2?,?,wn?]X =[X1?,X2?,?,Xn?]
? 因此,模型可表示為:
f w , b ( X ) = w ? ? X ? + b f_{w,b}(X)=\vec{w}\cdot\vec{X}+b fw,b?(X)=w ?X +b
? 這里的點積是兩個向量的對應元素相乘后求和的結果:
w ? ? X ? = w 1 X 1 + w 2 X 2 + ? + w n X n \vec{w}\cdot\vec{X}=w_1X_1+w_2X_2+\cdots+w_nX_n w ?X =w1?X1?+w2?X2?+?+wn?Xn?
image-20250323122822263

2 矢量化

? 矢量化是一種將操作應用于整個向量或矩陣的技術,而不是逐個元素進行處理。在機器學習中,矢量化可以極大地提高代碼的效率,尤其是在處理大規模數據集時。

? 矢量化不僅可以縮短代碼,還能顯著提高算法的運行效率。通過編寫矢量化代碼,您可以利用現代數值線性代數庫(如 NumPy)以及 GPU(圖形處理單元)硬件,從而加速計算過程。

2.1 示例

? 假設我們有一個線性回歸模型,參數為 w w w b b b,其中 w w w 是一個包含三個數字的向量,特征向量 x x x 也包含三個數字。這里 n = 3 n=3 n=3

import numpy as npw = np.array([1.0, 2.5, -3.3])  # 參數向量
x = np.array([10, 20, 30])  # 特征向量
b = 4  # 偏置項

? 在 Python 中,數組的索引從 0 開始,因此:

  • w [ 0 ] w[0] w[0] 對應 w 1 w_1 w1?
  • w [ 1 ] w[1] w[1] 對應 w 2 w_2 w2?
  • w [ 2 ] w[2] w[2] 對應 w 3 w_3 w3?
image-20250323124435323

2.2 非矢量化實現

方法 1:逐個元素計算

f = w[0] * x[0] + w[1] * x[1] + w[2] * x[2] + b

? 這種方法在 n n n 較小時可行,但當 n n n 很大時(例如 100 或 100,000),代碼會變得冗長且效率低下。

方法 2:使用 for 循環

f = 0
for j in range(3):f += w[j] * x[j]
f += b

? 雖然這種方法比逐個元素計算更簡潔,但仍然沒有利用矢量化,效率不高。

? 這種實現方式會順序執行計算,即先計算索引 0 的值,然后是索引 1,索引 2。這種方式效率較低,尤其是在 n n n 很大時。

2.3 矢量化實現

? 使用 NumPy 的 dot 函數,可以將模型的計算簡化為一行代碼:

f = np.dot(w, x) + b
  • np.dot(w, x) 計算向量 w w w x x x 的點積。
  • 點積的定義為: w ? ? x ? = w 1 x 1 + w 2 x 2 + ? + w n x n \vec{w}\cdot\vec{x}=w_1x_1+w_2x_2+\cdots+w_nx_n w ?x =w1?x1?+w2?x2?+?+wn?xn?

矢量化的優勢

  1. 代碼更簡潔

    矢量化將復雜的計算簡化為一行代碼,使代碼更易讀、更易維護。

  2. 運行效率更高

    矢量化利用現代計算機的并行計算能力,尤其是在使用 GPU 時,可以顯著加速計算過程。

底層原理

  • NumPy 的 dot 函數能夠在計算機中使用并行硬件(如 CPU 或 GPU),從而比 for 循環或逐個元素計算更高效。
  • n n n 很大時,矢量化實現的效率優勢尤為明顯。

2.4 應用

? 假設我們有一個多元線性回歸模型,包含 16 個特征和 16 個參數 w 1 w_1 w1? w 16 w_{16} w16?。我們需要更新這些參數,公式為:
w j = w j ? α ? d j w_j=w_j-\alpha\cdot d_j wj?=wj??α?dj?
其中 α α α 是學習率, d j d _ j dj? 是導數項。

非矢量化實現

for j in range(16):w[j] = w[j] - 0.1 * d[j]

? 這種實現方式會逐個更新每個參數,效率較低。

矢量化實現

w = w - 0.1 * d

? 在矢量化實現中,計算機可以同時更新所有 16 個參數,利用并行硬件高效完成計算。

image-20250323125114820

3 特征縮放

3.1 舉例

? 假設我們有兩個特征:

  • x 1 x_ 1 x1?:房屋的大小(范圍:300 到 2000 平方英尺)
  • $ x_2$:臥室的數量(范圍:0 到 5)

? 我們使用這兩個特征來預測房屋的價格。假設一個房屋的面積為 2000 平方英尺,有 5 間臥室,價格為 500,000 美元。

  1. 參數示例 1

    • w 1 = 50 , w 2 = 0.1 , b = 50 w_1=50, w_2=0.1, b =50 w1?=50,w2?=0.1,b=50

    • 預測價格:50×2000+0.1×5+50=100,000+0.5+50=100,050.5 千美元

    • 這個預測與實際價格 500,000 美元相差甚遠。

  2. 參數示例 2

    • w 1 = 0.1 , w 2 = 50 , b = 50 w _1=0.1, w_2=50, b =50 w1?=0.1,w2?=50,b=50

    • 預測價格:0.1×2000+50×5+50=200+250+50=500 千美元

    • 這個預測與實際價格 500,000 美元一致。

image-20250323125656329

結論

  • 當特征的值范圍較大時(如房屋大小),對應的參數 w 1 w_1 w1? 應該較小。
  • 當特征的值范圍較小時(如臥室數量),對應的參數 w 2 w_2 w2? 應該較大。

3.2 必要性

? 如果特征的值范圍差異很大,梯度下降可能會在等高線圖中來回彈跳,導致收斂速度變慢。例如:

  • x 1 x_1 x1? 的范圍較大,導致 w 1 w_1 w1? 的微小變化對成本函數 J J J 的影響較大。
  • x 2 x_2 x2? 的范圍較小,導致 w 2 w_2 w2? 的較大變化對成本函數 J J J 的影響較小。

? 這種情況下,等高線圖會呈現高瘦的橢圓形,梯度下降需要更長時間才能找到全局最小值。

image-20250323125945872

? 特征縮放通過將不同特征的值范圍調整到相似的水平,使等高線圖更接近圓形,從而優化梯度下降的路徑。具體來說:

  • x 1 x_1 x1? x 2 x_2 x2? 的值范圍都調整到 0 到 1 之間。
  • 這樣,梯度下降可以更直接地找到全局最小值。
image-20250323130051463

3.3 方法

3.3.1 最大最小值縮放(Min-Max Scaling)

? 將特征值縮放到 [ 0 , 1 ] [0,1] [0,1] 區間,公式為:
x s c a l e d = x ? x min ? x max ? ? x min ? x_{\mathrm{scaled}}=\frac{x-x_{\min}}{x_{\max}-x_{\min}} xscaled?=xmax??xmin?x?xmin??

  • 特征 x 1 x_1 x1? 的范圍為 300 到 2000。

    x 1 , s c a l e d = x 1 ? 300 2000 ? 300 x_{1,\mathrm{scaled}}=\displaystyle\frac{x_1-300}{2000-300} x1,scaled?=2000?300x1??300?

  • 特征 x 2 x_2 x2? 的范圍為 0 到 5:

    x 2 , s c a l e d = x 2 5 x_{2,\mathrm{scaled}}=\displaystyle\frac{x_2}{5} x2,scaled?=5x2??

3.3.2 均值歸一化(Mean Normalization)

? 將特征值調整到以 0 為中心,公式為:
x s c a l e d = x ? μ x max ? ? x min ? x_{\mathrm{scaled}}=\frac{x-\mu}{x_{\max}-x_{\min}} xscaled?=xmax??xmin?x?μ?

  • 特征 x 1 x_1 x1? 的均值為 600: x 1 , s c a l e d = x 1 ? 600 2000 ? 300 x_{1,\mathrm{scaled}}=\displaystyle\frac{x_1-600}{2000-300} x1,scaled?=2000?300x1??600?
    縮放后的范圍為 -0.18 到 0.82。
  • 特征 x 2 x_2 x2? 的均值為 2.3: x 2 , s c a l e d = x 2 ? 2.3 5 ? 0 x_{2,\mathrm{scaled}}=\displaystyle\frac{x_2-2.3}{5-0} x2,scaled?=5?0x2??2.3?
    縮放后的范圍為 -0.46 到 0.54。
image-20250323161919636

3.3.3 Z 分數歸一化(Z-Score Normalization)

? 將特征值調整到均值為 0,標準差為 1,公式為:
x s c a l e d = x ? μ σ x_{\mathrm{scaled}}=\frac{x-\mu}{\sigma} xscaled?=σx?μ?

  • 特征 x 1 x_1 x1? 的均值為 600,標準差為 450: x 1 , s c a l e d = x 1 ? 600 450 x_{1,\mathrm{scaled}}=\displaystyle\frac{x_1-600}{450} x1,scaled?=450x1??600?
    縮放后的范圍為 -0.67 到 3.1。
  • 特征 x 2 x_2 x2? 的均值為 2.3,標準差為 1.4: x 2 , s c a l e d = x 2 ? 2.3 1.4 x_{2,\mathrm{scaled}}=\displaystyle\frac{x_2-2.3}{1.4} x2,scaled?=1.4x2??2.3?
    縮放后的范圍為 -1.6 到 1.9。
image-20250323162138121

3.4 小結

目標范圍

? 通常將特征值調整到 -1 到 1 之間,但 -3 到 3 或 -0.3 到 0.3 也是可接受的。

特殊情況

  • 如果特征值范圍非常大(如 -100 到 100),建議進行縮放。
  • 如果特征值范圍非常小(如 -0.001 到 0.001),也可以考慮縮放。
  • 如果特征值范圍適中(如 0 到 3 或 -2 到 0.5),不縮放通常也沒有問題。
image-20250323162304136

4 梯度下降與學習率

4.1 梯度下降

? 梯度下降的目標是通過迭代更新參數 w w w b b b,以最小化成本函數 J J J。其更新規則為:
{ w = w ? α ? J ? w b = b ? α ? J ? b \left\{ \begin{aligned} & w=w-\alpha\frac{\partial J}{\partial w} \\ & b=b-\alpha\frac{\partial J}{\partial b} \end{aligned} \right. ? ? ???w=w?α?w?J?b=b?α?b?J??
? 其中, α α α 是學習率。

判斷梯度下降是否收斂的方法

  1. 繪制學習曲線

    • 學習曲線:在每次梯度下降迭代后,計算并繪制成本函數 J J J 的值。橫軸是迭代次數,縱軸是成本 J J J

    • 正常情況:如果梯度下降正常運行,成本 J J J 應該在每次迭代后逐漸減小。

    • 異常情況:如果 J J J 在某次迭代后增加,可能意味著學習率 α α α 過大,或者代碼中存在錯誤。

    • 收斂判斷:當學習曲線趨于平穩(即 J J J 不再顯著下降)時,可以認為梯度下降已經收斂。

    示例:

    • 在 100 次迭代后, J J J 的值為某個點。

    • 在 200 次迭代后, J J J 的值進一步減小。

    • 在 300 次迭代后, J J J 的值趨于平穩,表明梯度下降已收斂。

  2. 自動收斂測試

    • 定義:設置一個閾值 ? ? ?(例如 0.001),如果成本 J J J 在一次迭代中減少的幅度小于 ? ? ?,則認為梯度下降已收斂。

    • 優點:自動化判斷,無需手動繪制學習曲線。

    • 缺點:選擇合適的閾值 ? ? ? 可能比較困難。

image-20250323162418504
  • 不同應用程序中,梯度下降收斂所需的迭代次數可能差異很大。某些模型可能在 30 次迭代后收斂,而其他模型可能需要 1,000 或 100,000 次迭代。

  • 很難提前預測梯度下降需要多少次迭代才能收斂,因此繪制學習曲線是一種有效的方法。

4.2 學習率

? 選擇合適的學習率 α α α 是優化梯度下降算法的關鍵。如果學習率太小,梯度下降會收斂得很慢;如果學習率太大,梯度下降可能無法收斂,甚至發散。在本視頻中,我們將探討如何為模型選擇一個合適的學習率。

  • 學習率太小:梯度下降收斂速度很慢,需要大量迭代才能達到最小值。
  • 學習率太大:梯度下降可能無法收斂,甚至導致成本函數 J J J 在每次迭代后增加。

示例

  • 如果學習率太大,更新步驟可能會“跳過”最小值,導致成本函數 J J J 在每次迭代后波動或增加。
  • 如果學習率太小,更新步驟會非常小,導致收斂速度緩慢。
image-20250323163235805

選擇學習率的策略

  • 嘗試一系列值

    從較小的學習率開始,逐步增加,觀察成本 J J J 的變化。

    • 例如,嘗試 α = 0.001 , 0.003 , 0.01 , 0.03 , 0.1 α =0.001,0.003,0.01,0.03,0.1 α=0.001,0.003,0.01,0.03,0.1 等。
    • 對于每個 α α α,運行少量迭代,繪制成本 J J J 隨迭代次數的變化。
  • 選擇合適的學習率

    • 選擇使成本 J J J 快速且持續下降的最大可能學習率。
    • 避免選擇過大的學習率,以免導致發散。

實踐建議

  • 初始嘗試:從 α = 0.001 α =0.001 α=0.001 開始,逐步增加(例如每次增加 3 倍)。
  • 觀察曲線:繪制成本 J J J 隨迭代次數的變化,選擇使 J J J 快速下降的 α α α
  • 避免過大:確保學習率不會導致成本 J J J 增加或波動。
image-20250323163417374

5 特征工程

5.1 示例

? 假設我們有以下兩個特征來預測房屋價格:

  • x 1 x_1 x1?:地塊的寬度(臨街面)
  • x 2 x_2 x2?:地塊的深度

? 初始模型如下:
f w , b ( X ) = w 1 x 1 + w 2 x 2 + b f_{w,b}(X)=w_1x_1+w_2x_2+b fw,b?(X)=w1?x1?+w2?x2?+b
? 雖然這個模型可以正常工作,但可能不是最有效的。我們可以通過特征工程來改進模型。

5.2 創建特征

? 地塊的面積(寬度 × 深度)可能比單獨的寬度和深度更能預測房屋價格。因此,可以定義一個新特征:
x 3 = x 1 × x 2 x_3=x_1\times x_2 x3?=x1?×x2?
? 改進后的模型如下:
f w , b ( X ) = w 1 x 1 + w 2 x 2 + w 3 x 3 + b f_{w,b}(X)=w_1x_1+w_2x_2+w_3x_3+b fw,b?(X)=w1?x1?+w2?x2?+w3?x3?+b
image-20250323163659119

  • 通過轉換或組合原始特征,可以創建新的、更有意義的特征。
  • 特征工程不僅可以幫助擬合直線,還可以擬合曲線和非線性函數,從而更好地擬合數據。

6 多項式回歸

? 結合多元線性回歸特征工程的思想,提出一種稱為多項式回歸的新算法,可以將曲線和非線性函數擬合到數據中。

? 假設我們有一個房屋數據集,其中特征 x x x 是房屋的大小(以平方英尺為單位)。數據分布可能不適合用直線擬合,而是更適合用曲線擬合。

image-20250323164323628

? 多項式回歸通過將原始特征 x x x 提升為不同的冪次(如 x 2 , x 3 x_2,x_3 x2?,x3?)來創建新的特征。例如:

  • 第一個特征: x x x(房屋大小)
  • 第二個特征: x 2 x_2 x2?(房屋大小的平方)
  • 第三個特征: x 3 x_3 x3?(房屋大小的立方)
image-20250323164544315

二次函數

  • 模型 f w , b ( X ) = w 1 x 1 + w 2 x 2 2 + b f_{w,b}(X)=w_1x_1+w_2x_2^2+b fw,b?(X)=w1?x1?+w2?x22?+b
  • 優點:可以擬合數據的二次曲線。
  • 問題:二次函數最終會下降,這與房價隨面積增加而上升的預期不符。

三次函數

  • 模型 f w , b ( X ) = w 1 x 1 + w 2 x 2 2 + w 3 x 3 3 + b f_{w,b}(X)=w_1x_1+w_2x_2^2+w_3x_3^3+b fw,b?(X)=w1?x1?+w2?x22?+w3?x33?+b
  • 優點:可以擬合更復雜的曲線,更好地適應數據。
  • 特點:隨著面積的增加,曲線最終會恢復上升,符合房價的預期。

特征縮放的必要性

? 如果房屋大小的范圍是 1 到 1,000 平方英尺,那么 x 2 x_2 x2? 的范圍是 1 到 1,000,000, x 3 x_3 x3? 的范圍是 1 到 1,000,000,000。這些特征的值范圍差異很大,因此在應用梯度下降時,特征縮放變得尤為重要。

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

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

相關文章

正點原子內存管理學習和修改

由于項目需要用到內存管理進行動態申請和釋放,今天又重新學習了一下正點原子的內存管理實驗,溫習了一下內存管理的實質。首先先上正點原子內存管理的源代碼: malloc.c文件: #include "./MALLOC/malloc.h"#if !(__ARMC…

時空觀測者:俯身拾貝

目錄 中華文明時空貝殼集(按時間排序)1. 良渚玉琮(約公元前3300-2300年)2. 三星堆青銅神樹(公元前1200年)3. 殷墟甲骨文(約公元前14世紀)4. 京杭大運河(公元前486年始建&…

護網期間監測工作全解析:內容與應對策略

護網期間監測工作全解析:內容與應對策略 一、引言 在數字化浪潮中,網絡安全的重要性愈發凸顯,護網行動作為保障關鍵信息基礎設施安全的關鍵舉措,備受矚目。護網期間,監測工作是發現潛在威脅、防范攻擊的重要防線。全…

【Centos7搭建Zabbix4.x監控HCL模擬網絡設備:zabbix-server搭建及監控基礎05

蘭生幽谷,不為莫服而不芳; 君子行義,不為莫知而止休。 5.zabbix監控HCL模擬網絡設備 在保證zabbix-server與HCL網絡相通的情況下進行如下操作。 5.1創建主機群 配置-主機群-創建主機群 圖 19 取名,添加。 圖 20 5.2 創建監控…

趣味極簡品牌海報藝術貼紙設計圓潤邊緣無襯線粗體裝飾字體 Chunko Bold - Sans Serif Font

Chunko Bold 是一種功能強大的顯示字體,體現了大膽極簡主義的原則 – 當代設計的主流趨勢。這種自信的字體將粗獷的幾何形狀與現代的趣味性相結合,具有圓潤的邊緣和強烈的存在感,與當今的極簡主義設計方法完美契合。無論是用于鮮明的構圖還是…

Spring Boot(十七):集成和使用Redis

Redis(Remote Dictionary Server,遠程字典服務器)是一個開源的、基于內存的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。Spring Boot 中集成和使用Redis主要涉及以下幾個步驟: 添加依賴 在項目的pom.xml文件中添加Redis的依賴。Spring Boot提供了對Redis的集…

2025-03-21 Unity 序列化 —— 自定義2進制序列化

文章目錄 前言1 項目結構1.1 整體1.2 代碼 2 實現2.1 Processor2.1.1 BaseType2.1.2 CollectionType2.1.3 CustomType 2.2 ByteFormatter2.3 ByteHelper 3 使用 前言 ? BinaryFormatter 類可以將 C# 類對象快速轉換為字節數組數據。 ? 在網絡開發時,不會使用 Bi…

為WordPress自定義一個留言板

要在WordPress中創建一個留言反饋表單,并實現后臺管理功能,您可以按照以下步驟進行操作: 1. 創建留言反饋表單 首先,您需要使用一個表單插件來創建表單。推薦使用 Contact Form 7 或 WPForms。以下是使用 Contact Form 7 的示例…

嵌入式項目:利用心知天氣獲取天氣數據實驗方案

【實驗目的】 1、利用心知天氣服務器獲取指定位置天氣數據 2、將天氣數據解析并可視化顯示到OLED屏幕 【實驗原理】 【實驗步驟】 官網注冊

go-zero學習筆記

內容不多,只有部分筆記,剩下的沒有繼續學下去,包括路由與處理器、日志中間件、請求上下文 文章目錄 1、go-zero核心庫1.1 路由與處理器1.2 日志中間件1.3 請求上下文 1、go-zero核心庫 1.1 路由與處理器 package mainimport ("github…

【Go】Go語言繼承-多態模擬

繼承(結構體嵌入)多態(接口實現和空接口) 1. 繼承(結構體嵌入) Go 語言沒有傳統的面向對象的繼承機制,但可以通過“結構體嵌入”實現類似繼承的效果。 結構體嵌入:在結構體中嵌入另…

kotlin知識體系(四) : inline、noinline、crossinline 關鍵字對應編譯后的代碼是怎樣的 ?

kotlin中inline、noinline、crossinline 關鍵字的作用 在 Kotlin 里,inline、noinline 和 crossinline 這幾個關鍵字和高階函數緊密相關,它們能夠對高階函數的行為進行優化和控制。下面為你詳細闡述它們的作用和原理。 inline 關鍵字 inline 關鍵字用…

LabVIEW FPGA與Windows平臺數據濾波處理對比

LabVIEW在FPGA和Windows平臺均可實現數據濾波處理,但兩者的底層架構、資源限制、實時性及應用場景差異顯著。FPGA側重硬件級并行處理,適用于高實時性場景;Windows依賴軟件算法,適合復雜數據處理與可視化。本文結合具體案例&#x…

深度解析 Android Matrix 變換(二):組合變換 pre、post

前言 在上一篇文章中,我們講解了 Canvas 中單個變換的原理和效果,即縮放、旋轉和平移。但是單個旋轉僅僅是基礎,Canvas 變換最重要的是能夠隨意組合各種變換以實現想要的效果。在這種情況下,就需要了解如何組合變換,以…

Java并發編程之CountDownLatch

1. 基本原理 計數器 CountDownLatch 在創建時需要指定一個初始計數值。這個值通常代表需要等待完成的任務數或線程數。 等待與遞減 等待:調用 await() 方法的線程會被阻塞,直到計數器變為 0。遞減:每當一個任務完成后,應調用 cou…

C++|GLog開源庫的使用 如何實現自定義類型消息日志

參考: C glog使用教程與代碼演示 C第三方日志庫Glog的安裝與使用超詳解 GLOG從入門到入門 glog 設置日志級別_glog C版本代碼分析 文章目錄 日志等級自定義消息創建使用宏定義 日志等級 在 glog 中,日志的嚴重性是通過 LogSeverity 來區分的&#xff0c…

FAQ - VMware vSphere Web 控制臺中鼠標控制不了怎么辦?

問題描述 在VMware vSphere vCenter Server 的 Web 控制臺中新建了一臺 Windows Server 2008 R2 虛擬機,但是鼠標進入控制臺后,可以看見鼠標光標,但是移動卻沒有反應。 根因分析 暫無。 解決方案 選中虛擬機>操作>編輯設置>添加新…

Rust+WebAssembly:開啟瀏覽器3D渲染新時代

引言 在當今的 Web 開發領域,隨著用戶對網頁交互體驗的要求日益提高,3D 渲染技術在 Web 應用中的應用愈發廣泛。從沉浸式的 Web 游戲,到逼真的虛擬展示場景,3D 渲染引擎承擔著將虛擬 3D 世界呈現到用戶瀏覽器中的關鍵任務。其性能…

在小米AX6000中添加tailscale monitor

經過測試,發現小米路由器中的tailscale可能會因為某種原因狀態異常, 為了讓tailscale恢復正常,所以又寫了monitor用來監控: #!/bin/sh# Define Tailscale related paths TAILSCALED_PATH"/tmp/tailscale/tailscale_1.80.3_a…

表達式括號匹配(stack)(信息學奧賽一本通-1353)

【題目描述】 假設一個表達式有英文字母(小寫)、運算符(,—,?,/)和左右小(圓)括號構成,以“ ”作為表達式的結束符。請編寫一個程序檢查表達式中的左右圓括號…