《機器學習數學基礎》補充資料:拉格朗日乘子法

瑞士數學家歐拉(Leonhard Euler,1707-1783)的大名,如雷貫耳——歐拉,是按德文發音翻譯。歐拉不僅是公認的十八世紀最偉大的數學家,還是目前史上最多產的數學家。所著的書籍及論文多達 886 部(篇),涉及非常多領域。平均每年發表約 800 頁的高水平學術論文,而且和貝多芬類似,他失明以后發表論文的速度更快了!

如果你生活在十八世紀,就可以把你遇到的數學難題寄到德國柏林科學院,交給非常厲害的歐拉來解決,他幾乎什么難題都能解出來。但當時有一個條件極值問題,歐拉長期沒能解開。

條件極值問題是這樣的,比如說我們想求 z=xyz = xyz=xy 的極值,卻有條件限制:x2+xy?y3=2x^2 + xy - y^3 = 2x2+xy?y3=2。也就是說,我們要從那些滿足方程式 x2+xy?y3=2x^2 + xy - y^3 = 2x2+xy?y3=2 的點中,選取點代入 z=xyz = xyz=xy,看看哪些點代入后會有極大值或極小值。

當時有一位初生牛犢不怕虎的青年,約瑟夫-路易?拉格朗日(Joseph-Louis Lagrange)。他 17 歲以前對數學都沒有興趣,有一天無意中讀了英國埃德蒙?哈雷(Edmund Halley,就是命名一顆彗星的那個哈雷)的文章后,開始對數學產生興趣,并開始學習數學。而在他 19 歲時,便寄了一封信給歐拉,告訴歐拉條件極值問題其實可以輕松解決。歐拉看完他的信后,抱著頭說:“天啊,這么簡單我怎么沒想到!” 隨后,拉格朗日聲名大噪,當上了皇家炮兵學校的教授,一位 19 歲的教授。日后他也做出了許多非常杰出的研究,拿破侖稱贊他是 “數學上高聳的金字塔”。

這個故事告訴我們,即使本來對數學沒有興趣也沒關系,我們還是有可能輕松學好數學的。為了幫助你成為現代的拉格朗日,我們先來學習如何求解條件極值,這個方法稱為拉格朗日乘子法(Lagrange multiplier method)。

我們先將目標函數設為 z=f(x,y)=xyz = f(x, y) = xyz=f(x,y)=xy,要求它的極值。至于條件限制,先設為 g(x,y)=x2+y2=1g(x, y) = x^2 + y^2 = 1g(x,y)=x2+y2=1?。也就是說,我們現在要從單位圓上取點,來找出哪些點會使 z=xyz = xyz=xy 取得極值。

我們先在坐標平面上,畫出 x2+y2=1x^2 + y^2 = 1x2+y2=1。然后在同一張圖上,畫出目標函數 z=xyz = xyz=xy 的等高線圖。在下圖中,畫出了 z=0.1,0.2,0.4,0.6,0.8z = 0.1, 0.2, 0.4, 0.6, 0.8z=0.1,0.2,0.4,0.6,0.8? 時的等高線。

在這里插入圖片描述

現在要從 x2+y2=1x^2 + y^2 = 1x2+y2=1 上取點代入 z=xyz = xyz=xy ,那么取的點,必然是 x2+y2=1x^2 + y^2 = 1x2+y2=1 和某條等高線的交點。在 z=0.1,0.2,0.4z = 0.1, 0.2, 0.4z=0.1,0.2,0.4 這幾條等高線,都還與條件限制 x2+y2=1x^2 + y^2 = 1x2+y2=1 有交點。但 z=0.6,0.8z = 0.6, 0.8z=0.6,0.8 這兩條,就超出范圍了,我將它們標為紅色,表示那不是我們關注的。

將某一條等高線,越往某個方向移動, zzz 值就會呈現某種趨勢,可能是越來越大或者越來越小。在這個例子中,等高線越往圓外, zzz 值就越大。我們現在要找極值,所以就拼命地將等高線往圓外拉,一直拉到不能再拉為止。什么叫做 “不能再拉” 呢?就是仍然與 x2+y2=1x^2 + y^2 = 1x2+y2=1 有交點,但再拉就會超出范圍了。什么樣的狀態,會是仍有交點,但再拉就會超出范圍呢?就是相切的時候!

