当前位置: 首页 > news >正文

二阶优化方法详解

前言

本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢!

本专栏目录结构和参考文献请见《机器学习数学通关指南》


ima 知识库

知识库广场搜索:

知识库创建人
机器学习@Shockang
机器学习数学基础@Shockang
深度学习@Shockang

正文

在这里插入图片描述

用二阶信息加速你的模型收敛

📚 引言

在机器学习的优化过程中,一阶方法(如梯度下降)虽然实现简单,但收敛速度常常不尽如人意。二阶优化方法通过利用目标函数的曲率信息(Hessian矩阵),能够显著提升收敛速度和优化效率。本文将深入介绍三种主流二阶优化算法,并结合实例分析其应用场景。

1. 牛顿法(Newton’s Method)🔍

核心思想

牛顿法基于目标函数的二阶泰勒展开,同时利用梯度方向和曲率信息进行参数更新:

w t + 1 = w t − H − 1 ( w t ) ⋅ ∇ f ( w t ) w^{t+1} = w^t - H^{-1}(w^t) \cdot \nabla f(w^t) wt+1=wtH1(wt)f(wt)

其中:

  • H ( w t ) H(w^t) H(wt) 是在点 w t w^t wt 处的Hessian矩阵
  • ∇ f ( w t ) \nabla f(w^t) f(wt) 是梯度向量

数学推导

牛顿法的基本原理来自于目标函数的二阶泰勒展开:

f ( w ) ≈ f ( w t ) + ∇ f ( w t ) T ( w − w t ) + 1 2 ( w − w t ) T H ( w t ) ( w − w t ) f(w) \approx f(w^t) + \nabla f(w^t)^T(w-w^t) + \frac{1}{2}(w-w^t)^T H(w^t)(w-w^t) f(w)f(wt)+f(wt)T(wwt)+21(wwt)TH(wt)(wwt)

对此近似函数求导并令其为零,解得下一个迭代点:

H ( w t ) ( w t + 1 − w t ) = − ∇ f ( w t ) H(w^t)(w^{t+1}-w^t) = -\nabla f(w^t) H(wt)(wt+1wt)=f(wt)
w t + 1 = w t − H − 1 ( w t ) ∇ f ( w t ) w^{t+1} = w^t - H^{-1}(w^t)\nabla f(w^t) wt+1=wtH1(wt)f(wt)

特点 ✅❌

优点:

  • 收敛速度快(二阶收敛率),特别是在接近最优点时
  • 方向选择更精确,避免了梯度下降的"之字形"路径
  • 对于二次函数,理论上一步可达最优解

缺点:

  • 计算和存储 Hessian 矩阵成本高 ( O ( d 3 ) O(d^3) O(d3) 复杂度计算逆矩阵)
  • 需要 Hessian 正定,否则可能不收敛或朝错误方向前进
  • 在非凸问题上可能陷入鞍点或局部最小值

应用场景 🎯

  • 小规模或中等维度的优化问题
  • 凸优化问题,尤其是目标函数高度光滑
  • 精确解的数值优化,如统计中的最大似然估计
  • 需要快速收敛的场景,如微调模型的最后阶段

代码示例

import numpy as np
from scipy.optimize import minimize# 定义目标函数及其梯度和Hessian
def objective(x):return x[0]**2 + x[1]**2def gradient(x):return np.array([2*x[0], 2*x[1]])def hessian(x):return np.array([[2, 0], [0, 2]])# 初始点
x0 = np.array([1.0, 1.0])# 使用Newton-CG方法(牛顿法的变种)
result = minimize(objective, x0, method='Newton-CG',jac=gradient, hess=hessian,options={'xtol': 1e-8, 'disp': True})print(f"最优解: {result.x}")
print(f"迭代次数: {result.nit}")

2. 拟牛顿法(Quasi-Newton Methods)🧠

核心思想

拟牛顿法通过构建 Hessian 矩阵或其逆矩阵的近似,避免了直接计算这些昂贵的矩阵:

w t + 1 = w t − B t ⋅ ∇ f ( w t ) w^{t+1} = w^t - B_t \cdot \nabla f(w^t) wt+1=wtBtf(wt)

其中 B t B_t Bt 是 Hessian 逆矩阵的近似。

BFGS 算法

