Engineering a direct k-way Hypergraph Partitioning Algorithm【2017 ALENEX】

文章目錄

  • 一、作者
  • 二、摘要
  • 三、相關工作
  • 四、算法概述
  • 五、實驗結果
  • 六、主要貢獻

一、作者

??Yaroslav Akhremtsev, Tobias Heuer, Peter Sanders, Sebastian Schlag

二、摘要

??我們開發了一種快速且高質量的多層算法,能夠直接將超圖劃分為 k 個平衡的塊 —— 無需借助遞歸二分法這一迂回方式。特別是,我們的算法能有效實現強大的 FM 局部搜索啟發式算法,使其適用于復雜的 k 路情況。這對于依賴超邊所連接塊數的那些目標函數來說意義重大。此外,我們還消除了處理大型超邊的多個瓶頸,開發了一種更快的收縮算法以及一種新的局部搜索自適應停止規則。為進一步縮小超邊規模,我們基于 min - hashing 技術開發了一種將具有相似鄰域的頂點聚類的引腳稀疏化方法。大量實驗表明,我們的 KaHyPar 劃分器與其他最佳的先前系統相比具有優勢。KaHyPar 比 hMetis 更快且計算出的解更好。相比于(速度更快的)PaToH 劃分器,KaHyPar 的結果要好得多。

三、相關工作

  • 研究現狀
    • 常用工具
      • PaToH[7](科學計算)
      • hMetis[8] [9](VLSI 設計)
      • Mondriaan[10](稀疏矩陣劃分)
      • MLPart[11](電路劃分)
      • Zoltan[12]、Parkway[13]、UMPa[14](定向超圖模型,多目標)
      • kPaToH[15](多約束,固定頂點)
    • 其他文獻
      • n 級范式一直運用于基于隨機增量結構的幾何數據結構[2] [3] 和布線計劃的預處理階段[4],而且,也成功運用于圖和超圖的劃分中,例如:KaSPar[5](圖直接 k 劃分) 和 KaHyPar[1](超圖遞歸 k 劃分)。
      • 有一個未正式發表的直接 k 路 n 級劃分算法[6],盡管在部分實驗取得不錯的效果,但是運行時間比較長。
  • 準備工作
    • 術語表
