最优化方法Python计算:有约束优化应用——近似线性可分问题支持向量机
二分问题的数据集 { ( x i , y i ) } \{(\boldsymbol{x}_i,y_i)\} {(xi,yi)}, i = 1 , 2 , ⋯ , m i=1,2,\cdots,m i=1,2,⋯,m中,特征数据 { x i } \{\boldsymbol{x}_i\} {xi}未必能被一块超平面按其标签值 y i ∈ { − 1 , 1 } y_i\in\{-1,1\} yi∈{−1,1}分隔,即二分问题未必是线性可分的。如果存在超平面 π \pi π: ( x ⊤ , 1 ) w 0 = 0 (\boldsymbol{x}^\top,1)\boldsymbol{w}_0=0 (x⊤,1)w0=0,使得大多数样本点的特征数据被 π \pi π按标签数据取值分隔,满足约束 y i ( x i , 1 ) w 0 ≥ 1 y_i(\boldsymbol{x}_i,1)\boldsymbol{w}_0\geq1 yi(xi,1)w0≥1,但有少数样本点特征数据不满足此约束而交叉纠结,如下图所示。这样的问题,称为近似线性可分问题。图中的超平面 ( x ⊤ , 1 ) w 0 = ± 1 (\boldsymbol{x}^\top,1)\boldsymbol{w}_0=\pm1 (x⊤,1)w0=±1称为软边界。
解决近似线性可分问题的支持向量机模型引入松弛变量 z = ( z 1 z 2 ⋮ z m ) \boldsymbol{z}=\begin{pmatrix}z_1\\z_2\\\vdots\\z_m\end{pmatrix} z= z1z2⋮zm ,构造优化问题
{ min 1 2 w ⊤ H w + c ⊤ z s.t. y i ( x i , 1 ) w ≥ 1 − z i z i ≥ 0 i = 1 , 2 , ⋯ m . ( 1 ) \begin{cases} \min\quad \frac{1}{2}\boldsymbol{w}^\top\boldsymbol{Hw}+\boldsymbol{c}^\top\boldsymbol{z}\\ \text{s.t.\ }\quad y_i(\boldsymbol{x}_i,1)\boldsymbol{w}\geq1-z_i\\ \quad\quad\ \ z_i\geq0 \end{cases}\quad i=1,2,\cdots m.\quad(1) ⎩ ⎨ ⎧min21w⊤Hw+c⊤zs.t. yi(xi,1)w≥1−zi zi≥0i=1,2,⋯m.(1)
其中, H = ( 1 0 ⋯ 0 0 0 1 ⋯ 0 0 ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 ⋯ 1 0 0 0 ⋯ 0 0 ) \boldsymbol{H}=\begin{pmatrix}1&0&\cdots&0&0\\0&1&\cdots&0&0\\\vdots&\vdots&\ddots&\vdots&\vdots\\0&0&\cdots&1&0\\0&0&\cdots&0&0\end{pmatrix} H= 10⋮0001⋮00⋯⋯⋱⋯⋯00⋮1000⋮00 , c = ( C C ⋮ C ) \boldsymbol{c}=\begin{pmatrix}C\\C\\\vdots\\C\end{pmatrix} c= CC⋮C ,正则化参数 C > 0 C>0 C>0为松弛变量的罚因子。其值越大,模型对误分类的惩罚越强;反之,模型将侧重于分类间隔。当C足够大时,上述问题退化为问题。
{ min 1 2 w ⊤ H w s.t. y i ( x i ⊤ , 1 ) w ≥ 1 i = 1 , 2 , ⋯ , m . \begin{cases} \min\quad\frac{1}{2}\boldsymbol{w}^\top\boldsymbol{Hw}\\ \text{s.t.}\quad\quad y_i(\boldsymbol{x}_i^\top,1)\boldsymbol{w}\geq1\quad i=1,2,\cdots,m. \end{cases} {min21w⊤Hws.t.yi(xi⊤,1)w≥1i=1,2,⋯,m.
根据强对偶定理,可以证明二次规划问题(1)的最优解 w 0 \boldsymbol{w}_0 w0与其对偶问题
{ min 1 2 μ ⊤ Q μ − μ ⊤ 1 s.t. μ ⊤ y = 0 o ≤ μ ≤ c . ( 2 ) \begin{cases} \min\quad\frac{1}{2}\boldsymbol{\mu}^\top\boldsymbol{Q\mu}-\boldsymbol{\mu}^\top\boldsymbol{1}\\ \text{s.t.\ \ }\quad\boldsymbol{\mu}^\top\boldsymbol{y}=0\\ \quad\quad\ \ \ \boldsymbol{o}\leq\boldsymbol{\mu}\leq\boldsymbol{c} \end{cases}.\quad{(2)} ⎩ ⎨ ⎧min21μ⊤Qμ−μ⊤1s.t. μ⊤y=0 o≤μ≤c.(2)
的最优解 μ 0 \boldsymbol{\mu}_0 μ0等价。其中, Q = X ⊤ X \boldsymbol{Q}=\boldsymbol{X}^\top\boldsymbol{X} Q=X⊤X, X = ( y 1 x 1 , y 2 x 2 , ⋯ , y m x m ) \boldsymbol{X}=(y_1\boldsymbol{x}_1,y_2\boldsymbol{x}_2,\cdots,y_m\boldsymbol{x}_m) X=(y1x1,y2x2,⋯,ymxm), μ ∈ R m \boldsymbol{\mu}\in\text{R}^m μ∈Rm。等价的意义为
w 0 = ( ∑ i ∈ s μ 0 i y i x i 1 m s ∑ j ∈ s ( y j − ∑ i ∈ s μ 0 i y i x j ⊤ x i ) ) . \boldsymbol{w}_0=\begin{pmatrix}\sum\limits_{i\in s}\mu_{0_i}y_i\boldsymbol{x}_i\\\frac{1}{m_s}\sum\limits_{j\in s}\left(y_j-\sum\limits_{i\in s}\mu_{0_i}y_i\boldsymbol{x}_j^\top\boldsymbol{x}_i\right)\end{pmatrix}. w0= i∈s∑μ0iyixims1j∈s∑(yj−i∈s∑μ0iyixj⊤xi) .
其中,
s = { i ∣ 0 ≤ i ≤ m , 0 < μ 0 i < C } s=\{i|0\leq i\leq m, 0<\mu_{0_i}<C\} s={i∣0≤i≤m,0<μ0i<C}
为支持向量下标集, m s m_s ms为 s s s支持向量个数。
下列代码实现通过求解二次规划问题(2)的近似线性可分问题支持向量机模型。
import numpy as np
from scipy.optimize import minimize
class ALineSvc(Classification, LineModel): #近似线性可分支持向量机分类器def __init__(self, C = 1e+4): #构造函数self.C = Cself.tagVal = np.signdef obj(self, mu): #目标函数return 0.5 * (mu @ (self.Q @ mu)) - mu.sum()def ynormalize(self, y, trained): #标签数据预处理if not trained:self.ymin = 0self.ymax = 1return (y - self.ymin) / (self.ymax - self.ymin)def fit(self, X, Y, mu = None): #训练函数print("训练中...,稍候")m, n = X.shapeself.scalar = (len(X.shape) == 1)self.X, self.Y = self.pretreat(X, Y)if not isinstance(mu, np.ndarray):if mu == None:mu = np.random.random(m)else:mu = np.array([mu] * m)Qk = np.array([[self.X[i] @ self.X[j] #内积矩阵for j in range(m)]for i in range(m)])self.Q=np.outer(self.Y, self.Y) * Qk #系数矩阵h = lambda x: self.Y @ x #等式约束条件函数g1 = lambda x: x #不等式约束函数1g2 = lambda x: self.C - x #不等式约束函数2cons = [{'type': 'eq', 'fun': h}, #约束条件列表{'type': 'ineq', 'fun': g1},{'type': 'ineq', 'fun': g2}]res = minimize(self.obj, mu, constraints = cons) #求解最优化问题self.mu0 = res.xself.support_ = np.where((self.mu0 > 1e-5) & #支持向量下标(self.mu0 < self.C))[0]self.w0 = (self.mu0[self.support_] * self.Y[self.support_]) @\self.X[self.support_,0:n] #模型参数前n项b0 = (self.Y[self.support_]-(self.mu0[self.support_] * self.Y[self.support_])\@ Qk[np.ix_(self.support_, self.support_)]).mean() #模型参数最末项self.w0 = np.append(self.w0, b0) #整合模型参数self.coef_, self.intercept_ = self.coef_inte() #计算超平面系数和截距print("%d次迭代后完成训练。"%res.nit)
程序中第3~44行定义的近似线性可分支持向量机分类器类ALineSvc继承了Classification(见博文《最优化方法Python计算:无约束优化应用——线性回归分类器》)和LineModel(见博文《最优化方法Python计算:无约束优化应用——线性回归模型》)的属性与方法。类定义体中
- 第4~6行定义构造函数,设置松弛变量上限C的默认值为 1 0 4 10^4 104。第6行将标签值函数tagVal设置为Numpy的sign函数,以适于计算分类预测值。
- 第7~8行定义问题(2)的目标函数obj,返回值为 1 2 μ ⊤ Q μ − μ ⊤ 1 \frac{1}{2}\boldsymbol{\mu}^\top\boldsymbol{Q}\boldsymbol{\mu}-\boldsymbol{\mu}^\top\boldsymbol{1} 21μ⊤Qμ−μ⊤1。
- 第9~11行重载标签数据归一化函数ynormalize。由于近似线性可分支持向量机模型中的标签数据不需要归一化,所以在训练时将self.ymin和self.ymax设置为0和1。第12行返回归一化后的标签数据。做了这样的调整,我们在进行预测操作时,按式
y = y ⋅ ( max y − min y ) + min y y=y\cdot(\max y-\min y)+\min y y=y⋅(maxy−miny)+miny
仍保持 y y y的值不变,进而可保持LineModel的predict函数代码不变(见博文《最优化方法Python计算:无约束优化应用——线性回归分类器》)。 - 第14~44行重载训练函数fit。对比程序4.1中定义的父类fit函数可见第15~23行的代码是保持一致的。
- 第24~26行计算内积矩阵 Q k = ( x 1 ⊤ x 1 x 1 ⊤ x 2 ⋯ x 1 ⊤ x m x 2 ⊤ x 1 x 2 ⊤ x 2 ⋯ x 2 ⊤ x m ⋮ ⋮ ⋱ ⋮ x m ⊤ x 1 x m ⊤ x 2 ⋯ x m ⊤ x m ) \boldsymbol{Q}_k=\begin{pmatrix}\boldsymbol{x}_1^\top\boldsymbol{x}_1&\boldsymbol{x}_1^\top\boldsymbol{x}_2&\cdots&\boldsymbol{x}_1^\top\boldsymbol{x}_m\\ \boldsymbol{x}_2^\top\boldsymbol{x}_1&\boldsymbol{x}_2^\top\boldsymbol{x}_2&\cdots&\boldsymbol{x}_2^\top\boldsymbol{x}_m\\\vdots&\vdots&\ddots&\vdots\\\boldsymbol{x}_m^\top\boldsymbol{x}_1&\boldsymbol{x}_m^\top\boldsymbol{x}_2&\cdots&\boldsymbol{x}_m^\top\boldsymbol{x}_m\end{pmatrix} Qk= x1⊤x1x2⊤x1⋮xm⊤x1x1⊤x2x2⊤x2⋮xm⊤x2⋯⋯⋱⋯x1⊤xmx2⊤xm⋮xm⊤xm
第27行计算目标函数系数矩阵 Q = ( y 1 y 1 x 1 ⊤ x 1 y 1 y 2 x 1 ⊤ x 2 ⋯ y 1 y m x 1 ⊤ x m y 2 y 1 x 2 ⊤ x 1 y 2 y 2 x 2 ⊤ x 2 ⋯ y 2 y m x 2 ⊤ x m ⋮ ⋮ ⋱ ⋮ y m y 1 x m ⊤ x 1 y m y 2 x m ⊤ x 2 ⋯ y m y m x m ⊤ x m ) . \boldsymbol{Q}=\begin{pmatrix}y_1y_1\boldsymbol{x}_1^\top\boldsymbol{x}_1&y_1y_2\boldsymbol{x}_1^\top\boldsymbol{x}_2&\cdots&y_1y_m\boldsymbol{x}_1^\top\boldsymbol{x}_m\\ y_2y_1\boldsymbol{x}_2^\top\boldsymbol{x}_1&y_2y_2\boldsymbol{x}_2^\top\boldsymbol{x}_2&\cdots&y_2y_m\boldsymbol{x}_2^\top\boldsymbol{x}_m\\ \vdots&\vdots&\ddots&\vdots\\ y_my_1\boldsymbol{x}_m^\top\boldsymbol{x}_1&y_my_2\boldsymbol{x}_m^\top\boldsymbol{x}_2&\cdots&y_my_m\boldsymbol{x}_m^\top\boldsymbol{x}_m \end{pmatrix}. Q= y1y1x1⊤x1y2y1x2⊤x1⋮ymy1xm⊤x1y1y2x1⊤x2y2y2x2⊤x2⋮ymy2xm⊤x2⋯⋯⋱⋯y1ymx1⊤xmy2ymx2⊤xm⋮ymymxm⊤xm .
- 第28~30行定义等式约束条件函数h和不等式约束条件函数g1和g2。第31~33行构造约束条件列表cons。第34行调用minimize函数求解优化问题(2),返回值赋予res。第35行将res的x属性赋予mu0,为问题(2)的最优解 μ 0 \boldsymbol{\mu}_0 μ0。
- 第36~37行按条件
0 < μ 0 i < C , i = 1 , 2 , ⋯ , m 0<\mu_{0_i}<C, i=1, 2, \cdots, m 0<μ0i<C,i=1,2,⋯,m
查找支持向量的下标集 s s s并赋予属性support_。
- 第38~39行计算原问题(1)的最优解 w 0 \boldsymbol{w}_0 w0的前 n n n个元素 ∑ i ∈ s μ 0 i y i x i \sum\limits_{i\in s}\mu_{0_i}y_i\boldsymbol{x}_i i∈s∑μ0iyixi。第40~41行计算原问题(1)的最优解 w 0 \boldsymbol{w}_0 w0的最后一个元素 b 0 b_0 b0。第43行连接两部分构成 w 0 \boldsymbol{w}_0 w0赋予属性w0。
- 第44行调用父类的coef_inte函数(见博文《最优化方法Python计算:无约束优化应用——线性回归模型》)计算决策面的系数coef_与截距intercept_。
综合案例
井字棋是很多人儿时喜爱的游戏。方形棋盘被井字形的4条直线分成9个空格。两个玩家各执标有一符:或为“ × \times ×”,或为“ ∘ \circ ∘”的棋子,轮流在棋盘中放置一子。一方所执符号棋子占据棋盘中一直线(水平或竖直或对角)上的三个空格(见题图),即胜出。文件tic-tac-toe.csv(来自UC Irvine Machine Learning Repository)罗列了958例棋盘格局及其胜负判断
x | x | x | x | o | o | x | o | o | positive |
---|---|---|---|---|---|---|---|---|---|
x | x | x | x | o | o | o | x | o | positive |
⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ |
b | b | b | b | o | o | x | x | x | positive |
x | x | o | x | x | o | o | b | o | negative |
⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ | ⋯ \cdots ⋯ |
o | x | o | o | x | x | x | o | x | negative |
o | o | x | x | x | o | o | x | x | negative |
文件中,每一行表示一种棋盘格局及对该格局胜负方的判定。前9个数据表示按行优先排列的棋盘格局,第10个数据“positive”表示执“ × \times ×”者胜,“negative”表示执“ ∘ \circ ∘”者胜。例如,第一行中前9个数据“x x x x o o x o o”表示棋盘格局
由于执“ × \times ×”者占满了第1行和第1列,故判断执“ × \times ×”者胜出,即第10个数据为“positive”。注意,格局数据中“b”表示对应格子未置入任何棋子。例如,数据“b b b b o o x x x”表示棋盘格局
下列代码试图用文件中的70例数据训练一个ALineSvc支持向量机分类模型,用其余数据对其进行测试。
import numpy as np
data = np.loadtxt('tic-tac-toe.csv', #读取数据文件delimiter = ',', dtype = str)
X = np.array(data) #转换为数组
Y = X[:, 9] #读取标签数据
X = np.delete(X, [9], axis = 1) #去掉标签列
m, n=X.shape
print('共有%d个数据样本'%m)
for i in range(m):for j in range(n):if X[i, j] == 'x':X[i, j] = 1if X[i, j] == 'o':X[i, j] = -1if X[i, j] == 'b':X[i, j] = 0
X = X.astype(float)
Y = np.array([1 if y == 'positive' else #类别数值化-1 for y in Y]).astype(int)
a = np.arange(m) #数据项下标
m1=70 #训练集样本容量
np.random.seed(3489)
print('随机抽取%d个样本作为训练数据。'%(m1))
train = np.random.choice(a,m1,replace=False)
test = np.setdiff1d(a,train) #检测数据下标
tictactoe = ALineSvc(C = 10) #创建模型
tictactoe.fit(X[train], Y[train]) #训练模型
print('系数:', tictactoe.coef_)
print('截距:%.4f'%tictactoe.intercept_)
support = tictactoe.support_ #支持向量下标
print('支持向量:%s'%support)
acc=tictactoe.score(X[test], Y[test]) * 100
print('对其余%d个样本数据测试,正确率:%.2f'%(m - m1,acc) + '%')
程序的第2~6行从文件中读取数据并转换为数组X,并从中拆分出标签数据Y。由于表示格局的特征数据和表示胜负的标签数据都是字符型,应转换为数值类型。对特征数据,作映射:
x → 1 , o → − 1 , b → 0 \text{x}\rightarrow1, \text{o}\rightarrow-1,\text{b}\rightarrow0 x→1,o→−1,b→0
第9~16行的嵌套for循环完成9个格局数据按上述对应关系的类型转换。第18~19行将标签数据按映射
positive → 1 , negative → − 1 \text{positive}\rightarrow1, \text{negative}\rightarrow-1 positive→1,negative→−1
进行类型转换。第20~25行从958个棋盘格局数据中随机选取70(m1)个作为训练数据集X[train]、Y[train],其余888个作为训练数据集X[test]、Y[test]。第26行声明ALineSvc类对象tictactoe作为支持向量机分类模型,设置罚项系数C为10.0。第27行调用tictactoe的fit函数用X[train]、Y[train]对其进行训练。第32行调用tictactoe的score函数用X[test]、Y[test]对其进行测试。运行程序,输出
共有958个数据样本
随机抽取100个样本作为训练数据。
训练中...,稍候
15次迭代后完成训练。
系数: [2. 2. 2. 2. 2. 2. 2. 2. 2.]
截距:-19.0286
支持向量:[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 2324 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 4748 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69]
对其余888个样本数据测试,正确率:98.31%
意为用70个训练数据,经过15次迭代完成训练。对其余888个数据对训练所得模型测试,正确率为98.31%。训练给出了决策面
π : 2 x 1 + 2 x 2 + 2 x 3 + 2 x 4 + 2 x 5 + 2 x 6 + 2 x 7 + 2 x 8 + 2 x 9 − 19.03 = 0 \pi:2x_1+2x_2+2x_3+2x_4+2x_5+2x_6+ 2x_7+2x_8+2x_9-19.03=0 π:2x1+2x2+2x3+2x4+2x5+2x6+2x7+2x8+2x9−19.03=0
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!
相关文章:
最优化方法Python计算:有约束优化应用——近似线性可分问题支持向量机
二分问题的数据集 { ( x i , y i ) } \{(\boldsymbol{x}_i,y_i)\} {(xi,yi)}, i 1 , 2 , ⋯ , m i1,2,\cdots,m i1,2,⋯,m中,特征数据 { x i } \{\boldsymbol{x}_i\} {xi}未必能被一块超平面按其标签值 y i ∈ { − 1 , 1 } y_i\in\{-1,1\} yi∈…...
Excel中批量对多个结构相同的工作表执行操作,可以使用VBA宏来实现
【系列专栏】:博主结合工作实践输出的,解决实际问题的专栏,朋友们看过来! 《项目案例分享》 《极客DIY开源分享》 《嵌入式通用开发实战》 《C语言开发基础总结》 《从0到1学习嵌入式Linux开发》 《QT开发实战》 《Android开发实…...
Spring的Validation,这是一套基于注解的权限校验框架
为了保证数据的正确性、完整性,作为一名后端开发工程师,不能仅仅依靠前端来校验数据,还需要对接口请求的参数进行后端的校验。 controller 全局异常处理器 在项目中添加一个全局异常处理器,处理校验异常 RestControllerAdvice p…...
鸿蒙OSUniApp 开发的下拉刷新与上拉加载列表#三方框架 #Uniapp
使用 UniApp 开发的下拉刷新与上拉加载列表 前言 最近在做一个小程序项目时,发现列表的加载体验对用户至关重要。简单的一次性加载全部数据不仅会导致首屏加载缓慢,还可能造成内存占用过大。而分页加载虽然解决了这个问题,但如果没有良好的…...
VastBase的日常操作记录
---------需要命令启动数据库操作------------------- [vastbasedmz-neo4j01 ~]$ vb_ctl start [2025-05-13 09:41:54.515][10224][][vb_ctl]: vb_ctl started,数据目录是 /home/vastbase/data/vastbase [2025-05-13 09:41:54.728][10224][][vb_ctl]: 等待服务端进程启动 ... …...
企业级IP代理解决方案:负载均衡与API接口集成实践
在全球化业务扩张与数据驱动决策的背景下,企业级IP代理解决方案通过负载均衡技术与API接口集成,可有效应对高频请求、反爬机制及合规风险。以下是基于企业级场景的核心实践要点: 一、负载均衡与IP代理的深度协同 动态IP池的负载均衡策略 轮询…...
智能手表项目风险评估与应对计划书
📘 智能手表项目风险评估与应对计划书 项目名称:Aurora Watch S1 版本号:v1.0 编制人:XXX(项目经理) 日期:2025年xx月xx日 一、概述 本计划书旨在识别Aurora Watch S1智能手表项目全过程中可能…...
Java基础之静态代理和动态代理
一、静态代理 定义: 代理类与被代理类在编译期就已确定,代理类需要手动编写并实现与被代理类相同的接口 1.核心角色: Subject(抽象主题):定义业务方法的接口 RealSubject(真实主题ÿ…...
观成科技:加密C2框架Vshell流量分析
一、工具介绍 Vshell是一款功能全面的红队工具,其设计兼顾隐蔽性与灵活性,尤其适合模拟网络攻击和测试防御体系。该工具支持TCP、UDP、KCP、WebSocket、DNS、DOH、DOT等多种协议。内置隧道代理功能,支持正向和反向连接模式,可以适…...
麒麟环境下Selenium的使用
本文主要介绍了在内网环境下、服务主机无域名的情况下,为了抓取内网其他系统网页数据,安装使用Selenium的方,并详细介绍了离线安装python依赖包的方法。服务主机操作系统为麒麟V10 SP3。 一. 查看可以安装的浏览器安装包 1. 更新软件包索引 首先确保软件包列表是最新的:…...
Protocol Buffers 全流程通俗讲解
Protocol Buffers 全流程通俗讲解(从 0 到进阶) 目录 序列化到底为什么要选 Protobuf?核心原理:一眼看懂二进制编码10 分钟跑通「写 .proto → 生成代码 → 读写数据」.proto 文件 8 条黄金法则(小白友好版&…...
从故障到防护:抗晃电保护装置如何提升电网可靠性?
安科瑞刘鸿鹏 摘要 随着工业自动化水平的提升,生产设备对供电连续性和稳定性的依赖程度越来越高,电网中的电压暂降(俗称“晃电”)问题对工业生产构成了严重威胁。特别是在化工、冶金、半导体等高敏感行业,晃电引发的…...
Three.js知识框架
一、Three.js 基础概念 1. Three.js 简介 是什么? 基于 WebGL 的 3D JavaScript 库,用于在浏览器中渲染 3D 场景。 核心优势 简化 WebGL 的复杂 API,提供高层封装。 跨平台(支持桌面和移动端)。 适用场景 3D 可视…...
5.14本日总结
一、英语 背诵list30,复习list1 二、数学 完成30讲第13讲课后题,学习14讲部分内容 三、408 完成计网5.1,5.2题目 四、总结 在高数14讲内容学完之前写完13讲的所有题目,预计20号学完14讲内容,408的进度要加快,本…...
数据结构学习之链表学习:单链表
在之前顺序表的学习过程中,我们知道顺序表中头插和中插的复杂度是O(N)。那我们可不可以将其降低为O(1)呢?可不可以不增容想用就用想扔就扔而不会浪费一点空间呢?那就是我们今天的内容࿱…...
技术债务积累,如何进行有效管理
识别和评估技术债务、明确技术债务的优先级、制定系统的还债计划、持续监控与预防技术债务产生是有效管理技术债务积累的重要策略。其中尤其要注重识别和评估技术债务,只有准确识别技术债务的种类和严重程度,才能制定出高效且有针对性的解决方案…...
[20250514] 脑机接口行业调研报告(2024年最新版)
脑机接口行业调研报告(2024年最新版) 1. 调研报告 2. 相关企业...
【HTTPS基础概念与原理】SSL/TLS协议演进史:从SSLv3到TLS 1.3
以下是 SSL/TLS协议演进史 的详细解析,从SSLv3到TLS 1.3,涵盖各版本的核心特点、重大漏洞及淘汰原因: 1. SSLv3(Secure Sockets Layer 3.0) • 发布时间:1996年(Netscape开发) • 核…...
JVM 与云原生的完美融合:引领技术潮流
最近佳作推荐: Java 大厂面试题 – 揭秘 JVM 底层原理:那些令人疯狂的技术真相(New) Java 大厂面试题 – JVM 性能优化终极指南:从入门到精通的技术盛宴(New) Java 大厂面试题 – JVM 深度剖析&…...
【进程控制二】进程替换和bash解释器
【进程控制二】进程替换 1.exec系列接口2.execl系列2.1execl接口2.2execlp接口2.3execle 3.execv系列3.1execv3.2总结 4.实现一个bash解释器4.1内建命令 通过fork创建的子进程,会继承父进程的代码和数据,因此本质上还是在执行父进程的代码 进程替换可以将…...
如何查看打开的 git bash 窗口是否是管理员权限打开
在 git bash 中输入: net session >nul 2>&1 && (echo Ok) || (echo Failed) 显示 OK 》是管理员权限; 显示 Failed 》不是管理员权限。 如何删除此步生成的垃圾文件: 新建一个 .txt 文件,输入以下代码…...
ubuntu 22.04 wifi网卡配置地址上网
通过network-manager配置 确定是否存在usb网卡的驱动 rootgpu-server:/etc/netplan# lsmod | grep rt2800usbrt2800usb 32768 0rt2x00usb 24576 1 rt2800usbrt2800lib 139264 1 rt2800usbrt2x00lib 73728 3 rt2800us…...
让 Cursor 教我写 MCP Client
文章目录 1. 写在最前面2. 动手实现一个 MCP Client2.1 How 天气查询 Client2.1.1 向 Cursor 提问的艺术2.1.2 最终成功展示2.1.3 client 的代码 3. MCP 协议核心之一总结3.1 SSE vs WebSocket 4. 碎碎念5. 参考资料 1. 写在最前面 学习了 MCP Server 的实现后,刚好…...
GoogleTest:GMock2 EXPECT_CALL
GoogleTest:GMock初识-CSDN博客 简单的介绍了GMock工作的方式 GMock其实是比较复杂的,先上一个例子,然后再仔细的解读: //not_ready_class.hpp #include <string>class Person { public:virtual ~Person() = default;virtual std::string name() = 0;virtual int a…...
自注意力机制(Self-Attention)前向传播手撕
题目 实现Transformer中自注意力机制的前向传播代码 思路与代码 自注意力机制(Self-Attention)是自然语言处理和深度学习中的一种核心机制,最早在 Transformer 模型中被提出。它的核心思想是:让序列中的每个元素都能动态关注整个…...
华硕服务器-品类介绍
目录 一、核心产品线解析 1. 机架式服务器 2. 塔式服务器 3. 高密度计算服务器 二、关键技术与模组配置 1. 主板与管理模块 2. 电源与散热 3. 存储与网络 三、应用场景与行业解决方案 1. 人工智能与高性能计算 2. 云计算与虚拟化 3. 边缘计算与工业物联网 一、核心…...
【Ansible基础】Ansible设计理念与无代理架构深度解析
目录 1 Ansible概述与核心设计理念 1.1 Ansible的核心设计哲学 1.2 Ansible与其他配置管理工具的对比 2 Ansible无代理架构详解 2.1 无代理架构工作原理 2.2 无代理架构的优势 2.3 无代理架构的局限性 3 Ansible核心组件与架构 3.1 Ansible核心组件架构 组件说明&…...
利用vba替换word中多个表格,相邻单元格的文字
目录 一、效果图1、替换前2、替换后 二、敲代码1、开发者工具→vba编辑器,点击插入模块2、键入以下代码3、代码编辑完成后,开发者工具→运行宏,选择对应名称,运行 一、效果图 标题估计没说明白,上图 1、替换前 2、替…...
动态多因子策略
策略其核心思想是通过多种技术指标的结合,动态调整交易信号,以实现更精准的市场进出和风险管理。 交易逻辑思路 1. 初始化与数据更新: - 在每个Bar的开盘时,更新当日的最高价、最低价和收盘价。 - 计算短期和长期的移动平均线&…...
STC32G12K128实战:串口通信
STC32G12K128芯片写一个按键通过串口1发送字符串的程序。首先,确认芯片的串口1配置。STC32G系列通常使用UART1,相关的寄存器是P_SW1来选择引脚。默认情况下,UART1的TX是P3.1。 接下来是设置定时器作为波特率发生器。通常用定时器2,…...
基于javaweb的SpringBoot高校图书馆座位预约系统设计与实现(源码+文档+部署讲解)
技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论文…...
一种资源有限单片机处理cJSON数据的方法
一般单片机处理cJSON格式的数据都直接使用cJSON库,但对于Ram较小的单片机,由于资源有限,这并不合适,但我们可以根据cJSON数据的特定格式,使用土方法,直接对字符进行查找裁剪即可 //截取字符串str中字符a与…...
【2025版】Spring Boot面试题
文章目录 1. Spring, Spring MVC, SpringBoot是什么关系?2. 谈一谈对Spring IoC的理解3. Component 和 Bean 的区别?4. Autowired 和 Resource 的区别?5. 注入Bean的方法有哪些?6. 为什么Spring 官方推荐构造函数注入?…...
C++——类和对象(1)
文章目录 一、前言二、类和对象上2.1 类的定义2.1.1 定义格式一2.1.2 定义格式二2.1.3 注意点 2.2 访问限定符2.2.1 访问限定符的用法 2.3 类域2.4 类的实例化2.4.1 实例化的概念2.4.2 实例化具体举例2.4.3类的实例化对象大小 2.5 this指针2.5.1 this指针的概念2.5.6 this指针的…...
【行为型之观察者模式】游戏开发实战——Unity事件驱动架构的核心实现策略
文章目录 🎯 观察者模式(Observer Pattern)深度解析一、模式本质与核心价值二、经典UML结构三、Unity实战代码(玩家血量监控系统)1. 定义观察者接口与主题基类2. 实现具体主题(玩家血量)3. 实现…...
Java基础语法之数组
数组 一、认识数组 1.什么是数组 数组就是一个容器,用来存一批同种类型的数据。 举例 20, 10, 80, 60, 90 int[] arr {20, 10, 80, 60, 90};张三, 李四, 王五 String[] names {"张三", "李四", "王五"};2.为什么要使用数组 假设…...
Vue3学习(组合式API——计算属性computed详解)
目录 一、计算属性computed。 Vue官方提供的案例。(普通写法与计算属性写法) 使用计算属性computed重构——>简化描述响应式状态的复杂逻辑。 (1)计算属性computed小案例。 <1>需求说明。(筛选原数组——>得新数组) &…...
高海拔和远距离的人员识别:面部、体型和步态的融合
大家读完就觉得有帮助记得关注和点赞!!! 摘要 我们解决了在无约束环境中进行全身人体识别的问题。这个问题出现在诸如IARPA高空和远距离生物识别与身份识别(BRIAR)计划等监视场景中,其中生物识别数据是在长…...
《P2345 [USACO04OPEN] MooFest G》
题目背景 P5094 [USACO04OPEN] MooFest G 加强版 题目描述 约翰的 n 头奶牛每年都会参加“哞哞大会”。 哞哞大会是奶牛界的盛事。集会上的活动很多,比如堆干草,跨栅栏,摸牛仔的屁股等等。 它们参加活动时会聚在一起,第 i 头…...
浅浅学:DoIP工作流程及基于DoIP的诊断/刷写工具
注:阅读本文需要对UDS及BootLoader有一定了解,基础内容不做赘述。 在汽车"新四化"浪潮的推动下,智能座舱、自动驾驶、车路协同等创新技术正加速重构行业格局。随着车载ECU数量突破百个量级,软件代码量呈指数级增长——…...
首个专业AI设计Agent发布-Lovart
Lovart是什么 Lovart 是为设计师打造的世界上首个专业设计 Agent。Lovart 能像专业设计师一样思考和执行设计任务,提供高水平的设计方案。基于自然语言交互,用户能快速调整布局、颜色和构图。Lovart 支持从创意拆解到专业交付的全链路设计,单…...
二叉树(中序遍历)
嘿,欢迎来到小巫blog!小巫又来啦!看到你对二叉树中序遍历这道题有点困惑,别担心,我会一步步带你搞定它!这道题是树的基础题目,掌握了它,你对树的遍历就会有很深的理解。我相信&#…...
Ubuntu 系统默认已安装 python,此处只需添加一个超链接即可
步骤 1:确认 Python 3 的安装路径 查看当前 Python 3 的路径: which python3 输出类似: /usr/bin/python3 步骤 2:创建符号链接 使用 ln -s 创建符号链接,将 python 指向 python3: sudo ln -s /usr/b…...
AcroForm JavaScript Promise 对象应用示例: 异步加载PDF文件
这段代码演示了在Adobe Acrobat DC Pro 的 JavaScript 环境中如何使用 Promise 对象处理异步操作。具体功能是: 定义了一个loadFile函数,模拟异步加载PDF文件的操作使用Promise对象封装异步操作,提供成功(resolve)和失败(reject)两种状态通过…...
LeetCode 热题 100 114. 二叉树展开为链表
LeetCode 热题 100 | 114. 二叉树展开为链表 大家好,今天我们来解决一道经典的二叉树问题——二叉树展开为链表。这道题在 LeetCode 上被标记为中等难度,要求将二叉树展开为一个单链表,展开后的单链表应该与二叉树的先序遍历顺序相同。 问题…...
DML和DQL
1. 设置MySQL的储存引擎 上一章的附录里已经将ini设置好了,不用再次设置 2. DML语句 插入单数据记录 插入多数据记录 将查询结果插入新表 更新数据 删除数据 注意:delete删除只会删除数据,不会重置表的现有逻辑,truncate会重置表逻…...
多线程与线程互斥
我们初步学习完线程之后,就要来试着写一写多线程了。在写之前,我们需要继续来学习一个线程接口——叫做线程分离。 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进行pthread_join操作,否则无法…...
BMS工具箱用来执行贝叶斯模型平均(BMA)计算模块
贝叶斯模型平均(Bayesian Model Averaging,BMA)是一种用于处理模型不确定性的统计方法,通过结合多个模型的预测结果来提高预测的准确性和鲁棒性。在 MATLAB 中,可以使用专门的工具箱(如 BMS 工具箱…...
Java死锁排查:线上救火实战指南
想象一下,你正在值班,突然监控告警红成一片,用户反馈雪花般飘来:“系统卡死了!用不了了!” —— 这很可能就是Java应用遭遇了“死锁”这个大魔王。这时候,你就是救火队长,首要任务不…...
第十九次博客打卡
今天学习的内容是Java中的常见循环。 在 Java 中,常见的循环结构主要有以下几种:for 循环、while 循环、do-while 循环以及增强型 for 循环(也称为 for-each 循环)。 1. for 循环 for 循环是一种非常灵活的循环结构,…...