Broyden–Fletcher–Goldfarb–Shanno (BFGS) 算法是最流行的拟牛顿方法之一:

  1. 计算梯度差 y t = ∇ f ( w t + 1 ) − ∇ f ( w t ) y_t = \nabla f(w^{t+1}) - \nabla f(w^t) yt=f(wt+1)f(wt)
  2. 计算位移向量 s t = w t + 1 − w t s_t = w^{t+1} - w^t st=wt+1wt
  3. 更新近似的 Hessian 逆矩阵:

B t + 1 = ( I − ρ t s t y t T ) B t ( I − ρ t y t s t T ) + ρ t s t s t T B_{t+1} = (I - \rho_t s_t y_t^T)B_t(I - \rho_t y_t s_t^T) + \rho_t s_t s_t^T Bt+1=(IρtstytT)Bt(IρtytstT)+ρtststT

其中 ρ t = 1 y t T s t \rho_t = \frac{1}{y_t^T s_t} ρt=ytTst1

这种更新确保了 B t + 1 B_{t+1} Bt+1 保持对称正定,同时满足"割线条件"。

L-BFGS 算法

Limited-memory BFGS (L-BFGS) 是针对高维问题的内存优化版本:

  • 不存储完整的 B t B_t Bt 矩阵,只保存最近 m 次迭代的向量对 ( s i , y i ) (s_i,y_i) (si,yi)
  • 通过这些向量对隐式地表示 B t B_t Bt
  • 内存需求从 O ( d 2 ) O(d^2) O(d2) 降至 O ( m d ) O(md) O(md),其中 m≪d

特点 ✅❌

优点:

  • 避免了直接计算 Hessian 矩阵,大幅降低计算成本
  • 保持了超线性收敛速度(介于一阶和二阶之间)
  • L-BFGS 适用于高维问题,内存需求低
  • 比牛顿法更稳定,不易受非正定 Hessian 影响

缺点:

  • 收敛速度略逊于完全牛顿法
  • 需要存储历史信息,BFGS 在极高维问题上仍有内存瓶颈
  • L-BFGS 中历史长度 m 是需要调优的超参数

应用场景 🎯

  • 中大规模机器学习问题的训练
  • 许多常见 ML 模型的求解器:逻辑回归、线性 SVM、CRF 等
  • scikit-learn 中的 lbfgsliblinear 求解器
  • 深度学习框架中的高级优化器选项

代码示例

import numpy as np
from scipy.optimize import minimize# 定义目标函数及其梯度
def rosenbrock(x):return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)def rosenbrock_grad(x):xm = x[1:-1]xm_m1 = x[:-2]xm_p1 = x[2:]der = np.zeros_like(x)der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])der[-1] = 200*(x[-1]-x[-2]**2)return der# 初始点 - 5维 Rosenbrock 函数
x0 = np.array([0.5, 0.5, 0.5, 0.5, 0.5])# 使用L-BFGS-B方法
result_lbfgs = minimize(rosenbrock, x0, method='L-BFGS-B', jac=rosenbrock_grad, options={'gtol': 1e-6, 'disp': True})print(f"L-BFGS 最优解: {result_lbfgs.x}")
print(f"L-BFGS 迭代次数: {result_lbfgs.nit}")

3. 共轭梯度法(Conjugate Gradient Method)⚙️

核心思想

共轭梯度法通过构建一组"共轭方向"来实现高效优化,避免在搜索过程中重复已经优化过的方向:

  1. 初始方向为负梯度: d 0 = − ∇ f ( w 0 ) d^0 = -\nabla f(w^0) d0=f(w0)
  2. 后续方向通过组合当前梯度和前一个方向得到:

d t + 1 = − ∇ f ( w t + 1 ) + β t d t d^{t+1} = -\nabla f(w^{t+1}) + \beta_t d^t dt+1=f(wt+1)+βtdt

其中 β t \beta_t βt 通过不同公式计算(如 Fletcher-Reeves 或 Polak-Ribière 公式):

Fletcher-Reeves β t = ∣ ∣ ∇ f ( w t + 1 ) ∣ ∣ 2 ∣ ∣ ∇ f ( w t ) ∣ ∣ 2 \beta_t = \frac{||\nabla f(w^{t+1})||^2}{||\nabla f(w^t)||^2} βt=∣∣∇f(wt)2∣∣∇f(wt+1)2

