支持向量机(SVM):算法讲解与原理推导
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} x′x 为 x − x ′ x-x' x−x′。需要求解 x x x 到平面的距离 d d d,也就是 x ′ x ⃗ \vec {x'x} x′x 在 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(x−x′)=∣∣w∣∣×∣∣x−x′∣∣×cos<wT,x−x′>
则投影为:
∣ ∣ 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) ∣∣x−x′∣∣cos<wT,x−x′>=∣∣w∣∣WT(x−x′)=∣∣w∣∣1(wTx+b)
所以距离公式为:
d = 1 ∣ ∣ w ∣ ∣ ∣ w T x + b ∣ d = \frac{1}{||w||}|w^Tx+b| d=∣∣w∣∣1∣wTx+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)=1⇒yi(wTxi+b)≥1⇒1−yi(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. 1−yi(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. αi≥0
其中拉格朗日函数 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(1−yi(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. ⎩ ⎨ ⎧1−yi(wTxi+b)≤0αi(1−yi(wTxi+b))=0αi≥0
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. αi≥0
那么当前首要任务是求解有约束下的 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. ⎩ ⎨ ⎧∂w∂L=w−∑i=1Nαiyixi=0∂b∂L=∑i=1Nαiyi=0αi≥0
可知:
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(1−yi(wTxi+b))=21∑i=1N∑j=1Nαiαjyiyjxixj+∑i=1Nαi−∑i=1Nαiyi(∑j=1Nαjyjxjxi+b)=21∑i=1N∑j=1Nαiαjyiyjxixj+∑i=1Nαi−∑i=1N∑j=1Nαiαjyiyjxixj−b∑i=1Nαiyi=∑i=1Nαi−21∑i=1N∑j=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αi−21∑i=1N∑j=1Nαiαjyiyjxixj]s.t. ∑i=1Nαiyi=0,αi≥0
即:
{ 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α[21∑i=1N∑j=1Nαiαjyiyjxixj−∑i=1Nαi]s.t. ∑i=1Nαiyi=0,αi≥0
2.4 求解 b b b
支持向量是位于间隔边界上样本点,即 1 − y i ( w T x i + b ) ) = 0 1-y_i(w^Tx_i+b))=0 1−yi(wTxi+b))=0。
对于任意一个支持向量,求可以通过 1 − y i ( w T x i + b ) ) = 0 1-y_i(w^Tx_i+b))=0 1−yi(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=∣S∣1∑Syi−wTxi。
2.5 求解支持向量(SOM算法)
下面需要基于上面的公式求解每个样本点的 α i \alpha_{i} αi。所有满足 α i ≤ 0 \alpha_{i}\leq0 αi≤0 的样本均为支持向量。
如果使用传统二次规划算法求解,样本量较大时效率较为低下。可以使用序列最小优化算法(Sequential Minimal Optimization, SMO)求解:
-
初始化
设置所有拉格朗日乘子α的初始值,通常设为零。 -
选择两个变量 α i \alpha_i αi 和 α j \alpha_j αj
- 外层循环:
遍历训练集中的每个样本,检查其是否违反KKT条件。如果发现某个样本不满足KKT条件,则将其作为第一个要优化的变量 α i \alpha_i αi。 - 内层循环:
选择第二个变量 α j \alpha_j αj,目标是最大化 ∣ E 1 − E 2 ∣ |E1 - E2| ∣E1−E2∣,即两者的误差差异。这有助于确保每次迭代都能带来显著的变化。( E i = w ⊤ x i + b − y i E_i = \mathbf{w}^\top \mathbf{x}_i + b - y_i Ei=w⊤xi+b−yi,是样本预测值与真实值的误差。)
- 外层循环:
-
优化子问题
固定其他 α \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(Ei−Ej),η=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)=xi∗xj,称为线性核。 η = ∥ x i − x j ∥ 2 \eta =\|\mathbf{x}_i - \mathbf{x}_j\|^2 η=∥xi−xj∥2(几何意义:两个样本的欧氏距离平方)。
然后对 α 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)。 -
更新阈值 b b b 和误差缓存
- 根据新 α i \alpha_i αi 和 α j \alpha_j αj 计算阈值 b b b。
- 更新所有样本的误差缓存 E i E_i Ei,用于后续变量选择。
-
收敛判断
重复上述步骤,直到所有 α i \alpha_i αi 满足KKT条件,或达到最大迭代次数。
3 优化
3.1 软间隔
允许部分样本不满足约束,引入松弛变量 ξ i ≥ 0 \xi_i \geq 0 ξi≥0,优化目标变为:
{ 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+C∑i=1nξis.t. 1−yi(wTxi+b)≤ξi, ξi≥0, 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)=xi⋅xj
- 多项式核: 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)=(xi⋅xj+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σ2∥xi−xj∥2)
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α[21∑i=1N∑j=1NαiαjyiyjK(xi,xj)−∑i=1Nαi]s.t. ∑i=1Nαiyi=0,αi≥0
相关文章:
支持向量机(SVM):算法讲解与原理推导
1 SVM介绍 SVM是一个二类分类器,它的全称是Support Vector Machine,即支持向量机。 SVM的目标是找到一个超平面,使用两类数据离这个超平面越远越好,从而对新的数据分类更准确,即使分类器更加健壮。比如上面的图中&am…...
Redis 缓存穿透、击穿、雪崩:问题与解决方案
在使用 Redis 作为缓存中间件时,系统可能会面临一些常见的问题,如 缓存穿透、缓存击穿 和 缓存雪崩。这些问题如果不加以解决,可能会导致数据库压力过大、系统响应变慢甚至崩溃。本文将详细分析这三种问题的起因,并提供有效的解决…...
macos sequoia 禁用 ctrl+enter 打开鼠标右键菜单功能
macos sequoia默认ctrlenter会打开鼠标右键菜单,使得很多软件有冲突。关闭方法: end...
Android14 Camera框架中Jpeg流buffer大小的计算
背景描述 Android13中,相机框架包含对AIDL Camera HAL的支持,在Android13或更高版本中添加的相机功能只能通过AIDL Camera HAL接口使用。 对于Android应用层来说,使用API34即以后版本的Camera应用程序通过Camera AIDL Interface访问到HAL层…...
springboot系列十四: 注入Servlet, Filter, Listener + 内置Tomcat配置和切换 + 数据库操作
文章目录 注入Servlet, Filter, Listener官方文档基本介绍使用注解方式注入使用RegistrationBean方法注入DispatcherServlet详解 内置Tomcat配置和切换基本介绍内置Tomcat配置通过application.yml完成配置通过类配置 切换Undertow 数据库操作 JdbcHikariDataSource需求分析应用…...
区块链共识机制详解
区块链共识机制详解 🤝 1. 什么是共识机制? 共识机制是区块链网络中,所有节点就某个状态(如交易的有效性)达成一致的规则和过程。它解决了在去中心化网络中如何确保数据一致性的问题。 2. 主流共识机制 2.1 工作量证…...
详解单例模式、模板方法及项目和源码应用
大家好,我是此林。 设计模式为解决特定问题提供了标准化的方法。在项目中合理应用设计模式,可以避免重复解决相同类型的问题,使我们能够更加专注于具体的业务逻辑,减少重复劳动。设计模式在定义系统结构时通常考虑到未来的扩展。…...
解耦的艺术_应用架构中的解耦
文章目录 Pre解耦的技术演化应用架构中的解耦小结 Pre 解耦的艺术_通过DPI依赖倒置实现解耦 解耦的艺术_通过中间层映射实现解耦 解耦的技术演化 技术的演化史,也是一部解耦的历史。从最初的面向对象编程(OOP)到Spring框架的依赖注入&…...
Winform(C#) 项目保存页面
上一张我们已经实现了TCP和串口页面的数据展示,和保存控件 我们这一章,实现如何去,控制保存。 一、控件展示 CheckBox TextBox Button label Name: checkSaveImage checkDelete txtSaveDays txtSaveImagePath btnSelectIm…...
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_array_init 函数
ngx_array_init 定义在 src/core/ngx_array.h static ngx_inline ngx_int_t ngx_array_init(ngx_array_t *array, ngx_pool_t *pool, ngx_uint_t n, size_t size) {/** set "array->nelts" before "array->elts", otherwise MSVC thinks* that "…...
LangChain-基础(prompts、序列化、流式输出、自定义输出)
LangChain-基础 我们现在使用的大模型训练数据都是基于历史数据训练出来的,它们都无法处理一些实时性的问题或者一些在训练时为训练到的一些问题,解决这个问题有2种解决方案 基于现有的大模型上进行微调,使得它能适应这些问题(本…...
蓝思科技赋能灵伴科技:AI眼镜产能与供应链双升级
2月22日,蓝思科技宣布与AI交互领军企业杭州灵伴科技(Rokid)达成深度战略合作,通过整机组装与全产业链整合,为2025年全球AI眼镜出货量爆发式增长(预计达400万-1200万台)提供核心支撑。 双方合作通…...
2025前端框架最新组件解析与实战技巧:Vue与React的革新之路
作者:飞天大河豚 引言 2025年的前端开发领域,Vue与React依然是开发者最青睐的框架。随着Vue 3的全面普及和React 18的持续优化,两大框架在组件化开发、性能优化、工程化支持等方面均有显著突破。本文将从最新组件特性、使用场景和编码技巧三…...
零基础学QT、C++(六)制作桌面摄像头软件
目录 一、前言 二、Python项目包 三、C项目包 四、 项目说明 五、结语 章节汇总 一、前言 上一节,成功导入了OpenCV库 零基础学QT、C(四)QT程序打包-CSDN博客文章浏览阅读1.1k次,点赞29次,收藏23次。QT程序打包。将项…...
使用docker开发镜像编译
前言 搭建参考的是官网文档 环境 wsl2 wsl2内存分配和禁用swap 在window主机中,按下快捷键win+r,输入%UserProfile%,会跳转到用户目录,在该目录下,如果没有wsl配置文件,则创建一个.wslconfig,文件类型应为WSLCONFIG,而不是文档类型 我是用vscode来创建的,进入到.wslco…...
python-leetcode-回文链表
234. 回文链表 - 力扣(LeetCode) # 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…...
windows的CMD命令提示符
一.打开CMD命令窗口 方法一:开始菜单 -> Windows 系统 -> 命令提示符。方法二:按下快捷键 Win R 打开运行,输入 cmd 回车。方法三:点击任务栏搜索按钮,搜索 cmd 并打开。方法四:在资源管理器的地址…...
虚拟机从零实现机器人控制
1. 系统安装 因Docker不适合需要图形界面的开发,因此使用虚拟机VMware方便可视化界面方式查看效果,相关软件可以从官网下载,这里有一整套免费安装文件百度网盘地址: 2. ROS安装 Ubuntu 22.04:https://docs.ros.org…...
mysql之B+ 树索引 (InnoDB 存储引擎)机制
b树索引机制 B 树索引 (InnoDB 存储引擎)机制**引言:****1. 数据页结构与查找**2. 索引的引入**3. InnoDB 的 B 树索引****4. InnoDB B 树索引的注意事项****5. MyISAM 的索引方案 (选读,与 InnoDB 做对比)****6. MySQL 中创建和删除索引的语句** **B 树…...
Spring Boot定时任务原理
Spring Boot定时任务原理 在现代应用中,定时任务的调度是实现周期性操作的关键机制。Spring Boot 提供了强大的定时任务支持,通过注解驱动的方式,开发者可以轻松地为方法添加定时任务功能。本文将深入探讨 Spring Boot 中定时任务的实现原理…...
MySQL 架构
目录 1. MySQL 架构概览 (1) 客户端/服务器架构 (2) 存储引擎架构 2. 主要组件 (1) 客户端工具 (2) MySQL 服务器 (3) 存储引擎 3. MySQL 架构图 4. MySQL 架构的特点 5. MySQL 的高级架构 (1) 主从复制(Master-Slave Replication) (2) 主主…...
Unity 聊天气泡根据文本内容适配
第一步 拼接UI 1、对气泡图进行九宫图切割 2、设置底图pivot位置和对齐方式 pivot位置:(0,1) 对齐方式:左上对齐 3、设置文本pivot位置和对齐方式,并挂上布局组件 pivot设置和对齐方式和底图一样&#…...
ok113i平台——usb触摸屏驱动开发
在嵌入式Linux系统中,如果USB触摸屏能够检测到并且在手指移动时有数据,但点击无法触发,这可能是因为触摸屏驱动或配置的问题。以下是一些可能的解决方法: 1. 确认驱动支持 首先,确保您使用的触摸屏驱动程序完全支持您…...
AI 百炼成神:逻辑回归, 垃圾邮件分类
第二个项目:逻辑回归垃圾邮件分类 项目代码下载地址:https://download.csdn.net/download/m0_56366541/90398247 项目目标 学习逻辑回归的基本概念。使用逻辑回归算法来实现垃圾邮件的分类。理解如何处理文本数据以及如何评估分类模型的性能。项目步骤 准备数据集 我们将使…...
【Unity】Unity clone 场景渲染的灯光贴图异位问题
Unity clone 场景渲染的灯光贴图异位问题 问题 需要将一个场景clone 一份保存到本地 当克隆完成后,副本场景的灯光贴图异位了,与原场景存在较大的差别 问题原因 场景被clone 后,场景的灯光渲染数据不能共用,即Lightmapping.li…...
Android Studio安装配置及运行
一、下载Android Studio 官网下载:下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 跳转到下载界面,选择同意条款,并点击下载,如图: 二、详细安装 双击下载的文件 三、配置Android Studio …...
运维脚本——9.配置漂移检测
场景:检测服务器配置与基准配置的差异,防止未经授权的修改。 示例:使用Ansible Playbook对比当前配置与标准模板。 - hosts: alltasks:- name: Check SSH configuration against baselineansible.builtin.diff:path: /etc/ssh/sshd_configori…...
FTP 实验(ENSP模拟器实现)
FTP 概述 FTP(File Transfer Protocol,文件传输协议)是一种用于在网络上进行文件传输的标准协议。它允许用户在两台计算机之间上传和下载文件。 1、FTP采用客户端-服务器模型,客户端通过FTP客户端软件,连接到FTP服务…...
基于 DeepSeek + Gemeni 打造 AI+前端的多人聊天室
开源项目 botgroup.chat 介绍 AI 多人聊天室: 一个基于 React 和 Cloudflare Pages(免费一键部署) 的多人 AI 聊天应用,支持多个 AI 角色同时参与对话,提供类似群聊的交互体验。体验地址:https://botgroup.chat 开源仓库&#x…...
rust笔记5-derive属性2
在 Rust 中,derive 是一种自动为结构体或枚举实现特定 trait 的机制。通过 #[derive(...)] 属性,Rust 编译器可以自动生成一些常见 trait 的实现代码,从而减少手动编写重复代码的工作量。 以下是对 Copy、Clone、Hash 和 Default 这几个常用 trait 的详细介绍和示例: 1. C…...
