【Sklearn-驯化】一文从基础帮你搞懂svm算法做分类和回归的原理以及实践

【Sklearn-驯化】一文从基础帮你搞懂svm算法做分类和回归的原理以及实践

 
本次修炼方法请往下查看
在这里插入图片描述

🌈 欢迎莅临我的个人主页 👈这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合,智慧小天地!
🎇 免费获取相关内容文档关注:微信公众号,发送 pandas 即可获取
🎇 相关内容视频讲解 B站

🎓 博主简介:AI算法驯化师,混迹多个大厂搜索、推荐、广告、数据分析、数据挖掘岗位 个人申请专利40+,熟练掌握机器、深度学习等各类应用算法原理和项目实战经验

🔧 技术专长: 在机器学习、搜索、广告、推荐、CV、NLP、多模态、数据分析等算法相关领域有丰富的项目实战经验。已累计为求职、科研、学习等需求提供近千次有偿|无偿定制化服务,助力多位小伙伴在学习、求职、工作上少走弯路、提高效率,近一年好评率100%

📝 博客风采: 积极分享关于机器学习、深度学习、数据分析、NLP、PyTorch、Python、Linux、工作、项目总结相关的实用内容。


文章目录

    • 🎯 1. 基本介绍
    • 💡 2. 原理介绍
      • 2.1 基础知识
      • 2.2 原理推导
    • 🔍 3. 代码实践
      • 3.1 svm分类
      • 3.2 svm回归
    • 🔍 4. 注意事项
    • 🔍 5. 总结

🎯 1. 基本介绍

  支持向量机(Support Vector Machine, SVM)是一种监督学习算法,用于分类和回归任务。SVM通过找到数据点之间的最优边界(称为超平面)来区分不同的类别。在scikit-learn(简称sklearn)中,SVM模型通过SVC(用于分类)和SVR(用于回归)类实现。

💡 2. 原理介绍

2.1 基础知识

  样本空间任意点x到超平面 ( w T x + b = 0 ) (w^Tx+b=0) (wTx+b=0)的距离为:

r = ∣ w T x + b ∣ ∣ ∣ w ∣ ∣ , ∣ ∣ w ∣ ∣ = w 1 2 + w 2 2 + w 3 2 + . . . r=\frac{|w^{T}x+b|} {||w||}, ||w||=\sqrt {w_1^2+w_2^2+w_3^2+...} r=∣∣w∣∣wTx+b,∣∣w∣∣=w12+w22+w32+...

对偶问题: 有点时候不好去求解原问题的最优解,而通过求解对偶问题的解确很好求。对于对偶问题的理解:现在的问题是在满足KKT条件的基础上去求解:min:f(x),通过拉格朗日乘子法将约束条件转换为函数后,该式则变成:min(x):max(a):f(x, a),由于去直接求解这个问题需要先求含有两个变量的函数再去求含有x的函数比较麻烦,因此,可以先去求解x再去求解其它的变量因此,上述的最优结果可以改写为:max(a):min(x):f(x,a),具体的证明过程如下所示:

对偶问题具体表达如下:
m a x α , β : α i ⩾ 0 m i n x L ( x , α , β ) ⩽ m i n x m a x α , β : α i ⩾ 0 L ( x , α , β ) \underset{\alpha,\beta:\alpha_i\geqslant0}{max} \underset{x}{min}L(x,\alpha, \beta) \leqslant \underset{x}{min}\underset{\alpha,\beta:\alpha_i\geqslant0}{max}L(x,\alpha, \beta) α,β:αi0maxxminL(x,α,β)xminα,β:αi0maxL(x,α,β)
具体的证明如下所示:
m i n x L ( x , α , β ) ⩽ L ( x , α , β ) ⩽ m a x α , β : α i ⩽ 0 L ( x , α , β ) \underset{x}{min}L(x,\alpha,\beta) \leqslant L(x, \alpha, \beta) \leqslant \underset{\alpha, \beta:\alpha_i \leqslant 0}{max}L(x, \alpha, \beta) xminL(x,α,β)L(x,α,β)α,β:αi0maxL(x,α,β),因此,在对公式的左边取最大值,公式的右边取最小值,公式同样满足,就可以得到上述的对偶问题的公式表达式。