Polak-Ribière β t = ∇ f ( w t + 1 ) T [ ∇ f ( w t + 1 ) − ∇ f ( w t ) ] ∣ ∣ ∇ f ( w t ) ∣ ∣ 2 \beta_t = \frac{\nabla f(w^{t+1})^T[\nabla f(w^{t+1}) - \nabla f(w^t)]}{||\nabla f(w^t)||^2} βt=∣∣∇f(wt)2f(wt+1)T[f(wt+1)f(wt)]

数学原理

在二次函数情况下,共轭梯度确保了搜索方向 d i d^i di d j d^j dj 关于 Hessian 矩阵 H H H 是共轭的:

d i H d j = 0 , ∀ i ≠ j d^i H d^j = 0, \quad \forall i \neq j diHdj=0,i=j

这保证了算法在 n 维空间中最多需要 n 步即可达到最优解。

特点 ✅❌

优点:

  • 内存需求极低,只需存储几个向量( O ( d ) O(d) O(d) 空间复杂度)
  • 理论上,对于 n 维二次函数,最多 n 步收敛
  • 不需要矩阵存储或操作,适合大规模稀疏问题
  • 与预处理技术结合效果显著

缺点:

  • 对非二次函数需要重启策略,防止共轭性失效
  • 收敛速度通常慢于拟牛顿法
  • 线性收敛,对病态问题性能可能不佳
  • 步长选择对收敛影响较大

应用场景 🎯

  • 大规模线性系统求解(如 A x = b Ax=b Ax=b 问题)
  • 深度学习中的参数优化,特别是内存受限场景
  • 稀疏问题,如大规模图像处理和信号处理
  • 结合预处理技术用于加速训练神经网络

代码示例

import numpy as np
from scipy.optimize import minimize# 定义二次函数及其梯度
def quadratic(x):A = np.array([[2, 1], [1, 4]])b = np.array([1, 2])return 0.5 * x.dot(A).dot(x) - b.dot(x)def quadratic_grad(x):A = np.array([[2, 1], [1, 4]])b = np.array([1, 2])return A.dot(x) - b# 初始点
x0 = np.array([0.0, 0.0])# 使用共轭梯度法
result_cg = minimize(quadratic, x0, method='CG',jac=quadratic_grad,options={'gtol': 1e-6, 'disp': True})print(f"CG最优解: {result_cg.x}")
print(f"CG迭代次数: {result_cg.nit}")

方法对比 📊

方法收敛速度计算复杂度内存需求最佳应用场景
牛顿法二阶 O ( d 3 ) O(d^3) O(d3) O ( d 2 ) O(d^2) O(d2)小规模问题,精确Hessian可计算
BFGS超线性 O ( d 2 ) O(d^2) O(d2) O ( d 2 ) O(d^2) O(d2)中等规模,要求快速收敛
L-BFGS超线性 O ( m d ) O(md) O(md) O ( m d ) O(md) O(md)大规模,内存受限但需优秀收敛性
共轭梯度法线性/超线性 O ( d ) O(d) O(d) O ( d ) O(d) O(d)超大规模稀疏问题,极限内存约束

实践中的选择指南 🧭

  1. 问题规模是决定因素

    • 低维问题(<100维):牛顿法或BFGS
    • 中等维度(100-10000维):L-BFGS
    • 高维问题(>10000维):共轭梯度法或随机近似方法
  2. 结合深度学习框架

    • TensorFlow/PyTorch中可通过scipy.optimize接口使用这些优化器
    • 深度学习框架通常提供这些优化器的随机变种
  3. 预处理技术

    • 对于病态问题,结合对角Hessian近似或AdaGrad类预处理器
    • 共轭梯度法特别推荐使用预处理增强性能

