支持向量机(SVM):算法讲解与原理推导

news2025/2/24 3:15:57

1 SVM介绍

SVM是一个二类分类器,它的全称是Support Vector Machine,即支持向量机。

SVM的目标是找到一个超平面,使用两类数据离这个超平面越远越好,从而对新的数据分类更准确,即使分类器更加健壮。比如上面的图中,两种分界线都成功划分了所有数据,但是浅颜色的线距离样本很近,距离分界线比较近的样本很容易被误判,相比之下黑色的线就好得多。
它有两个核心思想,一个是对于线性可分数据,SVM通过寻找最大化类别间距离的超平面进行分类;另一个是对于线性不可分数据,SVM就利用核函数将数据映射到高维空间,再找到线性可分的超平面。这个后面再详细说。

2 公式推导

2.1 距离求解

下面需要求解样本点与分界平面之间的距离。这里用到两个概念:投影、向量点乘。
可设分界超平面为 w X + b = 0 wX+b=0 wX+b=0 b b b是偏移量, w ⃗ \vec{w} w 就是平面法向量。

如图, x x x是任意样本点,平面是需要求解的分界面。 x ′ x' x 是平面上任意一点, w ⃗ \vec{w} w 是平面法向量。其中 x ′ x ⃗ \vec {x'x} xx x − x ′ x-x' xx。需要求解 x x x 到平面的距离 d d d,也就是 x ′ x ⃗ \vec {x'x} xx w ⃗ \vec{w} w 方向上的投影。
为了符合线性代数的习惯,向量符号就不使用箭头标识了。
根据向量点乘公式知:
w T ( x − x ′ ) = ∣ ∣ w ∣ ∣ × ∣ ∣ x − x ′ ∣ ∣ × cos ⁡ < w T , x − x ′ > w^{T}(x-x')=||w||×||x-x'||×\cos<w^T,x-x'> wT(xx)=∣∣w∣∣×∣∣xx∣∣×cos<wT,xx>
则投影为:
∣ ∣ x − x ′ ∣ ∣ cos ⁡ < w T , x − x ′ > = W T ( x − x ′ ) ∣ ∣ w ∣ ∣ = 1 ∣ ∣ w ∣ ∣ ( w T x + b ) ||x-x'||\cos<w^T,x-x'>=\frac{W^T(x-x')}{||w||}=\frac{1}{||w||}(w^Tx+b) ∣∣xx∣∣cos<wT,xx>=∣∣w∣∣WT(xx)=∣∣w∣∣1(wTx+b)
所以距离公式为:
d = 1 ∣ ∣ w ∣ ∣ ∣ w T x + b ∣ d = \frac{1}{||w||}|w^Tx+b| d=∣∣w∣∣1wTx+b
为了方便求解,约定 w w w方向朝向正例样本所在方向,正例样本标签 y y y记为1,负例样本标签 y y y记为-1,那么距离公式可记为:
d = 1 ∣ ∣ w ∣ ∣ y ( w T x + b ) d = \frac{1}{||w||}y(w^Tx+b) d=∣∣w∣∣1y(wTx+b)

2.2 目标表示

距离平面的最小间隔,公式表示为:
min ⁡ x i 1 ∣ ∣ w ∣ ∣ y i ( w T x i + b ) \min_{x_i}{\frac{1}{||w||}y_i(w^Tx_i+b)} minxi∣∣w∣∣1yi(wTxi+b)
目标是最大化所有样本点中距离平面的最小间隔,公式表示为:
max ⁡ w , b min ⁡ x i 1 ∣ ∣ w ∣ ∣ y i ( w T x i + b ) = max ⁡ w , b 1 ∣ ∣ w ∣ ∣ min ⁡ x i y i ( w T x i + b ) \max_{w,b}{\min_{x_i}{\frac{1}{||w||}y_i(w^Tx_i+b)}}=\max_{w,b}{\frac{1}{||w||}\min_{x_i}{y_i(w^Tx_i+b)}} maxw,bminxi∣∣w∣∣1yi(wTxi+b)=maxw,b∣∣w∣∣1minxiyi(wTxi+b)
随着 w w w b b b的任意变化, y i ( w T x i + b ) y_i(w^Tx_i+b) yi(wTxi+b)大小可以随之变化。在同一个最优解情况下,会有多个 w w w b b b。于是为了便于求解,约定以下公式作为约束条件:
min ⁡ x i y i ( w T x i + b ) = 1 ⇒ y i ( w T x i + b ) ≥ 1 ⇒ 1 − y i ( w T x i + b ) ≤ 0 \min_{x_i}{y_i(w^Tx_i+b)}=1 \Rightarrow y_i(w^Tx_i+b)\geq1 \Rightarrow 1-y_i(w^Tx_i+b)\leq0 minxiyi(wTxi+b)=1yi(wTxi+b)11yi(wTxi+b)0
注意这里每个样本点都构成一个约束。因此求解目标转变为在该限制下的 max ⁡ w , b 1 ∣ ∣ w ∣ ∣ \max_{w,b}{\frac{1}{||w||}} maxw,b∣∣w∣∣1。为了符合习惯,将其转换为求解最小值,则:
max ⁡ w , b 1 ∣ ∣ w ∣ ∣ \max_{w,b}{\frac{1}{||w||}} maxw,b∣∣w∣∣1= min ⁡ w , b ∣ ∣ w ∣ ∣ = min ⁡ x , b 1 2 w T w \min_{w,b}{||w||}=\min_{x,b}{\frac{1}{2}w^Tw} minw,b∣∣w∣∣=minx,b21wTw
这里增加 1 2 \frac{1}{2} 21是为了便于求导,不会影响结果。
此时优化目标使用公式表示为:
{ min ⁡ x , b 1 2 w T w s . t .    1 − y i ( w T x i + b ) ≤ 0 ,    i = 1 , 2 , . . . N \left\{ \begin{array}{l} \min_{x,b}{\frac{1}{2}w^Tw} \\ s.t. \ \ 1-y_i(w^Tx_i+b)\leq0,\ \ i=1,2,...N \end{array} \right. {minx,b21wTws.t.  1yi(wTxi+b)0,  i=1,2,...N

2.3 求解 w w w

下面就是使用数学原理拉格朗日乘数法、Karush-Kuhn-Tucker (KKT)条件、对偶问题求解上述公式。可以不过于纠结数学原理,如果另有需要,再深入研究。
上述求解目标是有不等式约束下的凸二次优化问题。于是根据拉格朗日乘数法,问题可以转换为:
{ min ⁡ w , b max ⁡ α L ( w , b , α ) s . t .   α i ≥ 0 \left\{ \begin{array}{l} \min_{w,b}{\max_{\alpha}{L(w,b,\alpha)}} \\ s.t. \ \alpha_{i}\geq0 \end{array} \right. {minw,bmaxαL(w,b,α)s.t. αi0

其中拉格朗日函数 L ( w , b , α ) = 1 2 w T w + ∑ i = 1 N α i ( 1 − y i ( w T x i + b ) ) L(w,b,\alpha)=\frac{1}{2}w^{T}w+\sum_{i=1}^{N}{\alpha_{i}(1-y_{i}(w^{T}x_{i}+b))} L(w,b,α)=21wTw+i=1Nαi(1yi(wTxi+b))
该公式需要满足KKT条件
{ 1 − y i ( w T x i + b ) ≤ 0 α i ( 1 − y i ( w T x i + b ) ) = 0 α i ≥ 0 \left\{ \begin{array}{l} 1-y_i(w^Tx_i+b)\leq0 \\ \alpha_{i}(1-y_i(w^Tx_i+b))=0 \\ \alpha_{i}\geq0 \end{array} \right. 1yi(wTxi+b)0αi(1yi(wTxi+b))=0αi0

L ( w , b , α ) L(w,b,\alpha) L(w,b,α)一定是强对偶问题,上述问题可以转换为:
{ max ⁡ α min ⁡ w , b L ( w , b , α ) s . t .   α i ≥ 0 \left\{ \begin{array}{l} \max_{\alpha}{\min_{w,b}{L(w,b,\alpha)}} \\ s.t. \ \alpha_{i}\geq0 \end{array} \right. {maxαminw,bL(w,b,α)s.t. αi0

那么当前首要任务是求解有约束下的 min ⁡ x , b L ( w , b , α ) \min_{x,b}{L(w,b,\alpha)} minx,bL(w,b,α)。求解思路是: L ( w , b , α ) L(w,b,\alpha) L(w,b,α) w w w b b b求偏导,最小值就在偏导为0的点上,那么比较这些点的 L L L值大小,最小的点就是最优解。
则求解下面式子:
{ ∂ L ∂ w = w − ∑ i = 1 N α i y i x i = 0 ∂ L ∂ b = ∑ i = 1 N α i y i = 0 α i ≥ 0 \left\{ \begin{array}{l} \frac{\partial L}{\partial w}=w-\sum_{i=1}^{N}{\alpha_{i}y_{i}x_{i}}=0 \\ \frac{\partial L}{\partial b}=\sum_{i=1}^{N}{\alpha_{i}y_{i}}=0 \\ \alpha_{i}\geq0 \end{array} \right. wL=wi=1Nαiyixi=0bL=i=1Nαiyi=0αi0

可知:
w = ∑ i = 1 N α i y i x i w=\sum_{i=1}^{N}{\alpha_{i}y_{i}x_{i}} w=i=1Nαiyixi
w w w 带回原式子,则:
L ( w , b , α ) = 1 2 w T w + ∑ i = 1 N α i ( 1 − y i ( w T x i + b ) ) = 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j x i x j + ∑ i = 1 N α i − ∑ i = 1 N α i y i ( ∑ j = 1 N α j y j x j x i + b ) = 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j x i x j + ∑ i = 1 N α i − ∑ i = 1 N ∑ j = 1 N α i α j y i y j x i x j − b ∑ i = 1 N α i y i = ∑ i = 1 N α i − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j x i x j \begin{array}{l} L(w,b,\alpha) \\ =\frac{1}{2}w^{T}w+\sum_{i=1}^{N}{\alpha_{i}(1-y_{i}(w^{T}x_{i}+b))} \\ = \frac{1}{2}{\sum_{i=1}^{N}\sum_{j=1}^{N}{\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}x_{j}}}+\sum_{i=1}^{N}{\alpha_{i}}-\sum_{i=1}^{N}{\alpha_{i}y_{i}(\sum_{j=1}^{N}{\alpha_{j}y_{j}x_{j}}x_{i}+b)} \\ = \frac{1}{2}{\sum_{i=1}^{N}\sum_{j=1}^{N}{\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}x_{j}}}+\sum_{i=1}^{N}{\alpha_{i}}-\sum_{i=1}^{N}\sum_{j=1}^{N}{\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}x_{j}}-b\sum_{i=1}^{N}{\alpha_{i}y_{i}} \\ = \sum_{i=1}^{N}{\alpha_{i}}-\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}{\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}x_{j}} \end{array} L(w,b,α)=21wTw+i=1Nαi(1yi(wTxi+b))=21i=1Nj=1Nαiαjyiyjxixj+i=1Nαii=1Nαiyi(j=1Nαjyjxjxi+b)=21i=1Nj=1Nαiαjyiyjxixj+i=1Nαii=1Nj=1Nαiαjyiyjxixjbi=1Nαiyi=i=1Nαi21i=1Nj=1Nαiαjyiyjxixj

下一步又需要求解:
{ max ⁡ α [ ∑ i = 1 N α i − 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j x i x j ] s . t .   ∑ i = 1 N α i y i = 0 , α i ≥ 0 \left\{ \begin{array}{l} \max_{\alpha}{[\sum_{i=1}^{N}{\alpha_{i}}-\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}{\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}x_{j}}]} \\ s.t. \ \sum_{i=1}^{N}{\alpha_{i}y_{i}}=0,\alpha_{i}\geq0 \end{array} \right. {maxα[i=1Nαi21i=1Nj=1Nαiαjyiyjxixj]s.t. i=1Nαiyi=0,αi0

即:
{ min ⁡ α [ 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j x i x j − ∑ i = 1 N α i ] s . t .   ∑ i = 1 N α i y i = 0 , α i ≥ 0 \left\{ \begin{array}{l} \min_{\alpha}{[\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}{\alpha_{i}\alpha_{j}y_{i}y_{j}x_{i}x_{j}}-\sum_{i=1}^{N}{\alpha_{i}}]} \\ s.t. \ \sum_{i=1}^{N}{\alpha_{i}y_{i}}=0,\alpha_{i}\geq0 \end{array} \right. {minα[21i=1Nj=1Nαiαjyiyjxixji=1Nαi]s.t. i=1Nαiyi=0,αi0

2.4 求解 b b b

支持向量是位于间隔边界上样本点,即 1 − y i ( w T x i + b ) ) = 0 1-y_i(w^Tx_i+b))=0 1yi(wTxi+b))=0
对于任意一个支持向量,求可以通过 1 − y i ( w T x i + b ) ) = 0 1-y_i(w^Tx_i+b))=0 1yi(wTxi+b))=0计算得到 b b b
如果有多个支持向量,记 S S S为支持向量集合,那么可以求解:
b = 1 ∣ S ∣ ∑ S y i − w T x i b=\frac{1}{|S|}\sum_{S}{y_i-w^Tx_i} b=S1SyiwTxi

2.5 求解支持向量(SOM算法)

下面需要基于上面的公式求解每个样本点的 α i \alpha_{i} αi。所有满足 α i ≤ 0 \alpha_{i}\leq0 αi0 的样本均为支持向量。
如果使用传统二次规划算法求解,样本量较大时效率较为低下。可以使用序列最小优化算法(Sequential Minimal Optimization, SMO)求解:

  1. 初始化
    设置所有拉格朗日乘子α的初始值,通常设为零。

  2. 选择两个变量 α i \alpha_i αi α j \alpha_j αj

    • 外层循环:
      遍历训练集中的每个样本,检查其是否违反KKT条件。如果发现某个样本不满足KKT条件,则将其作为第一个要优化的变量 α i \alpha_i αi
    • 内层循环:
      选择第二个变量 α j \alpha_j αj,目标是最大化 ∣ E 1 − E 2 ∣ |E1 - E2| E1E2∣,即两者的误差差异。这有助于确保每次迭代都能带来显著的变化。( E i = w ⊤ x i + b − y i E_i = \mathbf{w}^\top \mathbf{x}_i + b - y_i Ei=wxi+byi,是样本预测值与真实值的误差。)
  3. 优化子问题
    固定其他 α \alpha α,仅优化 α i \alpha_i αi α j \alpha_j αj。由于约束 α i y i + α j y j = − ∑ k ≠ i , j α k y k = ζ ( 常数 ) \alpha_i y_i + \alpha_j y_j = -\sum_{k\neq i,j} \alpha_k y_k = \zeta \quad (\text{常数}) αiyi+αjyj=k=i,jαkyk=ζ(常数),可用 α 1 \alpha_1 α1表示 α 2 \alpha_2 α2,将问题转换为单变量二次函数优化。然后求导找极值点可得:
    α j new = α j old + y j ( E i − E j ) η , η = K ( x i , x i ) + K ( x j , x j ) − 2 K ( x i , x j ) \alpha_j^{\text{new}} = \alpha_j^{\text{old}} + \frac{y_j (E_i - E_j)}{\eta}, \quad \eta = K(x_i, x_i) + K(x_j, x_j) - 2K(x_i, x_j) αjnew=αjold+ηyj(EiEj),η=K(xi,xi)+K(xj,xj)2K(xi,xj)
    其中 K ( x i , x j ) = x i ∗ x j K(x_i, x_j)=x_i*x_j K(xi,xj)=xixj,称为线性核。 η = ∥ x i − x j ∥ 2 \eta =\|\mathbf{x}_i - \mathbf{x}_j\|^2 η=xixj2(几何意义:两个样本的欧氏距离平方)。
    然后对 α j new \alpha_j^{\text{new}} αjnew 进行剪裁,也就是约束其在可行域内:
    α 2 new,clipped = { H if  α 2 new > H L if  α 2 new < L α 2 new otherwise \alpha_2^{\text{new,clipped}} = \begin{cases} H & \text{if } \alpha_2^{\text{new}} > H \\ L & \text{if } \alpha_2^{\text{new}} < L \\ \alpha_2^{\text{new}} & \text{otherwise} \end{cases} α2new,clipped= HLα2newif α2new>Hif α2new<Lotherwise

    其中:

    • y i ≠ y j y_i \neq y_j yi=yj,则: L = max ⁡ ( 0 , α j old − α i old ) , H = + ∞ L = \max(0, \alpha_j^{\text{old}} - \alpha_i^{\text{old}}), \quad H = +\infty L=max(0,αjoldαiold),H=+
    • y i = y j y_i = y_j yi=yj,则: L = max ⁡ ( 0 , α i old + α j old − ζ ) , H = + ∞ L = \max(0, \alpha_i^{\text{old}} + \alpha_j^{\text{old}} - \zeta), \quad H = +\infty L=max(0,αiold+αjoldζ),H=+

    然后更新 α i \alpha_i αi
    α 1 new = α 1 old + y 1 y 2 ( α 2 old − α 2 new,clipped ) \alpha_1^{\text{new}} = \alpha_1^{\text{old}} + y_1 y_2 (\alpha_2^{\text{old}} - \alpha_2^{\text{new,clipped}}) α1new=α1old+y1y2(α2oldα2new,clipped)

  4. 更新阈值 b b b 和误差缓存

    • 根据新 α i \alpha_i αi α j \alpha_j αj 计算阈值 b b b
    • 更新所有样本的误差缓存 E i E_i Ei,用于后续变量选择。
  5. 收敛判断
    重复上述步骤,直到所有 α i \alpha_i αi 满足KKT条件,或达到最大迭代次数。

3 优化

3.1 软间隔

允许部分样本不满足约束,引入松弛变量 ξ i ≥ 0 \xi_i \geq 0 ξi0,优化目标变为:
{ min ⁡ x , b 1 2 w T w + C ∑ i = 1 n ξ i s . t .    1 − y i ( w T x i + b ) ≤ ξ i ,   ξ i ≥ 0 ,   i = 1 , 2 , . . . N \left\{ \begin{array}{l} \min_{x,b}{\frac{1}{2}w^Tw}+C\sum_{i=1}^{n}{\xi_i} \\ s.t. \ \ 1-y_i(w^Tx_i+b)\leq\xi_i ,\ \xi_i \geq 0, \ i=1,2,...N \end{array} \right. {minx,b21wTw+Ci=1nξis.t.  1yi(wTxi+b)ξi, ξi0, i=1,2,...N
其中 C C C 是惩罚参数,控制分类错误与间隔的权衡。

3.2 核技巧(Kernel Trick)

当数据线性不可分时,可以通过映射 $\phi(x)$ 将数据投影到高维空间,使其线性可分。
为了避免显式计算高维内积 ϕ ( x i ) ⋅ ϕ ( x j ) \phi(x_i) \cdot \phi(x_j) ϕ(xi)ϕ(xj),可以直接使用核函数 ( K(x_i, x_j) ) 代替。
常用核函数:

  • 线性核: K ( x i , x j ) = x i ⋅ x j K(x_i, x_j) = x_i \cdot x_j K(xi,xj)=xixj
  • 多项式核: K ( x i , x j ) = ( x i ⋅ x j + c ) d K(x_i, x_j) = (x_i \cdot x_j + c)^d K(xi,xj)=(xixj+c)d
  • 高斯核(RBF): K ( x i , x j ) = exp ⁡ ( − ∥ x i − x j ∥ 2 2 σ 2 ) K(x_i, x_j) = \exp\left( -\frac{\|x_i - x_j\|^2}{2\sigma^2} \right) K(xi,xj)=exp(2σ2xixj2)

2.5的优化目标变为:
{ min ⁡ α [ 1 2 ∑ i = 1 N ∑ j = 1 N α i α j y i y j K ( x i , x j ) − ∑ i = 1 N α i ] s . t .   ∑ i = 1 N α i y i = 0 , α i ≥ 0 \left\{ \begin{array}{l} \min_{\alpha}{[\frac{1}{2}\sum_{i=1}^{N}\sum_{j=1}^{N}{\alpha_{i}\alpha_{j}y_{i}y_{j}K(x_i, x_j)}-\sum_{i=1}^{N}{\alpha_{i}}]} \\ s.t. \ \sum_{i=1}^{N}{\alpha_{i}y_{i}}=0,\alpha_{i}\geq0 \end{array} \right. {minα[21i=1Nj=1NαiαjyiyjK(xi,xj)i=1Nαi]s.t. i=1Nαiyi=0,αi0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2304176.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能

macos sequoia默认ctrlenter会打开鼠标右键菜单&#xff0c;使得很多软件有冲突。关闭方法&#xff1a; end

Android14 Camera框架中Jpeg流buffer大小的计算

背景描述 Android13中&#xff0c;相机框架包含对AIDL Camera HAL的支持&#xff0c;在Android13或更高版本中添加的相机功能只能通过AIDL Camera HAL接口使用。 对于Android应用层来说&#xff0c;使用API34即以后版本的Camera应用程序通过Camera AIDL Interface访问到HAL层…

springboot系列十四: 注入Servlet, Filter, Listener + 内置Tomcat配置和切换 + 数据库操作

文章目录 注入Servlet, Filter, Listener官方文档基本介绍使用注解方式注入使用RegistrationBean方法注入DispatcherServlet详解 内置Tomcat配置和切换基本介绍内置Tomcat配置通过application.yml完成配置通过类配置 切换Undertow 数据库操作 JdbcHikariDataSource需求分析应用…

区块链共识机制详解

区块链共识机制详解 &#x1f91d; 1. 什么是共识机制&#xff1f; 共识机制是区块链网络中&#xff0c;所有节点就某个状态&#xff08;如交易的有效性&#xff09;达成一致的规则和过程。它解决了在去中心化网络中如何确保数据一致性的问题。 2. 主流共识机制 2.1 工作量证…

详解单例模式、模板方法及项目和源码应用

大家好&#xff0c;我是此林。 设计模式为解决特定问题提供了标准化的方法。在项目中合理应用设计模式&#xff0c;可以避免重复解决相同类型的问题&#xff0c;使我们能够更加专注于具体的业务逻辑&#xff0c;减少重复劳动。设计模式在定义系统结构时通常考虑到未来的扩展。…

解耦的艺术_应用架构中的解耦

文章目录 Pre解耦的技术演化应用架构中的解耦小结 Pre 解耦的艺术_通过DPI依赖倒置实现解耦 解耦的艺术_通过中间层映射实现解耦 解耦的技术演化 技术的演化史&#xff0c;也是一部解耦的历史。从最初的面向对象编程&#xff08;OOP&#xff09;到Spring框架的依赖注入&…

Winform(C#) 项目保存页面

上一张我们已经实现了TCP和串口页面的数据展示&#xff0c;和保存控件 我们这一章&#xff0c;实现如何去&#xff0c;控制保存。 一、控件展示 CheckBox TextBox Button label Name: checkSaveImage checkDelete txtSaveDays txtSaveImagePath btnSelectIm…

LangChain-基础(prompts、序列化、流式输出、自定义输出)

LangChain-基础 我们现在使用的大模型训练数据都是基于历史数据训练出来的&#xff0c;它们都无法处理一些实时性的问题或者一些在训练时为训练到的一些问题&#xff0c;解决这个问题有2种解决方案 基于现有的大模型上进行微调&#xff0c;使得它能适应这些问题&#xff08;本…

蓝思科技赋能灵伴科技:AI眼镜产能与供应链双升级

2月22日&#xff0c;蓝思科技宣布与AI交互领军企业杭州灵伴科技&#xff08;Rokid&#xff09;达成深度战略合作&#xff0c;通过整机组装与全产业链整合&#xff0c;为2025年全球AI眼镜出货量爆发式增长&#xff08;预计达400万-1200万台&#xff09;提供核心支撑。 双方合作通…

2025前端框架最新组件解析与实战技巧:Vue与React的革新之路

作者&#xff1a;飞天大河豚 引言 2025年的前端开发领域&#xff0c;Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化&#xff0c;两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…

零基础学QT、C++(六)制作桌面摄像头软件

目录 一、前言 二、Python项目包 三、C项目包 四、 项目说明 五、结语 章节汇总 一、前言 上一节&#xff0c;成功导入了OpenCV库 零基础学QT、C&#xff08;四&#xff09;QT程序打包-CSDN博客文章浏览阅读1.1k次&#xff0c;点赞29次&#xff0c;收藏23次。QT程序打包。将项…

python-leetcode-回文链表

234. 回文链表 - 力扣&#xff08;LeetCode&#xff09; # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def isPalindrome(self, head: Optional[Lis…

虚拟机从零实现机器人控制

1. 系统安装 因Docker不适合需要图形界面的开发&#xff0c;因此使用虚拟机VMware方便可视化界面方式查看效果&#xff0c;相关软件可以从官网下载&#xff0c;这里有一整套免费安装文件百度网盘地址&#xff1a; 2. ROS安装 Ubuntu 22.04&#xff1a;https://docs.ros.org…

mysql之B+ 树索引 (InnoDB 存储引擎)机制

b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言&#xff1a;****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读&#xff0c;与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…

Unity 聊天气泡根据文本内容适配

第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置&#xff1a;&#xff08;0&#xff0c;1&#xff09; 对齐方式&#xff1a;左上对齐 3、设置文本pivot位置和对齐方式&#xff0c;并挂上布局组件 pivot设置和对齐方式和底图一样&#…

Android Studio安装配置及运行

一、下载Android Studio 官网下载&#xff1a;下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面&#xff0c;选择同意条款&#xff0c;并点击下载&#xff0c;如图&#xff1a; 二、详细安装 双击下载的文件 三、配置Android Studio …

FTP 实验(ENSP模拟器实现)

FTP 概述 FTP&#xff08;File Transfer Protocol&#xff0c;文件传输协议&#xff09;是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型&#xff0c;客户端通过FTP客户端软件&#xff0c;连接到FTP服务…

基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室

开源项目 botgroup.chat 介绍 AI 多人聊天室&#xff1a; 一个基于 React 和 Cloudflare Pages(免费一键部署) 的多人 AI 聊天应用&#xff0c;支持多个 AI 角色同时参与对话&#xff0c;提供类似群聊的交互体验。体验地址&#xff1a;https://botgroup.chat 开源仓库&#x…

【电机控制器】ESP32-C3语言模型——豆包

【电机控制器】ESP32-C3语言模型——豆包 文章目录 [TOC](文章目录) 前言一、简介二、代码三、实验结果四、参考资料总结 前言 使用工具&#xff1a; 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、简介 二、代码 #include <WiFi.h> #inc…

Flask实现高效日志记录模块

目录 一. 简介&#xff1a; 1. 为什么需要请求日志 二. 日志模块组成 1. 对应日志表创建&#xff08;包含日志记录的关键字段&#xff09; 2. 编写日志记录静态方法 3. 在Flask中捕获请求日志 4. 捕获异常并记录错误日志 5. 编写日志接口数据展示 6. 写入数据展…