KKT条件和拉格朗日乘子法: 用来求解最优问题的两种常用方法,基本的思想就是将有约束条件的优化问题转换为没有约束条件的约束问题,当约束条件为等式时,直接使用拉格朗日乘子法就可以,当存在不等式约束条件时使用KKT条件加上拉格朗日乘子法来求解最优解,对于最优化问题,一般由如下三种情况组成:
(1): 无等式约束条件: 这种情况直接通过函数对相应变量进行求导,然后令导函数等于0,求得相应的可能极值点,然后再带入原函数进行对比,即可得出最小或最大值。
(2): 等式约束条件: 如目标函数f(x), 约束条件为h(x),具体的数学表达形式如下:
m i n : f ( x ) min: f(x) min:f(x)
s . t . h k ( x ) = 0 , k = 1 , 2 , 3... l s.t. h_{k}(x)=0, k=1,2,3...l s.t.hk(x)=0,k=1,2,3...l
对于形如上述的最优化问题,之前高中课本教的是消元法,主要思路就是将约束条件进行变化,然后在带入目标函数中消除一个参数从而变成没有等式约束条件,再进行参数求导等于零即可得出结果。但是这种方法有时候计算太复杂了,这时拉格朗日乘子法就出来了,将上述数学表达使用拉朗乘数法,为了表达清晰举例说明:
f ( x , y , z ) = 8 x y z f(x,y,z)=8xyz f(x,y,z)=8xyz
h ( x , y , z ) = x 2 a 2 + y 2 b 2 + z 2 c 2 − 1 h(x,y,z)=\frac{x^2}{a^2} + \frac{y^2}{b^2}+\frac{z^2}{c^2}-1 h(x,y,z)=a2x2+b2y2+c2z21
则上式的拉朗表达如下,转为无约束的优化问题,这里的参数 λ \lambda λ没有相关的限制:
F ( x , y , z , λ ) = f ( x , y , z ) + λ h ( x , y , z ) F(x,y,z,\lambda)=f(x,y,z)+\lambda h(x,y,z) F(x,y,z,λ)=f(x,y,z)+λh(x,y,z)
F ( x , y , z , λ ) = 8 x y z + λ ( x 2 a 2 + y 2 b 2 + z 2 c 2 − 1 ) F(x,y,z,\lambda)=8xyz+\lambda (\frac{x^2}{a^2} +\frac{y^2}{b^2}+\frac{z^2}{c^2}-1) F(x,y,z,λ)=8xyz+λ(a2x2+b2y2+c2z21)
然后对上式种的参数 x , y , z , λ x,y,z,\lambda x,y,z,λ进行求导令其等于0,即可求得目标函数的极值。
(3): 不等式约束条件: 此时为了得到最优解拉朗有点乏力了,至于为啥乏力,我也不知道了,等我知道了再告诉你们,哈哈:,此时KKT条件就派上用场了,如果在拉朗的基础上再加上KKT条件,就又可以得到最优解了,这也是svm的核心思想吧,具体数学表达如下所示:
m i n : f ( x ) min:f(x) min:f(x)
s . t . h j ( x ) = 0 , j = 1 , 2... p s.t. h_{j}(x)=0,j=1,2...p s.t.hj(x)=0,j=1,2...p
g k ( x ) ⩽ 0 , k = 1 , 2... q g_{k}(x)\leqslant 0, k=1,2...q gk(x)0,k=1,2...q
对上述进行拉朗操作转为无约束条件的优化问题,如下:
L ( x , λ , β ) = f ( x ) + ∑ j = 1 p λ j h j ( x ) + ∑ k = 1 q β k g k ( x ) L(x,\lambda, \beta)=f(x)+\sum_{j=1}^{p}\lambda_{j}h_{j}(x)+\sum_{k=1}^{q}\beta_kg_k(x) L(x,λ,β)=f(x)+j=1pλjhj(x)+k=1qβkgk(x)
此时,为了上述目标函数进行拉朗后能求得最优解,需要满足如下条件(KKT):
1. L ( a , b , x ) 对 x 求导为 0 1. L(a,b,x)对x求导为0 1.L(a,b,x)x求导为0
$2.h_{j}(x)=0 $
3. β k g k ( x ) = 0 3.\beta_k g_k(x)=0 3.βkgk(x)=0
$4.\beta_k \geqslant 0 $
对于上述的KKT,各人感觉最有趣的地方在于第三项,因为 g k ( x ) ⩽ 0 g_k(x)\leqslant 0 gk(x)0,但是又有上述的3条件,那就是说要不 g k ( x ) = 0 g_k(x)=0 gk(x)=0,要不 β k = 0 \beta_k=0 βk=0,这也就是SVM的核心地方吧,如果 β k = 0 \beta_k=0 βk=0表明训练样本对目标函数没有影响,如果 g k ( x ) = 0 g_k(x)=0 gk(x)=0,则此时的样本处在最大间隔边界,因此,决定svm算法的是边界附近的样本。

  • 核函数: 当数据在平面内不能进行划分时,可以通过将数据映射到更高的可分维度空间,而且通过核函数可以