实战案例:优化器性能对比 🔬

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import minimize
import time# 创建Rosenbrock函数(著名的优化测试函数)
def rosen(x):return sum(100.0*(x[1:]-x[:-1]**2.0)**2.0 + (1-x[:-1])**2.0)def rosen_grad(x):xm = x[1:-1]xm_m1 = x[:-2]xm_p1 = x[2:]der = np.zeros_like(x)der[1:-1] = 200*(xm-xm_m1**2) - 400*(xm_p1 - xm**2)*xm - 2*(1-xm)der[0] = -400*x[0]*(x[1]-x[0]**2) - 2*(1-x[0])der[-1] = 200*(x[-1]-x[-2]**2)return der# 测试不同优化器
methods = ['BFGS', 'L-BFGS-B', 'CG', 'Newton-CG']
results = {}# 10维Rosenbrock函数
dim = 10
x0 = np.ones(dim) * 1.2for method in methods:start_time = time.time()if method == 'Newton-CG':# 为Newton-CG定义Hessiandef rosen_hess(x, p):# 为示例简化,返回对角Hessian近似return 200 * presult = minimize(rosen, x0, method=method, jac=rosen_grad, hessp=rosen_hess)else:result = minimize(rosen, x0, method=method, jac=rosen_grad)runtime = time.time() - start_timeresults[method] = {'success': result.success,'iterations': result.nit,'function_calls': result.nfev,'runtime': runtime}# 打印结果
for method, res in results.items():print(f"\n{method} 优化器结果:")print(f"成功: {res['success']}")print(f"迭代次数: {res['iterations']}")print(f"函数评估次数: {res['function_calls']}")print(f"运行时间: {res['runtime']:.4f}秒")

总结 📝

二阶优化方法是机器学习中处理复杂优化问题的强大工具:

  • 🚀 牛顿法直接利用Hessian矩阵提供最快收敛,但计算成本高。
  • 🔋 拟牛顿法(尤其是L-BFGS)通过近似Hessian提供了最佳平衡,是机器学习中的主力优化方法。
  • 共轭梯度法以极低内存需求处理超大规模问题,在深度学习领域仍有重要应用。

实际应用中,L-BFGS通常是训练传统机器学习模型的首选算法,而在深度学习中,人们通常使用这些方法的随机变体以处理海量数据。

优化器选择应综合考虑问题规模、内存限制、精度要求和收敛速度需求,没有"放之四海而皆准"的最佳选择,而是根据具体场景灵活选用。


希望这篇文章对你理解机器学习中的二阶优化方法有所帮助!如有疑问,欢迎在评论区讨论交流。🤗

相关文章:

二阶优化方法详解

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 ima 知识库 知识库广场搜索&#…...

C++中通过虚函数实现多态的原理

C中通过虚函数实现多态的原理 我们都知道C是通过虚函数实现多态的&#xff0c;那么其中的原理是什么呢&#xff1f; 在C中&#xff0c;多态性是一种重要的特性&#xff0c;它允许通过基类指针或引用来调用派生类中的函数。多态性主要分为两种&#xff1a;编译时多态&#xff…...

阿里云服务器购买及环境搭建宝塔部署springboot和vue项目

云服务器ECS_云主机_服务器托管_计算-阿里云 一、前言 对于新手或者学生党来说&#xff0c;有时候就想租一个云服务器来玩玩或者练练手&#xff0c;duck不必花那么多钱去租个服务器。这些云服务厂商对学生和新手还是相当友好的。下面将教你如何快速搭建自己的阿里云服务器&…...

【学习笔记】中缀表达式转后缀表达式及计算

C实现中缀表达式转后缀表达式及后缀表达式的计算 在C中&#xff0c;实现中缀表达式转换为后缀表达式&#xff08;逆波兰表达式&#xff09;以及后缀表达式的计算是一个非常经典的问题。它不仅涉及到栈&#xff08;Stack&#xff09;数据结构的使用&#xff0c;还涉及到对运算符…...

【机器人-基础知识】标定 - 相机标定全解

https://blog.csdn.net/MengYa_Dream/article/details/120233806 1. 相机标定的定义 相机标定是确定相机成像过程中各个参数的过程,它的核心目标是建立从三维世界坐标系到二维图像坐标系的数学映射关系。这一过程包括求解: 内参:描述相机内部光学特性(如焦距、主点位置、像…...

Java 8 + Tomcat 9.0.102 的稳定环境搭建方案,适用于生产环境