termexplanation
H = ( V , E , ω ( v ) , ω ( e ) ) H=(V,E,\omega(v),\omega(e)) H=(V,E,ω(v),ω(e))H 表示超圖,V 表示超圖的頂點集,E 表示超圖的超邊集, ω \omega ω 是權重
? \epsilon ?不平衡系數
V x V_x Vx?劃分塊
E x E_x Ex?包含頂點 x 的超邊集合
d ( v ) = ∣ E v ∣ d(v)=|E_v| d(v)=Ev?頂點 v 的度
N ( v ) = { v ′ ∣ v ′ ∈ E v ∧ v ′ ≠ v } N(v)=\{v'|v'\in E_v \wedge v' \ne v\} N(v)={vvEv?v=v}頂點 v 的鄰居頂點
P = { V 1 , … , V k ∣ ∪ i = 1 k V i = V ∧ ( V i ∩ V j = ? ? i ≠ j ) } P=\{V_1,\dots,V_k | \cup_{i=1}^k V_i=V \wedge (V_i\cap V_j=\varnothing \Leftrightarrow i \ne j ) \} P={V1?,,Vk?i=1k?Vi?=V(Vi?Vj?=??i=j)}劃分 P
b ( v ) = { V i ∣ v ∈ V i } b(v)=\{V_i | v \in V_i\} b(v)={Vi?vVi?}頂點 v 所屬的劃分塊
b ( e ) = { b ( v ) ∣ v ∈ e } b(e)=\{b(v)|v \in e \} b(e)={b(v)ve}超邊 e 所屬的劃分塊
Z ( v ) = { b ( e ) ∣ e ∈ E v } ? { b ( v ) } \Zeta(v)=\{b(e)|e\in E_v\}-\{b(v)\} Z(v)={b(e)eEv?}?{b(v)}頂點 v 的鄰居劃分塊
Φ ( e , V i ) = ∣ { v ∣ v ∈ e ∧ v ∈ V i } ∣ \Phi(e,V_i)=\big|\{v| v \in e \wedge v \in V_i\}\big| Φ(e,Vi?)= ?{vvevVi?} ?超邊 e 在劃分塊 V i V_i Vi? 的頂點數量
C u t ( e ) = { ω ( e ) , ∣ b ( e ) ∣ > 1 0 , ∣ b ( e ) ∣ = 1 Cut(e)=\begin{cases} \omega(e) &, |b(e)|>1 \\ 0 &, |b(e)|=1 \end{cases} Cut(e)={ω(e)0?,b(e)>1,b(e)=1?e 的割邊權重
  • \;
    • 約束
      • 平衡約束
        ? V i ? P , ω ( V i ) ≤ ( 1 + ? ) ? ω ( V ) k ? \begin{equation} \forall V_i \subseteq P,\;\; \omega(V_i)\le(1+\epsilon) \bigg\lceil \frac{\omega(V)}{k} \bigg\rceil \end{equation} ?Vi??P,ω(Vi?)(1+?)?kω(V)????
    • 目標:
      • 最小割邊
        min ? ∑ e ∈ E C u t ( e ) \begin{equation} \min \sum\limits_{e\in E} Cut(e) \end{equation} mineE?Cut(e)??
      • 最小連接權重
        min ? ∑ e ∈ E ( b ( e ) ? 1 ) ? ω ( e ) \begin{equation} \min \sum\limits_{e\in E} \big(b(e)-1\big) \cdot \omega(e) \end{equation} mineE?(b(e)?1)?ω(e)??

四、算法概述

  • 基于 Min-Hash 的頂點劃分器【限定頂點的更新范圍】
    • 指紋【每個頂點一個指紋,第 i 輪建立 hash 表 T i T_i Ti?,使用指紋分量 g i ( v , z ( v ) ) g_i\big(v,z(v)\big) gi?(v,z(v))作為 key】
      { g i ( x , z ) = ( h i , 1 ( x ) , h i , 2 ( x ) , ? , h i , z ( x ) ) } i = 1 , 2 , ? , l \begin{equation} \{g_i(x,z)=\big(h_{i,1}(x),h_{i,2}(x),\cdots,h_{i,z}(x)\big)\}_{i=1,2,\cdots,l} \end{equation} {gi?(x,z)=(hi,1?(x),hi,2?(x),?,hi,z?(x))}i=1,2,?,l???
    • Min-Hash 簇
      H = { h σ ( v ) = min ? { σ ( e ) ∣ e ∈ E v } ∣ σ ∈ Σ } \begin{equation} H=\{h_{\sigma}(v)=\min \{ \sigma(e) | e\in E_v\}|\sigma \in \Sigma\} \end{equation} H={hσ?(v)=min{σ(e)eEv?}σΣ}??
    • hash 函數
      σ ( x ) = ( a x + b ) m o d P \begin{equation} \sigma(x)=(ax+b)\;mod\;P \end{equation} σ(x)=(ax+b)modP??
    • 構建 hash 表
      • 初始化:
        • 將所有頂點設置為活躍狀態,
        • z = 1 , h m i n = 10 , h m a x = 100 z = 1,\;h_{min}=10,\;h_{max}=100 z=1,hmin?=10,hmax?=100
        • 建立空表 T。
      • 迭代:
        • 迭代條件:存在活躍頂點 且 z ≤ h m a x z\le h_{max} zhmax?
        • 迭代過程:
          • 建立 hash 表 T ′ T' T
          • 遍歷所有活躍頂點 v,將活躍頂點按照 { g ( v , z ) , v } \{g(v,z),v\} {g(v,z),v}插入到 T ′ T' T
          • 遍歷所有活躍頂點 v:
            • 如果 ∣ T [ v ] ∣ = ∣ T ′ [ v ] ∣ |T[v]|=|T'[v]| T[v]=T[v] z ≥ h m i n z \ge h_{min} zhmin?,將 T ′ [ v ] T'[v] T[v] 的頂點全部標記為不活躍。
            • 如果 v 為活躍頂點 且 ∣ T [ v ] ∣ ≤ c m a x |T[v]| \le c_{max} T[v]cmax? z ≥ h m i n z \ge h_{min} zhmin?,將 T [ v ] T[v] T[v] 的頂點全部標記為不活躍。
          • z = z + 1 z=z+1 z=z+1
          • T = T ′ T=T' T=T
    • 自適應聚類算法
      • 初始化
        • i = 1 , c m i n = 2 , c m a x = 10 , l = 5 i=1,\;c_{min}=2,\;c_{max}=10,\;l=5 i=1,cmin?=2,cmax?=10,l=5
      • 迭代:
        • 迭代條件:如果簇的數量大于頂點數的一半 且 i ≤ l i\le l il
        • 迭代過程:
          • 構建 hash 表 T i T_i Ti?
          • 遍歷所有活躍頂點 v ,如果 ∣ T i [ v ] ∣ ≤ c m a x |T_i[v]| \le c_{max} Ti?[v]cmax? , 將 T i [ v ] T_i[v] Ti?[v] 中的頂點加入到簇 c v c_v cv? 中,并且移除 T i [ v ] T_i[v] Ti?[v]
          • 如果 c v ≥ c m i n c_v \ge c_{min} cv?cmin? c v c_v cv? 中的所有頂點都標記為不活躍。
          • i = i + 1 i=i+1 i=i+1
  • 聚類
    • 瓶頸【使用 n 級范式來消除】
      • 使用 PQ 來確定下一個聚類的頂點對
      • 聚類后更新鄰居頂點的評分函數
    • 預處理
      • 移除單頂點網絡【 ∣ e ∣ = 1 |e|=1 e=1
      • 合并平行網絡
        • 建立指紋【在聚類前】
          f ( e ) = ∑ v ∈ e v 2 \begin{equation} f(e)=\sum\limits_{v\in e}v^2 \end{equation} f(e)=ve?v2??
        • 更新指紋【合并頂點 u 和頂點 v 時,保留頂點 u】
          • 超邊 e 不包含 u 和 v ,不需要更新
          • 超邊 e 同時包含 u 和 v , f ( e ) = f ( e ) ? v 2 f(e)=f(e)-v^2 f(e)=f(e)?v2
          • 超邊 e 只包含 u ,不需要更新
          • 超邊 e 只包含 v , f ( e ) = f ( e ) ? v 2 + u 2 f(e)=f(e)-v^2+u^2 f(e)=f(e)?v2+u2【但是論文中沒有 ? v 2 -v^2 ?v2
    • 頂點合并 C ( u , v ) C(u,v) C(u,v)
      • 評分函數
        r ( u , v ) = ∑ e ∈ E u ∩ E v ω ( e ) ∣ e ∣ ? 1 \begin{equation} r(u,v)=\sum\limits_{e\in E_u \cap E_v}\frac{\omega(e)}{|e|-1} \end{equation} r(u,v)=eEu?Ev??e?1ω(e)???
      • 合并步驟【將 v 替換為 u】
        (1) ω ( u ) = ω ( u ) + ω ( v ) \omega(u)=\omega(u)+\omega(v) ω(u)=ω(u)+ω(v)
        (2) v = u ? v ∈ { E v ? E u } v=u \Leftrightarrow v\in \{E_v-E_u\} v=u?v{Ev??Eu?}
        (3)刪除 v ? v ∈ { E v ∩ E u } v \Leftrightarrow v\in \{E_v \cap E_u\} v?v{Ev?Eu?}
      • 約束【滿足約束的頂點才可以進行合并, t = 160 k t=160k t=160k
        ω ( v ) ≤ ? ω ( V ) t ? \begin{equation} \omega(v)\le \bigg\lceil \frac{\omega(V)}{t} \bigg\rceil \end{equation} ω(v)?tω(V)????
      • 停止條件:不存在滿足約束的頂點 或者 頂點數小于 t t t
  • 初始劃分
    同上篇論文的 初始劃分 一致,不過進行了優化,將被分割的網絡生成兩個小的網絡的加入到對應的劃分塊中【上一篇論文是不考慮被分割的網絡】
    n 0 = { v ∣ v ∈ e ∧ b [ v ] ∈ V 0 } n 1 = { v ∣ v ∈ e ∧ b [ v ] ∈ V 1 } \begin{equation} \begin{aligned} n_0=\{ v\; |\; v\in e \wedge b[v] \in V_0\} \\ n_1=\{ v\; |\; v\in e \wedge b[v] \in V_1\} \end{aligned} \end{equation} n0?={vveb[v]V0?}n1?={vveb[v]V1?}???
  • 局部搜索
    • 優化
      • 每個塊一個優先隊列【共計 k 個優先隊列】【 Sanchis 的算法[16],優先隊列數量為 k ( k ? 1 ) k(k-1) k(k?1)
      • 頂點 v 的移動目標只考慮鄰居塊 Z ( v ) \Zeta(v) Z(v)
    • 初始化
      • 所有優先隊列設置為空且禁用的。【禁用的優先隊列不會考慮移動增益】
      • 所有頂點都設置為不活躍的且未標記的。【未標記的頂點代表沒有移動過】
    • 局部搜索
      • 激活所有邊界頂點【如果不存在邊界頂點,跳過這一輪局部搜索】【不考慮 ∣ e ∣ > 1000 |e|>1000 e>1000 的超邊的頂點】
      • 計算邊界頂點 v 的移動增益 G i ( v ) G_i(v) Gi?(v) 并插入到對應優先隊列 Q i Q_i Qi?【只考慮頂點 v 的鄰居劃分塊 Z ( v ) \Zeta(v) Z(v)
        G i ( v ) = ∑ e ∈ E v { ω ( e ) : Φ ( e , b ( v ) ) = 1 } ? ∑ e ∈ E v { ω ( e ) : Φ ( e , V i ) = 0 } \begin{equation} G_i(v)=\sum\limits_{e \in E_v}\{\omega(e):\Phi(e,b(v))=1\}-\sum\limits_{e \in E_v}\{\omega(e):\Phi(e,V_i)=0\} \end{equation} Gi?(v)=eEv??{ω(e):Φ(e,b(v))=1}?eEv??{ω(e):Φ(e,Vi?)=0}??
      • 激活所有輕負載的優先隊列。
      • 迭代移動【一個頂點一輪至多移動一次】
        • 查詢所有激活的優先隊列,獲得最高移動增益 G i ( v ) G_i(v) Gi?(v)
        • 如果滿足平衡約束,移動該頂點 v 到劃分塊 V i V_i Vi?,并將該頂點標記不活躍且已標記。否則,則跳過。
        • 激活頂點 v 的所有不活躍的鄰居頂點
          • 如果鄰居頂點不是邊界頂點,則標記為不活躍的且從優先隊列中刪除其移動增益。
          • 如果鄰居頂點是邊界頂點,則通過 D e l t a G a i n U p d a t e ( v , V f r o m , V t o ) DeltaGainUpdate(v, V_{from}, V_{to}) DeltaGainUpdate(v,Vfrom?,Vto?) 來更新鄰居頂點的移動增益。
      • 回滾移動,直到處于最優的目標狀態。
      • 自適應停止規則: l o g n log\;n logn 步非正增益移動,則停止。
    • D e l t a G a i n U p d a t e ( v , V f r o m , V t o ) DeltaGainUpdate(v, V_{from}, V_{to}) DeltaGainUpdate(v,Vfrom?,Vto?)
      【當一個頂點 v 移動后,在目標劃分塊 V t o V_{to} Vto? 中可以連接到所有超邊,則該劃分塊對于超邊 e ∈ E v e\in E_v eEv? 來說是不可移動的。如果一個由于平衡約束而無法移動,則源劃分塊 V f r o m V_{from} Vfrom? 對于超邊 e ∈ E v e\in E_v eEv? 是不可移動的。如果源和目標劃分塊都是不可移動的,則這部分超邊 e 不進行更新】
      • 遍歷頂點 v 的所有超邊 E v E_v Ev?
        • 對于 e ∈ E v e\in E_v eEv?,遍歷超邊 e 的所有頂點 u ∈ e u\in e ue
          • 如果頂點 u 是已標記的,則跳過;【已經移動過的就不用更新了】
          • 如果 Φ ( e , V f r o m ) = 0 \Phi(e,V_{from})=0 Φ(e,Vfrom?)=0 【e 在劃分塊 V f r o m V_{from} Vfrom? 已經沒有頂點了】
            • 如果 V f r o m ∈? Z ( u ) V_{from} \not\in \Zeta(u) Vfrom?Z(u),則優先隊列 Q f r o m Q_{from} Qfrom? 移除頂點 u ;【如果劃分塊 V f r o m V_{from} Vfrom? 不在是 u 的鄰居塊】
            • 否則,優先隊列 Q f r o m Q_{from} Qfrom? 更新頂點 u 的增益 G f r o m ( u ) = G f r o m ( u ) ? ω ( e ) G_{from}(u)=G_{from}(u)-\omega(e) Gfrom?(u)=Gfrom?(u)?ω(e)
          • 如果 Φ ( e , V t o ) = 1 \Phi(e,V_{to})=1 Φ(e,Vto?)=1 【頂點 v 移動后對 e 產生了新的劃分塊連接】
            • 如果 V t o ∈? Z ( u ) V_{to} \not\in \Zeta(u) Vto?Z(u) ,則依據公式 G_i(v) 計算 G t o ( u ) G_{to}(u) Gto?(u) 并插入到優先隊列 Q t o Q_{to} Qto? 中;【如果對于 u 來說, V t o V_{to} Vto? 是不是其鄰居劃分塊】
            • 否則,優先隊列 Q t o Q_{to} Qto? 更新頂點 u 的增益 G t o ( u ) = G t o ( u ) + ω ( e ) G_{to}(u)=G_{to}(u)+\omega(e) Gto?(u)=Gto?(u)+ω(e)
          • 如果 b ( u ) = V f r o m ∧ Φ ( e , V f r o m ) = 1 b(u)=V_{from} \wedge \Phi(e,V_{from})=1 b(u)=Vfrom?Φ(e,Vfrom?)=1 ,更新頂點 u 的所有增益 G i ( u ) = G i ( u ) + ω ( e ) G_i(u)=G_i(u)+\omega(e) Gi?(u)=Gi?(u)+ω(e) ;【對于 e 來說,其在劃分塊 V f o r m V_{form} Vform? 只剩下頂點 u 了,所以 u 移動到其他頂點就可以減少其的連接數】
          • 如果 b ( u ) = V t o ∧ Φ ( e , V t o ) = 2 b(u)=V_{to} \wedge \Phi(e,V_{to})=2 b(u)=Vto?Φ(e,Vto?)=2 ,更新頂點 u 的所有增益 G i ( u ) = G i ( u ) ? ω ( e ) G_i(u)=G_i(u)-\omega(e) Gi?(u)=Gi?(u)?ω(e) ;【對于 e 來說,原本 V t o V_{to} Vto? 只有 u 一個頂點,所以它移動到其他劃分塊可以減少連接;但是 v 移動過來后,u 在移動到其他劃分塊就不會減少連接數,所以移動增益要減去 ω ( e ) \omega(e) ω(e)
    • 增益緩存
      • 對于每個頂點 v ,用 O ( k ) \Omicron(k) O(k) 的空間來存放鄰居劃分塊和移動到該塊的增益。【可以在 O ( 1 ) \Omicron(1) O(1) 時間內添加和刪除一個塊,在 O ( ∣ Z ( v ) ∣ ) \Omicron(\big|\Zeta(v)\big|) O( ?Z(v) ?) 內遍歷所有鄰居塊,此外,還可以在 O ( 1 ) \Omicron(1) O(1) 時間內完成更新】
      • 具體做法:
        • C v [ i ] C_v[i] Cv?[i] 表示頂點 v 和劃分塊 V i V_i Vi? 的緩存條目。
        • 在初始劃分結束后,計算每個頂點所有可能的移動增益。【每輪局部搜索都要重新計算相應頂點的移動增益(不需要全部頂點重新計算)】
        • 每次激活頂點時,使用緩存增益值來激活頂點;
        • 移動頂點后,緩存增益更新操作如下:【移動后頂點 v 的鄰居劃分塊,有可能新增 V f r o m V_{from} Vfrom? ,一定減少 V t o V_{to} Vto?
          • 刪除 C v [ t o ] C_v[to] Cv?[to] ; 【因為頂點 v 移動到了劃分塊 V t o V_{to} Vto?
          • 如果 V f r o m ∈ Z ( v ) V_{from} \in \Zeta(v) Vfrom?Z(v) ,則 C v [ f r o m ] = ? C v [ t o ] C_v[from]=-C_v[to] Cv?[from]=?Cv?[to] ;【如果劃分塊 V f r o m V_{from} Vfrom? 是 v 的鄰居劃分塊】
          • 對于其他鄰居劃分塊 V i V_i Vi? ,遍歷所有超邊 e ∈ E v e\in E_v eEv?
            • 如果 Φ ( e , V f r o m ) = 0 ∧ Φ ( e , V t o ) > 1 \Phi(e,V_{from})=0 \wedge \Phi(e,V_{to})>1 Φ(e,Vfrom?)=0Φ(e,Vto?)>1 ,則 C v [ V i ] = C v [ V i ] ? ω ( e ) C_v[V_i]=C_v[V_i]-\omega(e) Cv?[Vi?]=Cv?[Vi?]?ω(e) 【原本在 from ,移動到其他塊可以減少連接數,而移動到 to 時,超邊 e 在 to 有其他頂點,所以如果要移動到其他塊,就不會減少連接數,所以移動增益要減少】
            • 如果 Φ ( e , V f r o m ) = 0 ∧ Φ ( e , V t o ) = 1 \Phi(e,V_{from})=0 \wedge \Phi(e,V_{to})=1 Φ(e,Vfrom?)=0Φ(e,Vto?)=1 ,則 C v [ V i ] = C v [ V i ] + ω ( e ) C_v[V_i]=C_v[V_i]+\omega(e) Cv?[Vi?]=Cv?[Vi?]+ω(e) 【原本在 from ,移動到其他塊可以減少連接數,而移動到 to 時,超邊 e 在 to 沒有其他頂點,所以如果要移動到其他塊,就會減少連接數,所以移動增益要增加】
        • 回滾時同時回滾增益緩存
  • 實驗結果:
    • 測試用例:
      • the ISPD98 VLSI Circuit Benchmark Suite [17]
      • the University of Florida Sparse Matrix Collection [18]
      • the international SAT Competition 2014 [19]
    • 實驗參數
      • k = { 2 , 4 , 8 , 16 , 32 , 64 , 128 } ∪ { 5 , 23 , 47 , 107 } k=\{2,4,8,16,32,64,128\} \cup \{5,23,47,107\} k={2,4,8,16,32,64,128}{5,23,47,107}
      • ? = 0.03 \epsilon=0.03 ?=0.03
    • 比較對象
      • PaToH-Q
      • PaToH-D
      • hMetis-R
      • hMetis-K

五、實驗結果

在這里插入圖片描述
在這里插入圖片描述

在這里插入圖片描述

六、主要貢獻

  • 提出了 n 級直接 k 劃分算法
  • 引入 min-hash 技術,加快了聚類和局部搜索的計算速度
  • 提出了一個聚類函數,消除了 PQ 的瓶頸且不會影響整體結果的質量
  • 提出局部搜索算法,使用 DeltaGainUpdate 、增益緩存的技術來提高算法速度
  • 提出了一種自適應停止規則

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

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

相關文章

視頻問答功能播放器(視頻問答)視頻彈題功能實例

視頻問答播放器是一種互動教學工具,在視頻播放過程中彈出題目卡,學員答題后才能繼續觀看,提升學習參與度。視頻問答功能播放器(視頻問答)視頻彈題功能實例: 視頻播放器的視頻問答功能(也叫問答播放器、視頻彈題、視頻問…

2025年AI代理演進全景:從技術成熟度曲線到產業重構

2025年AI代理演進全景:從技術成熟度曲線到產業重構 一、技術成熟度曲線定位:AI代理的“期望膨脹期” 根據Gartner技術成熟度曲線(Hype Cycle?),AI代理(Agentic AI)當前正處于期望膨脹期向泡沫…

基于python的機器學習(八)—— 評估算法(一)

目錄 一、機器學習評估的基本概念 1.1 評估的定義與目標 1.2 常見評估指標 1.3 訓練集、驗證集與測試集的劃分 二、分離數據集 2.1 分離訓練數據集和評估數據集 2.2 k折交叉驗證分離 2.3 棄一交叉驗證分離 2.4 重復隨機評估和訓練數據集分離 三、交叉驗證技術 3.…

Win11 系統登入時綁定微軟郵箱導致用戶名欠缺

Win11 系統登入時綁定微軟郵箱導致用戶名欠缺 解決思路 -> 解綁當前微軟郵箱和用戶名 -> 斷網離線建立本地賬戶 -> 設置本地賬戶為Admin權限 -> 注銷當前賬戶,登入新建的用戶 -> 聯網綁定微軟郵箱 -> 刪除舊的用戶命令步驟 管理員權限打開…

Mac系統-最方便的一鍵環境部署軟件ServBay(支持php,java,python,node,go,mysql等)沒有之一,已親自使用!

自從換成Mac電腦以后,做開發有時候要部署各種環境,如php,mysql,nginx,pgsql,java,node,python,go時,嘗試過原生環境部署,各種第三方軟件部署&…

Flink中Kafka連接器的基本應用

文章目錄 前言Kafka連接器基礎案例演示前置說明和環境準備步驟Kafka連接器基本配置關聯數據源映射轉換案例效果演示基于Kafka連接器同步數據到MySQL案例說明前置準備Kafka連接器消費位點調整映射轉換與數據投遞MysqlSlink持久化收集器數據最終效果演示小結參考前言 本文將基于…

Leetcode 刷題記錄 11 —— 二叉樹第二彈

本系列為筆者的 Leetcode 刷題記錄,順序為 Hot 100 題官方順序,根據標簽命名,記錄筆者總結的做題思路,附部分代碼解釋和疑問解答,01~07為C語言,08及以后為Java語言。 01 二叉樹的層序遍歷 /*** Definition…

【R語言科研繪圖】

R語言在繪制SCI期刊圖像時具有顯著優勢,以下從功能、靈活性和學術適配性三個方面分析其適用性: 數據可視化庫豐富 R語言擁有ggplot2、lattice、ggpubr等專業繪圖包,支持生成符合SCI期刊要求的高分辨率圖像(如TIFF/PDF格式&#…

【Node.js】Web開發框架

個人主頁:Guiat 歸屬專欄:node.js 文章目錄 1. Node.js Web框架概述1.1 Web框架的作用1.2 Node.js主要Web框架生態1.3 框架選擇考慮因素 2. Express.js2.1 Express.js概述2.2 基本用法2.2.1 安裝Express2.2.2 創建基本服務器 2.3 路由2.4 中間件2.5 請求…

PDF 轉 JPG 圖片小工具:CodeBuddy 助力解決轉換痛點

本文所使用的 CodeBuddy 免費下載鏈接:騰訊云代碼助手 CodeBuddy - AI 時代的智能編程伙伴 前言 在數字化辦公與內容創作的浪潮中,將 PDF 文件轉換為 JPG 圖片格式的需求日益頻繁。無論是學術文獻中的圖表提取,還是宣傳資料的視覺化呈現&am…

Linux 文件系統層次結構

Linux 的文件系統遵循 Filesystem Hierarchy Standard (FHS) 標準,其目錄結構是層次化的,每個目錄都有明確的用途。以下是 Linux 中部分目錄的作用解析: 1. 根目錄 / 作用:根目錄是整個文件系統的頂層目錄,所有其他目…

密碼學標準(Cryptography Standards)介紹

密碼學標準(Cryptography Standards)是為確保信息安全傳輸、存儲和處理而制定的一系列技術規范和協議,廣泛應用于通信、金融、互聯網等領域。以下從分類、主流標準、應用場景和發展趨勢四個方面進行詳細介紹: 一、密碼學標準的分類 密碼學標準可根據技術原理和應用場景分…

ubuntu 22.04安裝和使用docker介紹

docker安裝和使用 準備環境常見的docker操作linux系統常用的配置卸載docker 準備環境 本機環境: Linux yz-MS-7E06 6.8.0-59-generic #61~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue Apr 15 17:03:15 UTC 2 x86_64 x86_64 x86_64 GNU/Linux安裝依賴軟件:…

obsidian 中的查找和替換插件,支持正則

最近用著 obsidian 時,發現想要在當前文檔中 查找和替換 內容時,沒有自動查找和替換的功能,去插件市場查找也沒有發現好用的插件,那就自己寫一個吧。 全程用的 AI 來寫的,當然,我對 JS/CSS/TypeScript 等沒…

針對vue項目的webpack優化攻略

一、開發階段優化 1. 熱更新加速(HMR) // vue.config.js module.exports {devServer: {hot: true, // 開啟熱更新injectClient: true, // 自動注入HMR客戶端watchOptions: {ignored: /node_modules/, // 忽略node_modules變化aggregateTimeout: 300…

BTC官網關注巨鯨12億美元平倉,XBIT去中心化交易平臺表現穩定

在全球加密貨幣市場波動加劇的背景下,2025年5月25日傳出重磅消息。據今日最新國際報道,知名巨鯨James Wynn完全平倉價值12億美元的BTC多頭倉位,整體盈利約845萬美元,此舉引發市場廣泛關注。與此同時,收益型穩定幣市場迎…

在WPF中添加動畫背景

在WPF中添加動畫背景 在WPF中創建動畫背景可以大大增強應用程序的視覺效果。以下是幾種實現動畫背景的方法&#xff1a; 方法1&#xff1a;使用動畫ImageBrush&#xff08;圖片輪播&#xff09; <Window x:Class"AnimatedBackground.MainWindow"xmlns"htt…

單點擊登錄sso實現

一、單點登錄&#xff08;SSO&#xff09;是什么&#xff1f; 核心定義 單點登錄&#xff08;Single Sign-On&#xff0c;SSO&#xff09;是一種身份認證解決方案&#xff0c;允許用戶通過一次登錄訪問多個相互信任的應用系統。其核心邏輯是統一認證中心與分布式會話管理&…

JavaWebsocket-demo

Websocket客戶端 pom依賴 <dependency><groupId>org.java-websocket</groupId><artifactId>Java-WebSocket</artifactId><version>1.4.0</version></dependency>客戶端代碼片段 Component Slf4j public class PositionAlarmL…

Java Collection(集合) 接口

Date: 2025-05-21 20:21:32 author: lijianzhan Java 集合框架提供了一組接口和類&#xff0c;以實現各種數據結構和算法。 以下是關于 Java 集合的核心內容說明&#xff1a; /*** Java Collection Framework 說明&#xff1a;** 在 Java 中&#xff0c;集合&#xff08;Collec…