所以,我們要找的那些點,就是條件限制 x2+y2=1x^2 + y^2 = 1x2+y2=1 與目標函數 z=xyz = xyz=xy? 的等高線相切的那些點。至于,什么叫做 “相切” 呢?相切即是,它們在某個點的法向量是平行的!而該點稱為切點。于是,我們現在只要分別求條件限制 g(x,y)=x2+y2=1g(x, y) = x^2 + y^2 = 1g(x,y)=x2+y2=1 與各等高線 f(x,y)=xy=ckf(x, y) = xy = c_kf(x,y)=xy=ck? 的法向量,并解出使它們平行的條件即可。

如果對一個隱函數取梯度后,再代入點 PPP ,就會得到它在點 PPP 處的法向量。而我們的條件限制 g(x,y)=x2+y2=1g(x, y) = x^2 + y^2 = 1g(x,y)=x2+y2=1 與各等高線 f(x,y)=xy=ckf(x, y) = xy = c_kf(x,y)=xy=ck? ,確實都是隱函數的形式。至于兩個向量平行,就是其中一個向量為另一個向量的常數倍。例如 (3,2)(3, 2)(3,2)(?6,?4)(-6, -4)(?6,?4) 平行,可寫成 (?6,?4)=?2(3,2)(-6, -4) = -2(3, 2)(?6,?4)=?2(3,2)