一、安装 Java 8 安装 OpenJDK 8 bash sudo apt update sudo apt install openjdk-8-jdk -y 验证安装 bash java -version 应输出类似: openjdk version “1.8.0_412” OpenJDK Runtime Environment (build 1.8.0_412-8u412-ga-1~22.04-b08) OpenJDK 64-Bit Server VM (bui…...

探索 C 语言枚举类型的奇妙世界

目录 一、枚举类型的定义二、枚举类型变量的声明和初始化2.1 先定义枚举类型&#xff0c;再声明变量2.2 定义枚举类型的同时声明变量 三、自定义枚举常量的值四、枚举类型的特点五、注意事项 在C语言中&#xff0c;枚举类型&#xff08; enum&#xff09;是一种用户自定义的数…...

buu-ciscn_2019_ne_5-好久不见50

1. 背景分析 目标程序是一个存在漏洞的二进制文件&#xff0c;我们可以通过以下方式利用漏洞获取 shell&#xff1a; 程序中存在 system() 函数&#xff0c;但没有明显的 /bin/sh 字符串。 使用工具&#xff08;如 ROPgadget&#xff09;发现程序中有 sh 字符串&#xff0c;可…...

HCIA-ACL实验

前提条件&#xff1a;实现底层互通 转发层面 1、基本ACL ①要求PC3不能访问网段192.168.2.0的网段&#xff0c;PC4和客户端能正常访问服务器 ②AR2配置 acl 2000 rule deny source 192.168.1.1 0 匹配流量 int g 0/0/0 traffic-filter inbound acl 2000 接口调用…...

Java入职篇(2)——开发流程以及专业术语

Java入职篇&#xff08;2&#xff09;——开发流程以及专业术语 开发流程 开发术语 测试用例&#xff08;用例&#xff09; 测试人员写的测试方案&#xff0c;基本上就是编写的测试过程&#xff0c;以及测试的预取结果 灰度测试 现在小部分范围内使用&#xff0c;然后逐步…...

三相逆变器不控整流场景简要分析

0 三相逆变器拓扑 LCL三相逆变器简要拓扑如下图所示&#xff0c;其他类型如多电平逆变器类似。 1 原理说明 软件在进行直流母线电压Udc的给定取值时&#xff0c;考虑到电压利用率&#xff0c;通常会比电网线电压的峰值稍微高些&#xff0c;比如取线电压峰值的1.0x倍&#x…...

语言识别模型whisper学习笔记

语言识别模型whisper学习笔记 Whisper 是由 OpenAI 于 2022年9月 推出的开源自动语音识别&#xff08;ASR&#xff09;系统&#xff0c;旨在实现高精度、多语言的语音转文本及翻译任务。其核心目标是解决传统语音识别模型在噪声环境、口音多样性及多语言场景下的局限性。 一、…...

centos 换阿里云yum

1、备份原有的Yum源配置文件 在更换Yum源之前&#xff0c;先备份CentOS系统中默认的Yum源配置文件&#xff0c;以便在需要时恢复。默认的Yum源配置文件位于 /etc/yum.repos.d/ 目录下&#xff0c;通常包含 CentOS-Base.repo、CentOS-Debuginfo.repo、CentOS-Vault.repo 等文件…...

Jmeter的简单使用

前置工作 确保java8 版本以上jmeter下载路径&#xff08;选择Binaries&#xff09;&#xff1a;https://jmeter.apache.org/download_jmeter.cgi直接解压&#xff0c;找到bin下面的文件&#xff1a;jmeter.bat&#xff08;可选&#xff09;汉化&#xff0c;修改 jmeter.proper…...

CSS元素层叠顺序规则

CSS元素层叠顺序规则 看图说话总结: background/borderz-index(<0)blockfloatinline/inline-blockz-index(0,auto)z-index (>0)...

用Maven创建只有POM文件的项目

使用 mvn 创建一个仅包含 pom.xml 文件的父项目&#xff0c;可以借助 maven-archetype-quickstart 原型&#xff0c;然后移除不必要的文件&#xff0c;或者直接通过命令生成最简的 pom.xml 文件。以下是具体操作步骤&#xff1a; 一、方法一&#xff1a;使用原型创建后清理 1…...

使用Python在Word中生成多种不同类型的图表

目录 工具与环境配置 在 Word 中创建图表的步骤 在Word中创建柱形图 在Word中创建条形图 在Word中创建折线图 在Word中创建饼图 在Word中创建散点图 在Word中创建气泡图 在 Word 文档中插入图表不仅能更直观地呈现数据&#xff0c;还能提升文档的可读性和专业性。常见的…...

Webpack构建流程详解优化前端性能\Dev-Server与Proxy\网络攻击\HMR

简版 核心流程图 根据&#xff0c;Webpack的构建流程分为初始化、编译和输出三个阶段。初始化阶段读取配置、加载插件、实例化Compiler。编译阶段&#xff08;构建依赖关系&#xff09;涉及Compiler类的运行&#xff0c;生成Compilation对象&#xff0c;处理模块依赖。输出阶…...

Python 实现的采集诸葛灵签

Python 实现的采集诸葛灵签 项目介绍 这是一个基于 Python 开发的诸葛灵签数据采集和展示项目。通过爬虫技术获取诸葛神签的签文和解签内容&#xff0c;并提供数据存储和查询功能。 项目结构 zhuge/├── zhuge_scraper.py # 爬虫主程序├── zhuge_pages/ # 数据存储目录…...

ESP-IDF ubuntu版本 V5.2

1.MobaXterm 这个软件方面粘贴,文件拷贝 MobaXterm 2.安装之前请确保你安装了Python 和 pip V5.2需要python3.8和pip mkdir esp32 cd esp32 git clone https://gitee.com/EspressifSystems/esp-gitee-tools.git cd esp-gitee-tools ./jihu-mirror.sh set cd .. git clone …...

Opencv之掩码实现图片抠图

掩码实现图片抠图 目录 掩码实现图片抠图1 掩码1.1 概念1.2 创建掩码1.3抠图思路 2 代码测试 1 掩码 1.1 概念 掩码&#xff08;Mask&#xff09;是一种用于指定图像处理操作区域的工具。掩码通常是一个与图像尺寸相同的二值图像&#xff0c;其中像素值为0表示不处理&#xff…...

警惕!Ollama大模型工具的安全风险及应对策略

文章目录 **Ollama的安全隐患&#xff1a;不容忽视的风险****未授权访问&#xff1a;门户洞开的风险****数据泄露&#xff1a;敏感信息的外泄****漏洞利用&#xff1a;历史遗留的隐患** **安全加固&#xff1a;守护数据与服务的防线****限制监听范围&#xff1a;内网隔离的保护…...

MySQL -- 表的约束

概念引入&#xff1a;真正的约束表字段的是数据类型&#xff0c;但是数据类型的约束方式比较单一的&#xff0c;所以需要一些额外的一些约束&#xff0c;用于表示数据的合法性&#xff0c;在只有数据类型一种约束的情况下&#xff0c;我们比较难保证数据是百分百合法。通过添加…...

详解数据库范式

范式 1. 第一范式&#xff08;1NF&#xff09;2. 第二范式&#xff08;2NF&#xff09;3. 第三范式&#xff08;3NF&#xff09;4. BC范式&#xff08;BCNF&#xff0c;Boyce-Codd Normal Form&#xff09;5. 第四范式&#xff08;4NF&#xff09;6. 第五范式&#xff08;5NF&a…...

Nginx + Keepalived 高可用集群

一、NginxKeepalived 原理 1.1.Nginx 负载均衡机制 Nginx 是一款轻量级且高性能的 Web 服务器和反向代理服务器&#xff0c;在负载均衡方面有着卓越的表现。其具备强大的七层流量管理能力&#xff0c;能够基于 URL、Cookie、HTTP 头信息等对请求进行精准路由。例如&#xff0…...

循环遍历 Java 集合中元素的方法总结

循环遍历 Java 集合中元素的方法 在 Java 中&#xff0c;有多种方法可以遍历集合中的元素。以下是几种常见的遍历方法及其优缺点&#xff1a; 1. for-each 循环 语法&#xff1a; for (ElementType element : collection) {// 处理 element }适用场景&#xff1a;所有集合类型…...

树莓派上的 TensorFlow Lite:从零开始的摄像头图像识别

**** 1. 引言 随着人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;的发展&#xff0c;越来越多的开发者希望在嵌入式设备&#xff08;如树莓派&#xff09;上运行 AI 模型&#xff0c;实现目标检测、人脸识别等功能。TensorFlow Lite&#xff08;TF…...

金融时间序列分析(Yahoo Finance API实战)

这里写目录标题 金融时间序列分析(Yahoo Finance API实战)1. 引言2. 项目背景与意义3. 数据集介绍4. GPU加速在数据处理中的应用5. 交互式GUI设计与加速处理6. 系统整体架构7. 数学公式与指标计算8. 完整代码实现9. 代码自查与BUG排查10. 总结与展望金融时间序列分析(Yahoo …...

Python 正则表达式模块 re

Python 正则表达式模块 re flyfish 一、正则表达式基础 1. 什么是正则表达式&#xff1f; 正则表达式&#xff08;Regular Expression, RE&#xff09;是一种用于匹配、查找和替换文本模式的工具&#xff0c;由普通字符&#xff08;如字母、数字&#xff09;和特殊字符&…...

Vue生命周期

一、Vue的生命周期及其阶段 Vue生命周期&#xff1a;一个Vue实例从 创建 到 销毁 的整个过程。也就是从开始创建、初始化数据、编译模板、挂载Dom→渲染、更新→渲染、卸载等一系列过程&#xff0c;我们称这是 Vue 的生命周期。 生命周期的四个阶段&#xff1a;① 创建 ② 挂…...

vue3数据双向绑定解析

Vue 3 的双向绑定原理主要基于 Proxy 和 Reflect&#xff0c;核心源码在 reactivity 模块中。 1. 核心模块&#xff1a;reactivity reactivity 模块负责响应式数据的实现&#xff0c;主要包括以下几个文件&#xff1a; reactive.ts&#xff1a;处理对象和数组的响应式。ref.t…...

Gemini 2.0 全面解析:技术突破、应用场景与竞争格局

摘要 2025年3月&#xff0c;谷歌正式发布Gemini 2.0大模型&#xff0c;凭借其在多模态处理、代码生成和长上下文理解等领域的突破性进展&#xff0c;迅速成为AI领域的焦点。本文将深入剖析Gemini 2.0的技术架构、应用场景及与Grok3、DeepSeek R1、ChatGPT-4.5等竞品的对比&…...

【Linux系统编程】管道

目录 1、什么是管道2、管道的种类3、数据的读写3.1、管道通信3.2、管道的命令实例&#xff1a; 4、无名管道4.1、pipe() 无名管道的创建示例&#xff1a;简单读写示例&#xff1a;加入进程示例&#xff1a;通过 管道&#xff08;pipe&#xff09; 实现 父子进程之间的双向通信 …...

LeeCode题库第643题

643.子数组最大平均数I 项目场景&#xff1a; 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。 请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。 任何误差小于 10-5 的答案都将被视为正确答案。 示例 1&#xff1a; 输入&#xff…...

数据炼丹与硬件互动:预测湿度的武学之道

前言 在这茫茫数据江湖中&#xff0c;高手过招&#xff0c;唯有融合机器学习与物联网之精髓&#xff0c;方能于风云变幻间自成一派。本文正是为各位江湖同道献上的秘籍&#xff0c;既有数据炼丹&#xff08;预处理、模型训练&#xff09;之奥义&#xff0c;也有硬件互通&#…...

【SpringBoot】MD5加盐算法的详解

目录 一、什么是加盐算法 二、如何实现加盐算法 2.1 加盐算法代码实现 2.2 注册页面中进行密码加盐 2.3 登录页面进行加盐的解密 2.4 注册和登录 一、什么是加盐算法 加盐算法是一种用于增强密码安全性的技术。这种技术通过在密码存储过程中添加一个随机生成的盐值&…...

IP风险度自检,互联网的安全“指南针”

IP地址就像我们的网络“身份证”&#xff0c;而IP风险度则是衡量这个“身份证”安全性的重要指标。它关乎着我们的隐私保护、账号安全以及网络体验&#xff0c;今天就让我们一起深入了解一下IP风险度。 什么是IP风险度 IP风险度是指一个IP地址可能暴露用户真实身份或被网络平台…...

如何手动使用下载并且运行 QwQ-32B-GGUF

首先使用安装 pip install ModelScope 使用 ModelScope 下载对应的模型 modelScope download --model Qwen/QwQ-32B-GGUF qwq-32b-q4_k_m.gguf 第二步开始下载 ollama git clone https://githubfast.com/ggerganov/llama.cpp # githubfast.com 可以加速下载 切换到目录&am…...

【实战ES】实战 Elasticsearch:快速上手与深度实践-附录-3-从ES 7.x到8.x的平滑迁移策略

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 附录-版本升级指南 3-Elasticsearch 7.x 到 8.x 平滑迁移策略指南1. 升级必要性分析1.1 版本特性对比1.2 兼容性评估矩阵 2. 预升级准备清单2.1 环境检查表2.2 数据备份策略 3. 分阶段…...

IP 地址

文章目录 IP 地址IP 地址的分类IPv4 地址IPv6 地址 公有 IP 与私有 IP静态 IP 与动态 IP子网与子网掩码常见 IP 地址用途IP 地址的工作方式总结 IP 地址 IP&#xff08;Internet Protocol&#xff09;地址是计算机网络中的标识符&#xff0c;用于唯一标识网络中的设备。它可以…...

利用余弦相似度在大量文章中找出抄袭的文章

我前面的2篇文章分别讲了如果利用余弦相似度来判断2篇文章的相似度&#xff0c;来确定文章是否存在抄袭&#xff0c;和余弦相似度的原理&#xff0c;即余弦相似度到底是怎么来判断文章的相似性高低的等等。这一篇再说下&#xff0c;对于文章字数多和大量文章时&#xff0c;如果…...

《C语言中“输入魔法师”:scanf函数的奥秘与技巧》

&#x1f680;个人主页&#xff1a;fasdfdaslsfadasdadf &#x1f4d6;收入专栏&#xff1a;C语言 &#x1f30d;文章目入 一、引言二、scanf函数的基本语法三、格式说明符的种类及用法&#xff08;一&#xff09;整数输入&#xff08;二&#xff09;浮点数输入&#xff08;三&…...

VSTO(C#)Excel开发6:与窗体交互

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…...

PCL 点云OBB包围盒(二)

文章目录 一、简介二、实现步骤二、实现代码三、实现效果参考资料一、简介 包围盒是一种求解离散点集最优包围空间的算法,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。(来源于百度)常用的求解包围盒的算法主要有AABB和OOB算法,但AAB…...

IDEA 一键完成:打包 + 推送 + 部署docker镜像

1、本方案要解决场景&#xff1f; 想直接通过本地 IDEA 将最新的代码部署到远程服务器上。 2、本方案适用于什么样的项目&#xff1f; 项目是一个 Spring Boot 的 Java 项目。项目用 maven 进行管理。项目的运行基于 docker 容器&#xff08;即项目将被打成 docker image&am…...

农业建设项目管理系统评测:8款推荐工具优缺点分析

本文主要介绍了以下8款农业建设项目管理系统&#xff1a;1.PingCode&#xff1b; 2. Worktile &#xff1b;3. 建米农业工程项目管理系统&#xff1b;4. 开创云数字农业管理平台&#xff1b; 5. Trimble Ag Software&#xff1b;6.Conservis&#xff1b; 7. Agworld &#xff1…...

【MySQL】表的约束(上)

文章目录 表的约束什么是表的约束空属性默认值列描述&#xff08;comment&#xff09;零填充&#xff08;zerofill&#xff09;主键 总结 表的约束 什么是表的约束 表的约束&#xff08;Constraints&#xff09;是数据库表中的规则&#xff0c;用于限制存储的数据&#xff0c…...

根据TCP中的拥塞控制细说网卡了数据怎么传输

TCP&#xff08;传输控制协议&#xff09;中的拥塞控制是确保网络在数据传输过程中不会发生过载并导致网络崩溃的机制。拥塞控制通过动态地调整发送方的数据传输速率来适应网络的负载&#xff0c;从而避免网络拥塞。TCP的拥塞控制主要是根据网络的状况自动调整其发送速率&#…...

【SpringMVC】入门版

1.基本概念 1.1三层架构 三层架构也就是我们常说的b/s架构中的表现层&#xff0c;业务层和持久层,每层都各司其职&#xff0c;下面来分别讲解这三层的作用。 表现层&#xff1a; 也就是我们常说的web层。它负责接收客户端的请求&#xff0c;向客户端响应结果&#xff0c;通…...

DAY33 贪心算法Ⅱ

122. 买卖股票的最佳时机 II - 力扣&#xff08;LeetCode&#xff09; 想到把整体利润分解为每天的利润&#xff0c;就豁然开朗了。 class Solution { public:int maxProfit(vector<int>& prices) {int result0;for(int i1;i<prices.size();i){resultmax(0,pric…...