2.2 原理推导

  硬间隔平面的SVM算法: 假设存在超平面(w,b)可以使得所以训练样本正确分类,将平面结果通过sign函数进行转换,则有存在如下等式:

w T x i + b ⩾ + 1 , y i = + 1 w^Tx_{i}+b \geqslant +1, y_i = +1 wTxi+b+1,yi=+1
w T x i + b ⩽ − 1 , y i = − 1 w^Tx_i+b\leqslant-1,y_i=-1 wTxi+b1,yi=1

  • 选取上面两个平面到平面 w T x + b = 0 w^Tx+b=0 wTx+b=0的距离之和为:

r = 2 ∣ ∣ w ∣ ∣ r=\frac{2}{||w||} r=∣∣w∣∣2

  • 因此上面的问题可以转化为如下数学公式:

$\underset{w,b}{max}\frac{2}{||w||} $
s . t : y i ( w T x i + b ) ⩾ 1 , i = 1 , 2... s.t: y_i(w^Tx_i+b)\geqslant 1, i=1,2... s.t:yi(wTxi+b)1,i=1,2...

  • 为了求解方便将最大值转为求最小值:

m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 \underset{w,b}{min}\frac{1}{2} ||w||^2 w,bmin21∣∣w2
s . t : y i ( w T x i + b ) ⩾ 1 , i = 1 , 2... s.t: y_i(w^Tx_i+b)\geqslant 1, i=1,2... s.t:yi(wTxi+b)1,i=1,2...

  • 上式为一个凸的二次规划问题,有很多种方法进行求解,下面介绍svm官方的求解过程,拉格朗日乘子法,由于是不等式的约束优化问题,为了求得最优解,需要满足KKT条件:

$L(w,b,\alpha)=\frac{1}{2}||w||2+\sum_{i=1}{m}\alpha_i(1-y_i(w^Tx_i+b)) $
KKT条件( f ( x i ) = w T x i + b ) f(x_i)=w^Tx_i+b) f(xi)=wTxi+b)
α i ⩾ 0 \alpha_i \geqslant0 αi0
y i f ( x i ) − 1 ⩾ 0 y_if(x_i)-1\geqslant0 yif(xi)10
α i ( y i f ( x i ) − 1 ) = 0 \alpha_i(y_if(x_i)-1) =0 αi(yif(xi)1)=0
其中 α = ( α i , α 2 ; . . . . . α m ) \alpha=(\alpha_i,\alpha_2;.....\alpha_m) α=(αi,α2;.....αm), 令 L ( w , b , α ) L(w,b,\alpha) L(w,b,α)对w,b进行求导为零可得:
$w = \sum_{i=1}^{m}\alpha_iy_ix_i $
$0=\sum_{i=1}^{m} \alpha_iy_i $

  • 将上式的结果加入到拉格朗日乘子公式中,则:

L ( α ) = 1 2 ∣ w ∣ T ∣ w ∣ + ∑ i = 1 m α i − ∑ i = 1 m α i y i ( ∑ j = 1 m α j y j x j T ) x i L(\alpha)=\frac{1}{2}|w|^T|w| + \sum_{i=1}^{m}\alpha_i-\sum_{i=1}^{m}\alpha_iy_i(\sum_{j=1}^{m}\alpha_jy_jx_j^T)x_i L(α)=21wTw+i=1mαii=1mαiyi(j=1mαjyjxjT)xi
L ( α ) = ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α i y i y j x i T x j L(\alpha)=\sum_{i=1}^{m}\alpha_i-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_iy_iy_jx_i^Tx_j L(α)=i=1mαi21i=1mj=1mαiαiyiyjxiTxj

  • 因此上式的公式中只要求出参数 α \alpha α就可以求出参数 w w w,再通过函数 f ( x ) = w T x + b f(x)=w^Tx+b f(x)=wTx+b就可以求出b
  • 软间隔SVM算法: 对于上述的软间隔svm算法,在现实任务中样本空间和特征空间如果不是线性可分的,此时很难找到一个核函数将样本进行维度的变化,即使找到了这样一个核函数也很难断定是不是由于过拟合而导致的,解决这个问题的方法就是引入软间隔平面,大致的思想就是允许一定的样本不满足约束条件,这样就能更好的进行样本划分,具体的表达式如下所示:

m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 + c ∑ i = 1 m l 0 / 1 ( y i ( x T x i + b ) − 1 ) , 其中 l 0 / 1 ( z ) 为 0 / 1 损失函数 , 当 z 小于 0 时为 1 ,否则为 0 (这样就可以代表某些样本不满足条件) \underset{w,b}{min}\frac{1}{2} ||w||^2 + c\sum_{i=1}^{m}l_{0/1}(y_i(x^Tx_i+b)-1), 其中l_{0/1}(z)为0/1损失函数,当z小于0时为1,否则为0(这样就可以代表某些样本不满足条件) w,bmin21∣∣w2+ci=1ml0/1(yi(xTxi+b)1),其中l0/1(z)0/1损失函数,z小于0时为1,否则为0(这样就可以代表某些样本不满足条件)

  • 由于上述得损失函数为不可凸时,通过需要通过一个替代的函数并且这个替代函数需要于其具有相同的上界,此时就可以通过求解这个相同上界且为凸的替代函数进行求解,常用的 l 0 / 1 l_{0/1} l0/1替代函数如下:

h i n g e 损失: l h i n g e ( z ) = m a x ( 0 , 1 − z ) hinge损失:l_{hinge}(z)=max(0,1-z) hinge损失:lhinge(z)=max(0,1z)
指数损失: l e x p ( z ) = e x p ( − z ) 指数损失:l_{exp}(z)=exp(-z) 指数损失:lexp(z)=exp(z)
对数损失: l l o g ( z ) = l o g ( 1 + e x p ( − z ) ) 对数损失:l_{log}(z) = log(1+exp(-z)) 对数损失:llog(z)=log(1+exp(z))

  • 对上述的表达式,如果采用hinge损失,则可以改写为:

m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 + c ∑ i = 1 m m a x ( 0 , 1 − y i ( w T x i + b ) ) \underset{w,b}{min}\frac{1}{2} ||w||^2 + c\sum_{i=1}^{m}max(0, 1-y_i(w^Tx_i+b)) w,bmin21∣∣w2+ci=1mmax(0,1yi(wTxi+b))

  • 对于上述公式引入松弛的概念 e i ⩾ 0 e_i \geqslant0 ei0,则可以改写为:

m i n w , b 1 2 ∣ ∣ w ∣ ∣ 2 + c ∑ i = 1 m e i \underset{w,b}{min}\frac{1}{2} ||w||^2 + c\sum_{i=1}^{m}e_i w,bmin21∣∣w2+ci=1mei
s . t : y i ( w T x i + b ) ⩾ 1 − e i s.t: y_i(w^Tx_i+b)\geqslant 1-e_i s.t:yi(wTxi+b)1ei
s . t : e i ⩾ 0 , i = 1 , 2 , 3 , . . . . m s.t: e_i \geqslant 0, i = 1,2,3,....m s.t:ei0,i=1,2,3,....m

  • 和硬间隔同样的求解方法,对其进行拉朗变换,则:

$L(w,b,\alpha, e, u)=\frac{1}{2}||w||^2+ c\sum_{i=1}{m}e_i+\sum_{i=1}{m}\alpha_i(1-e_i-y_i(wTx_i+b))-\sum_{i=1}{m}u_ie_i $
其中 a i ⩾ 0 , u i ⩾ 0 是拉格朗日乘子: a_i \geqslant 0 , u_i \geqslant 0是拉格朗日乘子: ai0,ui0是拉格朗日乘子:

  • 对上述公式中的各个参数进行求导并并其为0可得:

L ( α ) = ∑ i = 1 m α i − 1 2 ∑ i = 1 m ∑ j = 1 m α i α i y i y j x i T x j L(\alpha)=\sum_{i=1}^{m}\alpha_i-\frac{1}{2}\sum_{i=1}^{m}\sum_{j=1}^{m}\alpha_i\alpha_iy_iy_jx_i^Tx_j L(α)=i=1mαi21i=1mj=1mαiαiyiyjxiTxj
s . t : ∑ i = 1 m a i y i = 0 , s.t: \sum_{i=1}^{m}a_iy_i=0, s.t:i=1maiyi=0,
s . t : 0 ⩽ a i ⩽ c , i = 1 , 2 , 3 , . . . m s.t: 0 \leqslant a_i \leqslant c, i = 1,2,3,...m s.t:0aic,i=1,2,3,...m

  • 同样,软间隔的kkt条件如下:

$\alpha_i \geqslant0, u_i \geqslant 0 $
y i f ( x i ) − 1 + e i ⩾ 0 y_if(x_i)-1 + e_i\geqslant0 yif(xi)1+ei0
α i ( y i f ( x i ) − 1 + e i ) = 0 \alpha_i(y_if(x_i)-1+e_i) =0 αi(yif(xi)1+ei)=0
$e_i \geqslant 0, u_ie_i = 0 $

  • 对于上述的KKT条件,对于任意的样本 ( x i , y i ) (x_i, y_i) (xi,yi),总有 a i = 0 或者 y i f ( x i ) = 1 − e i a_i=0或者y_if(x_i)=1-e_i ai=0或者yif(xi)=1ei,如果 a i = 0 , 则该样本不会对 f ( x ) 有任何的影响,如果 a i > 0 ,则必有 y i f ( x i ) = 1 − e i a_i=0,则该样本不会对f(x)有任何的影响,如果a_i > 0 ,则必有y_if(x_i)=1-e_i ai=0,则该样本不会对f(x)有任何的影响,如果ai>0,则必有yif(xi)=1ei,则此时该样本恰在最大间隔边界上为支持向量,
  • 因此,可以得出采用hinge损失函数保持了其稀疏性
  • 对于上述的 L ( α ) L(\alpha) L(α)函数的求解方法,采用的是smo算法,其基本的思想就是先挑选两个变量 α 1 , α 2 \alpha_1, \alpha_2 α1,α2然后再固定其它的变量 α i \alpha_i αi,上述就变成了一个两个变量的二次规划问题,对于这个问题的求解就比较容易了,具体的在不断的更新 α i , b i \alpha_i,b_i αi,bi就可以求出最优的参数

🔍 3. 代码实践

3.1 svm分类

  我们通过莺尾花的监督分类数据集来实践svm分类,具体的代码如下所示:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载iris数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建SVM分类器实例