所以總結以上,我們需要求解:
?f(x,y)=λ?g(x,y) \nabla f(x, y) = \lambda \nabla g(x, y) ?f(x,y)=λ?g(x,y)
也就是
{fx(x,y)=λgx(x,y)fy(x,y)=λgy(x,y)\begin{cases} f_x(x, y) = \lambda g_x(x, y) \\ f_y(x, y) = \lambda g_y(x, y) \end{cases} {fx?(x,y)=λgx?(x,y)fy?(x,y)=λgy?(x,y)?
解出符合條件的 (x,y)(x, y)(x,y) 。至于其中的 λ\lambdaλ ,稱為拉格朗日乘子(Lagrange multiplier)。

為什么要用 λ\lambdaλ 這個符號,可能是因為拉格朗日(Lagrange)的首字母 LLL 對應的希臘字母是 λ\lambdaλ

另外也別忘了,我們所找出的點,一定要滿足條件限制 g(x,y)g(x, y)g(x,y) 。所以準確地說,應該是:

Lagrange 乘子法(Lagrange multiplier method)

在條件限制 g(x,y)=kg(x,y)=kg(x,y)=k 的條件下,求目標函數 f(x,y)f(x,y)f(x,y) 的極值。先求出所有的 (x,y,λ)(x, y, \lambda)(x,y,λ) 滿足:
{fx(x,y)=λgx(x,y)fy(x,y)=λgy(x,y)g(x,y)=k \begin{cases} f_x(x,y)=\lambda g_x(x,y) \\f_y(x, y)=\lambda g_y(x,y) \\g(x,y)=k \end{cases} ????fx?(x,y)=λgx?(x,y)fy?(x,y)=λgy?(x,y)g(x,y)=k?
然后解出這些 (x,y)(x,y)(x,y),代入到目標函數 f(x,y)f(x,y)f(x,y) 中,得到最大的即為極大值,最小的即為極小值。

f(x,y)=x2+y2f(x,y) = x^2 + y^2f(x,y)=x2+y2 的極值,條件為 x2?2x+y2?4y=0x^2 - 2x + y^2 - 4y = 0x2?2x+y2?4y=0

解:

設約束條件為 g(x,y)=x2?2x+y2?4y=0g(x,y) = x^2 - 2x + y^2 - 4y = 0g(x,y)=x2?2x+y2?4y=0,根據拉格朗日乘數法,列聯立方程組:
{2x=λ(2x?2)(梯度分量相等,fx=λgx)2y=λ(2y?4)(梯度分量相等,fy=λgy)x2?2x+y2?4y=0(滿足約束條件) \begin{cases} 2x = \lambda (2x - 2) \quad \text{(梯度分量相等,$f_x = \lambda g_x$)} \\ 2y = \lambda (2y - 4) \quad \text{(梯度分量相等,$f_y = \lambda g_y$)} \\ x^2 - 2x + y^2 - 4y = 0 \quad \text{(滿足約束條件)} \end{cases} ????2x=λ(2x?2)(梯度分量相等,fx?=λgx?2y=λ(2y?4)(梯度分量相等,fy?=λgy?x2?2x+y2?4y=0(滿足約束條件)?
步驟 1:消去拉格朗日乘子 λ\boldsymbol{\lambda}λ

從前兩個方程解 λ\lambdaλ?(若分母非零):

  • 2x?2≠02x - 2 \neq 02x?2=0(即 x≠1x \neq 1x=1),則 λ=2x2x?2=xx?1\lambda = \dfrac{2x}{2x - 2} = \dfrac{x}{x - 1}λ=2x?22x?=x?1x?

  • 2y?4≠02y - 4 \neq 02y?4=0(即 y≠2y \neq 2y=2),則 λ=2y2y?4=yy?2\lambda = \dfrac{2y}{2y - 4} = \dfrac{y}{y - 2}λ=2y?42y?=y?2y?

令兩式相等:
xx?1=yy?2 \dfrac{x}{x - 1} = \dfrac{y}{y - 2} x?1x?=y?2y?
交叉相乘化簡:
x(y?2)=y(x?1)?????xy?2x=xy?y?????y=2x x(y - 2) = y(x - 1) \implies xy - 2x = xy - y \implies y = 2x x(y?2)=y(x?1)?xy?2x=xy?y?y=2x
步驟 2:代入約束條件求解 (x,y)(x, y)(x,y)

y=2xy = 2xy=2x 代入約束條件 x2?2x+y2?4y=0x^2 - 2x + y^2 - 4y = 0x2?2x+y2?4y=0
x2?2x+(2x)2?4?(2x)=0x2?2x+4x2?8x=05x2?10x=05x(x?2)=0 \begin{align*} x^2 - 2x + (2x)^2 - 4 \cdot (2x) &= 0 \\ x^2 - 2x + 4x^2 - 8x &= 0 \\ 5x^2 - 10x &= 0 \\ 5x(x - 2) &= 0 \end{align*} x2?2x+(2x)2?4?(2x)x2?2x+4x2?8x5x2?10x5x(x?2)?=0=0=0=0?
解得:

  • x=0x = 0x=0,對應 y=2?0=0y = 2 \cdot 0 = 0y=2?0=0

  • x=2x = 2x=2,對應 y=2?2=4y = 2 \cdot 2 = 4y=2?2=4

步驟 3:驗證 λ=0\boldsymbol{\lambda = 0}λ=0 的特殊情況

λ=0\lambda = 0λ=0,代入前兩個方程:

  • 2x=0?????x=02x = 0 \implies x = 02x=0?x=0

  • 2y=0?????y=02y = 0 \implies y = 02y=0?y=0

驗證約束條件:02?2?0+02?4?0=00^2 - 2 \cdot 0 + 0^2 - 4 \cdot 0 = 002?2?0+02?4?0=0,滿足條件,故 (0,0)(0, 0)(0,0) 也是解。

步驟 4:計算函數值并判斷極值

將兩點代入 f(x,y)=x2+y2f(x,y) = x^2 + y^2f(x,y)=x2+y2

  • f(0,0)=02+02=0f(0, 0) = 0^2 + 0^2 = 0f(0,0)=02+02=0

  • f(2,4)=22+42=20f(2, 4) = 2^2 + 4^2 = 20f(2,4)=22+42=20

幾何意義補充(輔助理解)

約束條件配方為:(x?1)2+(y?2)2=5(x - 1)^2 + (y - 2)^2 = 5(x?1)2+(y?2)2=5

這是 (1,2)(1, 2)(1,2) 為圓心、5\sqrt{5}5? 為半徑的圓

  • f(x,y)f(x,y)f(x,y) 表示點 (x,y)(x,y)(x,y)原點的距離的平方。

  • 原點到圓心 (1,2)(1, 2)(1,2) 的距離為 12+22=5\sqrt{1^2 + 2^2} = \sqrt{5}12+22?=5?(等于圓的半徑),說明 原點在圓上(對應點 (0,0)(0,0)(0,0),距離最小為 0);

  • (2,4)(2, 4)(2,4) 是圓上離原點最遠的點(距離平方為 20)。

因此,f(0,0)=0f(0, 0) = 0f(0,0)=0極小值f(2,4)=20f(2, 4) = 20f(2,4)=20? 是極大值

拉格朗日乘子法的流程并不困難,就算你不明白它背后的原理,只是把這個方法死記下來也能使用。難就難在解聯立方程的時候,技巧千變萬化,沒有固定的方法。

程序實現

以下是使用Python實現拉格朗日乘子法的代碼。

方法1:符號解法(使用SymPy)

import sympy as spdef lagrange_multiplier(f, constraints, variables):"""符號解法實現拉格朗日乘子法:param f: 目標函數:param constraints: 等式約束列表 [g1, g2, ...]:param variables: 變量列表 [x1, x2, ...]:return: 極值點及乘子組成的字典"""# 創建拉格朗日乘子符號lambdas = sp.symbols(f'λ1:{len(constraints)+1}')# 構造拉格朗日函數L = ffor i, con in enumerate(constraints):L += lambdas[i] * con# 生成方程組equations = []for var in variables:equations.append(sp.diff(L, var))equations.extend(constraints)# 求解方程組all_vars = list(variables) + list(lambdas)solutions = sp.solve(equations, all_vars, dict=True)return solutions# 示例:求 f(x,y) = x2 + 2y2 在約束 x + y - 1 = 0 下的極值
if __name__ == "__main__":# 定義變量x, y = sp.symbols('x y')# 定義目標函數和約束f = x**2 + 2*y**2constraints = [x + y - 1]  # 等式約束列表# 調用拉格朗日乘子法solutions = lagrange_multiplier(f, constraints, [x, y])# 打印結果print("符號解法結果:")for i, sol in enumerate(solutions):print(f"解{i+1}:")print(f"  x = {sol[x]}, y = {sol[y]}, λ = {sol[sp.Symbol('λ1')]}")print(f"  目標函數值: {f.subs({x: sol[x], y: sol[y]})}\n")

輸出示例

符號解法結果:
解1:x = 2/3, y = 1/3, λ = -4/3目標函數值: 2/3

方法2:數值解法(使用SciPy)

import numpy as np
from scipy.optimize import minimizedef lagrange_numeric():"""數值解法實現拉格朗日乘子法"""# 目標函數def f(X):x, y = Xreturn x**2 + 2*y**2# 約束條件(字典形式)cons = ({'type': 'eq', 'fun': lambda X: X[0] + X[1] - 1})# 初始猜測點initial_guess = np.array([0.0, 0.0])# 使用SLSQP算法求解result = minimize(f, initial_guess, constraints=cons, method='SLSQP')return result# 示例求解
if __name__ == "__main__":res = lagrange_numeric()print("\n數值解法結果:")print(f"最優解: x = {res.x[0]:.6f}, y = {res.x[1]:.6f}")print(f"目標函數值: {res.fun:.6f}")print(f"是否成功: {res.success}")print(f"迭代次數: {res.nit}")

輸出示例

數值解法結果:
最優解: x = 0.666667, y = 0.333333
目標函數值: 0.666667
是否成功: True
迭代次數: 2

方法3:KKT系統求解法(多約束通用)

from scipy.optimize import fsolve
import numpy as npdef lagrange_kkt(f, gradf, constraints, grad_constraints, initial_guess):"""求解KKT系統的數值方法(支持多約束):param f: 目標函數(未使用,僅為接口一致):param gradf: 目標函數梯度:param constraints: 約束函數列表 [g1, g2, ...]:param grad_constraints: 約束梯度列表 [?g1, ?g2, ...]:param initial_guess: 初始猜測 [x1, x2, ..., λ1, λ2, ...]:return: 解向量"""n_vars = len(initial_guess) - len(constraints)def equations(vars):# 拆分變量和乘子x = vars[:n_vars]lambdas = vars[n_vars:]# 梯度方程: ?f + Σλi?gi = 0grad_eq = gradf(x) for i, grad_con in enumerate(grad_constraints):grad_eq += lambdas[i] * grad_con(x)# 約束方程: gi(x) = 0con_eq = [con(x) for con in constraints]return np.concatenate([grad_eq, con_eq])return fsolve(equations, initial_guess)# 示例:求解多約束問題
if __name__ == "__main__":# 問題:min x2 + y2 + z2# 約束: #   x + y - 1 = 0#   y + z - 2 = 0# 定義梯度函數gradf = lambda X: np.array([2*X[0], 2*X[1], 2*X[2]])# 定義約束及其梯度constraints = [lambda X: X[0] + X[1] - 1,lambda X: X[1] + X[2] - 2]grad_constraints = [lambda X: np.array([1, 1, 0]),lambda X: np.array([0, 1, 1])]# 初始猜測 [x, y, z, λ1, λ2]initial_guess = np.array([0.0, 0.0, 0.0, 0.0, 0.0])# 求解KKT系統solution = lagrange_kkt(None, gradf, constraints, grad_constraints, initial_guess)print("\nKKT系統解法結果:")print(f"x = {solution[0]:.6f}, y = {solution[1]:.6f}, z = {solution[2]:.6f}")print(f"λ1 = {solution[3]:.6f}, λ2 = {solution[4]:.6f}")print(f"目標函數值: {sum(x**2 for x in solution[:3]):.6f}")

輸出示例

KKT系統解法結果:
x = 0.000000, y = 1.000000, z = 1.000000
λ1 = 0.000000, λ2 = -2.000000
目標函數值: 2.000000

方法4:深度學習方法

import numpy as np
import tensorflow as tf
from tensorflow import keras
from scipy.optimize import minimize# 定義神經網絡架構
def create_optimizer_model(input_dim, output_dim):"""創建用于預測拉格朗日乘子法解的神經網絡模型參數:input_dim: 輸入維度 (目標函數參數+約束參數)output_dim: 輸出維度 (解向量維度)"""model = keras.Sequential([keras.layers.Input(shape=(input_dim,)),keras.layers.Dense(64, activation='relu'),keras.layers.Dense(64, activation='relu'),keras.layers.Dense(output_dim)  # 輸出解向量])return model# 生成訓練數據
def generate_training_data(num_samples, problem_dim):"""生成訓練數據: 隨機問題參數和對應的數值解參數:num_samples: 樣本數量problem_dim: 問題維度 (變量數+約束數)"""# 隨機生成目標函數參數和約束參數problem_params = np.random.rand(num_samples, problem_dim)# 存儲數值解solutions = np.zeros((num_samples, problem_dim))# 為每個樣本計算數值解for i in range(num_samples):# 使用scipy計算數值解 (替代原solve_lagrange)res = minimize(fun=lambda x: np.sum((x - problem_params[i, :problem_dim//2])**2),  # 示例目標函數x0=np.zeros(problem_dim//2),  # 初始猜測constraints={'type': 'eq', 'fun': lambda x: np.sum(x) - problem_params[i, -1]},method='SLSQP')solutions[i, :len(res.x)] = res.xreturn problem_params, solutions# 自定義損失函數
def custom_loss(y_true, y_pred):"""均方誤差損失函數"""return tf.reduce_mean(tf.square(y_true - y_pred))# 主程序
if __name__ == "__main__":# 參數設置problem_dim = 6  # 問題維度 (例如: 3個變量 + 3個約束參數)output_dim = 3   # 輸出維度 (解向量維度, 等于變量數)num_samples = 1000  # 訓練樣本數量# 創建神經網絡模型optimizer_model = create_optimizer_model(problem_dim, output_dim)optimizer_model.compile(optimizer='adam', loss=custom_loss)# 生成訓練數據problem_params, solutions = generate_training_data(num_samples, problem_dim)# 訓練神經網絡print("開始訓練神經網絡...")history = optimizer_model.fit(problem_params, solutions, epochs=50, batch_size=32,validation_split=0.2)print("\n訓練完成!")print(f"最終訓練損失: {history.history['loss'][-1]:.4f}")print(f"最終驗證損失: {history.history['val_loss'][-1]:.4f}")# 測試神經網絡預測test_params = np.random.rand(1, problem_dim)prediction = optimizer_model.predict(test_params)print(f"\n測試輸入: {test_params[0]}")print(f"預測解: {prediction[0]}")

《機器學習數學基礎》一書在各大平臺有售,請認準作者、出版社
在這里插入圖片描述

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

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

相關文章

【PTA數據結構 | C語言版】二叉堆的樸素建堆操作

本專欄持續輸出數據結構題目集,歡迎訂閱。 文章目錄題目代碼題目 請編寫程序,將 n 個順序存儲的數據用樸素建堆操作調整為最小堆;最后順次輸出堆中元素以檢驗操作的正確性。 輸入格式: 輸入首先給出一個正整數 c(≤1…

深入解析PyQt5信號與槽的高級玩法:解鎖GUI開發新姿勢

信號與槽機制是PyQt框架實現組件間通信的核心技術。掌握其高級用法能極大提升開發效率和代碼靈活性。本文將通過六大核心模塊,結合實戰案例,全方位解析信號與槽的進階使用技巧。自定義信號與槽的完全指南 1. 信號定義規范 class CustomWidget(QWidget):#…

gitee某個分支合并到gitlab目標分支

一、克隆Gitee倉庫到本地 git clone https://gitee.com/用戶名/倉庫名.gitcd 倉庫名二、添加 GitLab 倉庫作為遠程倉庫 git remote add gitlab https://gitlab.com/用戶名/倉庫名.git三、查看所有遠程倉庫 git remote -v四、拉取 Gitee 上的目標分支 git fetch origin 分支名五…

PyQt5信號與槽(信號與槽的高級玩法)

信號與槽的高級玩法 高級自定義信號與槽 所謂高級自定義信號與槽,指的是我們可以以自己喜歡的方式定義信號與槽函 數,并傳遞參數。自定義信號的一般流程如下: (1)定義信號。 (2)定義槽函數。 &a…

第5天 | openGauss中一個用戶可以訪問多個數據庫

接著昨天繼續學習openGauss,今天是第五天了。今天學習內容是使用一個用戶訪問多個數據庫。 老規矩,先登陸墨天輪為我準備的實訓實驗室 rootmodb:~# su - omm ommmodb:~$ gsql -r創建表空間music_tbs、數據庫musicdb10 、用戶user10 并賦予 sysadmin權限 omm# CREATE…

Vue3 Anime.js超級炫酷的網頁動畫庫詳解

簡介 Anime.js 是一個輕量級的 JavaScript 動畫庫&#xff0c;它提供了簡單而強大的 API 來創建各種復雜的動畫效果。以下是 Anime.js 的主要使用方法和特性&#xff1a; 安裝 npm install animejs 基本用法 <script setup> import { ref, onMounted } from "vu…

苦練Python第18天:Python異常處理錦囊

苦練Python第18天&#xff1a;Python異常處理錦囊 原文鏈接&#xff1a;https://dev.to/therahul_gupta/day-18100-exception-handling-with-try-except-in-python-3m5a 作者&#xff1a;Rahul Gupta 譯者&#xff1a;倔強青銅三 前言 大家好&#xff0c;我是倔強青銅三。是一名…

JVM——如何對java的垃圾回收機制調優?

GC 調優的核心思路就是盡可能的使對象在年輕代被回收&#xff0c;減少對象進入老年代。 具體調優還是得看場景根據 GC 日志具體分析&#xff0c;常見的需要關注的指標是 Young GC 和 Full GC 觸發頻率、原因、晉升的速率、老年代內存占用量等等。 比如發現頻繁會產生 Ful GC&am…

正則表達式使用示例

下面以 Vue&#xff08;前端&#xff09;和 Spring Boot&#xff08;后端&#xff09;為例&#xff0c;展示正則表達式在前后端交互中的應用&#xff0c;以郵箱格式驗證為場景&#xff1a;1.前端<template><div class"register-container"><h3>用戶…

云端微光,AI啟航:低代碼開發的智造未來

文章目錄前言一、引言&#xff1a;技術浪潮中的個人視角初次體驗騰訊云開發 Copilot1.1 低代碼的時代機遇1.1.1 為什么低代碼如此重要&#xff1f;1.2 AI 的引入&#xff1a;革新的力量1.1.2 Copilot 的亮點1.3 初學者的視角1.3.1 Copilot 帶來的改變二、體驗記錄&#xff1a;云…

圖片上傳實現

圖片上傳change函數圖片上傳圖片上傳到服務器上傳的圖片在該頁面中顯示修改界面代碼最終實現效果change函數 這里我們先用輸入框控件來舉例&#xff1a; 姓名&#xff1a;<input typetext classname>下面我們來寫 js 語句&#xff0c;對控件進行綁事件來獲取輸入框內的…

【PTA數據結構 | C語言版】多叉堆的上下調整

本專欄持續輸出數據結構題目集&#xff0c;歡迎訂閱。 文章目錄題目代碼題目 請編寫程序&#xff0c;將 n 個已經滿足 d 叉最小堆順序約束的數據直接讀入最小堆&#xff1b;隨后將下一個讀入的數據 x 插入堆&#xff1b;再執行刪頂操作并輸出刪頂的元素&#xff1b;最后順次輸…

selenium后續!!

小項目案例:實現批量下載網頁中的資源根據15.3.2小節中的返回網頁內容可知,用戶只有獲取了網頁中的圖片url才可以將圖片下載到*在使用selenium庫渲染網頁后,可直接通過正則表達式過濾出指定的網頁圖片&#xff0c;從而實現批量下載接下來以此為思路來實現一個小項目案例。項目任…

深度解析Linux文件I/O三級緩沖體系:用戶緩沖區→標準I/O→內核頁緩存

在Linux文件I/O操作中&#xff0c;緩沖區的管理是一個核心概念&#xff0c;主要涉及用戶空間緩沖區和內核空間緩沖區。理解這兩者的區別和工作原理對于高效的文件操作至關重要。 目錄 一、什么是緩沖區 二、為什么要引入緩沖區機制 三、三級緩沖體系 1、三級緩沖體系全景圖…

【每日算法】專題十三_隊列 + 寬搜(bfs)

1. 算法思路 BFS 算法核心思路 BFS&#xff08;廣度優先搜索&#xff09;使用 隊列&#xff08;Queue&#xff09;按層級順序遍歷圖或樹的節點。以下是 C 實現的核心思路和代碼模板&#xff1a; 算法框架 #include <queue> #include <vector> #include <un…

【動手實驗】發送接收窗口對 TCP傳輸性能的影響

環境準備 服務器信息 兩臺騰訊云機器 t04&#xff08;172.19.0.4&#xff09;、t11&#xff08;172.19.0.11&#xff09;&#xff0c;系統為 Ubuntu 22.04&#xff0c;內核為 5.15.0-139-generic。默認 RT 在 0.16s 左右。 $ ping 172.19.0.4 PING 172.19.0.4 (172.19.0.4) …

28、鴻蒙Harmony Next開發:不依賴UI組件的全局氣泡提示 (openPopup)和不依賴UI組件的全局菜單 (openMenu)、Toast

目錄 不依賴UI組件的全局氣泡提示 (openPopup) 彈出氣泡 創建ComponentContent 綁定組件信息 設置彈出氣泡樣式 更新氣泡樣式 關閉氣泡 在HAR包中使用全局氣泡提示 不依賴UI組件的全局菜單 (openMenu) 彈出菜單 創建ComponentContent 綁定組件信息 設置彈出菜單樣…

讓老舊醫療設備“聽懂”新語言:CAN轉EtherCAT的醫療行業應用

在醫療影像設備的智能化升級中&#xff0c;通信協議的兼容性常成為工程師的“痛點”。例如&#xff0c;某醫院的移動式X射線機采用CAN協議控制機械臂&#xff0c;而主控系統基于EtherCAT架構。兩者協議差異導致數據延遲高達5ms&#xff0c;影像定位精度下降&#xff0c;甚至影響…

ubuntu基礎搭建

ubuntu上docker的搭建 https://vulhub.org/zh 網站最下面找到開始使用&#xff0c;有搭建的命令//安裝docker&#xff0c;連接失敗多試幾次 curl -fsSL https://get.docker.com | sh //驗證Docker是否正確安裝&#xff1a; docker version //還要驗證Docker Compose是否可用&am…

動態規劃 + DFS + 記憶化!Swift 解 LeetCode 329 的實戰筆記

文章目錄摘要描述題解答案題解代碼分析代碼解析示例測試及結果時間復雜度空間復雜度總結摘要 這篇文章帶你用 Swift 實戰一道非常經典的 DFS 記憶化搜索題目 —— LeetCode 329《矩陣中的最長遞增路徑》。看似一個簡單的“走格子”游戲&#xff0c;實則考察了搜索順序、剪枝策…