svm_clf = SVC(kernel='linear')  # 可以选择不同的核函数,如'rbf', 'poly'

# 训练模型
svm_clf.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = svm_clf.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"准确率: {accuracy:.2f}")

  然后,我们使用str.split方法将’c’列中的字符串按逗号分割,并设置expand=True来将分割后的列表转换为单独的列:

df = df.str.split(',', expand=True)
    0    1    2
0   a     b    c
1   b     c  NaN
2   d     e  NaN
# 接着,我们使用stack方法将列转换为行,创建一个层次化索引:
df = df.stack()
a  b
1  2  a    0
   2  b    1
   3  c    2
2  3  b    0
3  4  d    0
   4  e    1
dtype: object

3.2 svm回归

  svm算法除了能够做分类算法之外,还可以用来做回归算法,具体的代码如下所示:

from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.svm import SVR
from sklearn.metrics import mean_squared_error, r2_score

# 生成模拟回归数据
X, y = make_regression(n_samples=100, n_features=1, noise=0.4, random_state=42)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建SVR回归模型实例
svr_model = SVR(kernel='rbf')  # 可以选择不同的核函数,如'linear', 'poly', 'sigmoid'

# 训练模型
svr_model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = svr_model.predict(X_test)

# 计算MSE和R²
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print(f"均方误差(MSE): {mse:.2f}")
print(f"R²分数: {r2:.2f}")

🔍 4. 注意事项

  • SVM是分类、回归算法,在小数据集上,效果相对较好;
  • SVM分类算法的思想是在空间中找到一个超平面 ( w T x + b = 0 ) (w^Tx+b=0) (wTx+b=0)能够将各类数据进行类别划分,而这个超平面由法向量参数 w = ( w 1 , w 2 , w 3 . . . . . . ; w d ) w=(w_{1},w_{2}, w_{3}......;w_{d}) w=(w1,w2,w3......;wd)和位移项b决定;
  • 个人理解:为了得到最优参数w,b,SVM算法将超平面弱化为寻找与其平行的两个超平面的最大距离,也可以理解为与其平行的两个超平面各自到超平面 ( w T x + b = 0 ) (w^Tx+b=0) (wTx+b=0)的距离之和r,而两个平行平面之间的距离可以通过点到平面的距离间接的得出,因此,可以得出最大距离r时的参数w,b为最优参数;
  • 当数据集在某个维度空间中线性不可分时,可以通过核函数映射到更高能进行划分的维度进行线性划分;
  • 对于svm个人感觉其实和逻辑回归很像,都是将平面 ( w T x + b ) (w^Tx+b) (wTx+b)的结果通过某个函数进行输出,逻辑回归是通过sigmod函数来输出概率得到分类结果,而svm是通过sign函数输出分类结果;
  • svm的间隔平面有硬间隔和软间隔两种形态,表示的意义是否能允许对样本进行错误的分类;
  • 核参数的选择方法:当训练样本核数据比较多时,各个核的模型结果差距不大,当情况1:当训练集不大,feature比较多的时候,用线性的核。因为多feature的情况下就已经可以给线性的核提供不错的variance去fit训练集。情况2:当训练集相对可观,而feature比较少,用非线性的核。因为需要算法提供更多的variance去fit训练集。情况3:feature少,训练集非常大,用线性的核。因为非线性的核需要的计算量太大了。而庞大的训练集,本身就可以给非线性的核提供很好的分类效果;
  • svm中的松弛因子 ξ i \xi_i ξi是允许分类器存在一定的错误分类,但是最大化了间隔平面
  • svm中惩罚因子C表示你对离群值的重视程度,如果C越大表示越不想丢弃,因此,当样本不平衡是可以调节该系数来处理样本不平衡问题;

🔍 5. 总结

  SVM是一种强大的分类和回归算法,它通过最大化决策边界的宽度来提高模型的泛化能力。scikit-learn提供了易于使用的SVM实现,支持多种核函数。通过本博客的代码示例,我们学习了如何创建SVM模型,进行训练、预测和评估。希望这篇博客能够帮助你更好地理解SVM模型,并将其应用于实际的机器学习问题中。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【运维】如何在Ubuntu中设置一个内存守护进程来确保内存不会溢出

文章目录 前言增加守护进程1. 编写监控脚本2. 创建 systemd 服务文件3. 启动并启用服务4. 验证服务是否运行注意事项 如何修改守护进程1. 修改监控脚本2. 重新加载并重启服务3. 验证服务是否运行总结 如何设置一个日志文件来查看信息1. 修改监控脚本以记录日志方法一&#xff1…

antd DatePicker日期选择框限制最多选择一年

实现效果 实现逻辑 import React, { useState } from react;const ParentComponent () > {const [dates, setDates] useState(null);const disabledDate (current) > {if (!dates) {return false;}const tooLate dates[0] && current.diff(dates[0], days) &…

危险!属性拷贝工具的坑!

1. 背景​ 之前在专栏中讲过“不推荐使用属性拷贝工具”,推荐直接定义转换类和方法使用 IDEA 插件自动填充 get / set 函数。 不推荐的主要理由是: 有些属性拷贝工具性能有点差有些属性拷贝工具有“BUG”使用属性拷贝工具容易存在一些隐患&#xff08…

【你也能从零基础学会网站开发】(了解)关系型数据库的基本架构体系结构与概念理解

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 关系型数据库的…

安装 Docker 环境(通过云平台创建一个实例实现)

目录 1. 删除原有 yum 2. 手动配置 yum 源 3. 删除防火墙规则 4. 保存防火墙配置 5. 修改系统内核。打开内核转发功能。 6. 安装 Docker 7. 设置本地镜像仓库 8.重启服务 1. 删除原有 yum rm -rfv /etc/yum.repos.d/* 2. 手动配置 yum 源 使用 centos7-1511.iso 和 Xi…

Bunny的PT+SFT训练

GitHub - BAAI-DCAI/Bunny: A family of lightweight multimodal models.A family of lightweight multimodal models. . Contribute to BAAI-DCAI/Bunny development by creating an account on GitHub.https://github.com/BAAI-DCAI/Bunny1.环境安装 conda create -n bunny …

HEC-HMS水文模型教程

原文链接:HEC-HMS水文模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247607904&idx5&sn1a210328a3fc8f941b433674d8fe2c85&chksmfa826787cdf5ee91d01b6981ebd89deac3e350d747d0fec45ce2ef75d7cb8009341c6f55114d&token90645021…

桥感应加热主电路拓扑结构及控制原

1 桥感应加热主电路拓扑结构及控制原理 1.1 主电路拓扑 本文所述中频感应加热电源采用交—直—交的变频原理,三相50Hz的正弦交流输入电压经过整流滤波为540V平滑直流电压,再经逆变器将直流电压变成不同频率的交流电压供负载使用。本文采用半桥串联谐振…

PDF 生成(5)— 内容页支持由多页面组成

当学习成为了习惯,知识也就变成了常识。 感谢各位的 关注、点赞、收藏和评论。 新视频和文章会第一时间在微信公众号发送,欢迎关注:李永宁lyn 文章已收录到 github 仓库 liyongning/blog,欢迎 Watch 和 Star。 回顾 在本篇开始…

【echarts】如何关闭dataZoom-silder 组件中数据阴影(缩略图、数据走势图)

echarts开启 “滑动条型数据区域缩放组件(dataZoomInside)”后,默认会显示数据的走势图。 但有时候我们并不需要。 如何关闭呢? 官方有提供一个属性:showDataShadow https://echarts.apache.org/zh/option.html#da…

C++初学者指南-2.输入和输出---从输入流错误中恢复

C初学者指南-2.输入和输出—从输入流错误中恢复 文章目录 C初学者指南-2.输入和输出---从输入流错误中恢复怎么了&#xff1f;解决方案&#xff1a;出错后重置输入流 怎么了&#xff1f; 示例&#xff1a;连续输入 int main () {cout << "i? ";int i 0;cin…

vue项目创建+eslint+Prettier+git提交规范(commitizen+hooks+husk)

# 步骤 1、使用 vue-cli 创建项目 这一小节我们需要创建一个 vue3 的项目&#xff0c;而创建项目的方式依然是通过 vue-cli 进行创建。 不过这里有一点大家需要注意&#xff0c;因为我们需要使用最新的模板&#xff0c;所以请保证你的 vue-cli 的版本在 4.5.13 以上&#xff…

基于X86+FPGA+AI的芯片缺陷检测方案

应用场景 随着半导体技术的发展&#xff0c;对芯片的良率要求越来越高。然而集成电路芯片制造工艺复杂&#xff0c;其制造过程中往往产生很多缺陷&#xff0c;因此缺陷检测是集成电路制造过程中的必备工艺。 客户需求 小体积&#xff0c;低功耗 2 x USB,1 x LAN Core-i平台无…

YOLOv8 目标检测程序,依赖的库最少,使用onnxruntime推理

YOLOv8 目标检测程序&#xff0c;依赖的库最少&#xff0c;使用onnxruntime推理 flyfish 为了方便理解&#xff0c;加入了注释 """ YOLOv8 目标检测程序 Author: flyfish Date: Description: 该程序使用ONNX运行时进行YOLOv8模型的目标检测。它对输入图像进行…

AQS同步队列、条件队列源码解析

AQS详解 前言AQS几个重要的内部属性字段内部类 Node同步队列 | 阻塞队列等待队列 | 条件队列 重要方法执行链同步队列的获取、阻塞、唤醒加锁代码流程解锁 条件队列的获取、阻塞、唤醒大体流程 调用await()方法1. 将节点加入到条件队列2. 完全释放独占锁3. 等待进入阻塞队列4. …

【刷题汇总--数字统计、两个数组的交集、点击消除(栈)】

C日常刷题积累 今日刷题汇总 - day0011、数字统计1.1、题目1.2、思路1.3、程序实现 2、两个数组的交集2.1、题目2.2、思路2.3、程序实现 3、点击消除(栈)3.1、题目3.2、思路3.3、程序实现 今日刷题汇总 - day001 1、数字统计 1.1、题目 请统计某个给定范围[L, R]的所有整数中…

reactjs18 中使用@reduxjs/toolkit同步异步数据的使用

react18 中使用reduxjs/toolkit 1.安装依赖包 yarn add reduxjs/toolkit react-redux2.创建 store 根目录下面创建 store 文件夹&#xff0c;然后创建 index.js 文件。 import { configureStore } from "reduxjs/toolkit"; import { counterReducer } from "…

【机器学习】语音转文字 - FunASR 的应用与实践(speech to text)

本文将介绍 FunASR&#xff0c;一个多功能语音识别模型&#xff0c;包括其特点、使用方法以及在实际应用中的表现。我们将通过一个简单的示例来展示如何使用 FunASR 将语音转换为文字&#xff0c;并探讨其在语音识别领域的应用前景。 一、引言 随着人工智能技术的不断发展&am…

达梦数据库系列—19. 动态增加实时备库

目录 动态增加实时备库 1、数据准备 2 、配置新备库 2.1配置 dm.ini 2.2配置 dmmal.ini 2.3 配置 dmarch.ini 2.4 配置 dmwatcher.ini 2.5 启动备库 2.6 设置 OGUID 2.7 修改数据库模式 3、 动态添加 MAL 配置 4、 动态添加归档配置 5、 修改监视器 dmmonitor.ini…

软考初级网络管理员__网站单选题

1.以下关于服务器端脚本的说法中&#xff0c;正确的是()。 Script 编写 只能采用VBScript 编写 浏览器不能解释执行 由服务器发送到客户端&#xff0c;客户端负责运行 2.站点首页最常用的文件名是()。 index.html homepage.html resource.html mainfrm.html 3.在HTML…