Python3《机器学习实战》学习笔记(七):支持向量机原理篇之手撕线性SVM

news2024/11/19 5:56:43

文章目录

  • 一、SVM介绍
  • 二、线性SVM
    • 2.1 数学建模
      • 2.1.1决策面方程
      • 2.1.2"分类间隔"方程
      • 2.1.3约束条件
      • 2.1.4线性SVM优化问题基本描述
      • 2.1.5求解准备(讲讲凸函数)
      • 2.1.6拉格朗日函数
      • 2.1.7KKT条件
      • 2.1.8对偶问题求解
      • 2.1.9最后求解
    • 2.2 SMO算法
  • 三、代码实战
    • 3.1准备数据

一、SVM介绍

SVM的英文全称是Support Vector Machines,我们叫它支持向量机。支持向量机是我们用于分类的一种算法。

可以参考大佬博客链接: https://jackcui.blog.csdn.net/article/details/78072313关于对SVM的介绍。

SVM就是试图把棍放在最佳位置,好让在棍的两边有尽可能大的间隙。这个间隙就是球到棍的距离。

再之后,把这些球叫做data,把棍子叫做classifier, 找到最大间隙的trick叫做optimization,拍桌子叫做kernelling, 那张纸叫做hyperplane

概况问题
当一个分类问题,数据是线性可分的,也就是用一根棍就可以将两种小球分开的时候,我们只要将棍的位置放在让小球距离棍的距离最大化的位置即可,寻找这个最大间隔的过程,就叫做最优化。
但是,现实往往是很残酷的,一般的数据是线性不可分的,也就是找不到一个棍将两种小球很好的分类。这个时候,我们就需要像大侠一样,将小球拍起,用一张纸代替小棍将小球进行分类。想要让数据飞起,我们需要的东西就是核函数(kernel),用于切分小球的纸,就是超平面。(核函数的作用就是低维转化为高维。)

二、线性SVM

先看下线性可分的二分类问题。
在这里插入图片描述
上图中的(a)是已有的数据,红色和蓝色分别代表两个不同的类别。数据显然是线性可分的,但是将两类数据点分开的直线显然不止一条。上图的(b)和(c)分别给出了B、C两种不同的分类方案,其中黑色实线为分界线,术语称为“决策面”。每个决策面对应了一个线性分类器。虽然从分类结果上看,分类器A和分类器B的效果是相同的。但是他们的性能是有差距的,看下图:
在这里插入图片描述
在"决策面"不变的情况下,我又添加了一个红点。可以看到,分类器B依然能很好的分类结果,而分类器C则出现了分类错误。显然分类器B的"决策面"放置的位置优于分类器C的"决策面"放置的位置,SVM算法也是这么认为的,它的依据就是分类器B的分类间隔比分类器C的分类间隔大。

这里涉及到第一个SVM独有的概念"分类间隔"。在保证决策面方向不变且不会出现错分样本的情况下移动决策面,会在原来的决策面两侧找到两个极限位置(越过该位置就会产生错分现象),如虚线所示。

虚线的位置由决策面的方向和距离原决策面最近的几个样本的位置决定。而这两条平行虚线正中间的分界线就是在保持当前决策面方向不变的前提下的最优决策面。两条虚线之间的垂直距离就是这个最优决策面对应的分类间隔。

显然每一个可能把数据集正确分开的方向都有一个最优决策面(有些方向无论如何移动决策面的位置也不可能将两类样本完全分开),而不同方向的最优决策面的分类间隔通常是不同的,那个具有“最大间隔”的决策面就是SVM要寻找的最优解。而这个真正的最优解对应的两侧虚线所穿过的样本点,就是SVM中的支持样本点,称为"支持向量"。

2.1 数学建模

求解这个"决策面"的过程,就是最优化。一个最优化问题通常有两个基本的因素:

  1. 目标函数,也就是你希望什么东西的什么指标达到最好
  2. 优化对象,你期望通过改变哪些因素来使你的目标函数达到最优。

在线性SVM算法中,目标函数显然就是那个"分类间隔",而优化对象则是决策面

所以要对SVM问题进行数学建模,首先要对上述两个对象(“分类间隔"和"决策面”)进行数学描述。按照一般的思维习惯,我们先描述决策面。

数学建模的时候,先在二维空间建模,然后再推广到多维。

2.1.1决策面方程

我们都知道二维空间下一条直线的方式如下所示:
y = a x + b y=a x+b y=ax+b

x 2 = a x 1 + b x_{2}=a x_{1}+b x2=ax1+b

a x 1 − x 2 + b = 0 \mathrm{ax}_{1}-\mathrm{x}_{2}+\mathrm{b}=0 ax1x2+b=0

移项得到:

[ a − 1 ] [ x 1 x 2 ] + b = 0 \left[\begin{array}{ll} a & -1 \end{array}\right]\left[\begin{array}{l} x_{1} \\ x_{2} \end{array}\right]+b=0 [a1][x1x2]+b=0

进一步向量化,用w列向量和x列向量和标量γ进一步向量化:

ω T x + γ = 0 \boldsymbol{\omega}^{T} \boldsymbol{x}+\gamma=0 ωTx+γ=0

其中,向量w和x分别为:

ω = [ ω 1 , ω 2 ] T , x = [ x 1 , x 2 ] T \boldsymbol{\omega}=\left[\omega_{1}, \omega_{2}\right]^{T}, \boldsymbol{x}=\left[x_{1}, x_{2}\right]^{T} ω=[ω1,ω2]T,x=[x1,x2]T

这里w1=a,w2=-1。我们都知道,最初的那个直线方程a和b的几何意义,a表示直线的斜率,b表示截距,a决定了直线与x轴正方向的夹角,b决定了直线与y轴交点位置。那么向量化后的直线的w和r的几何意义是什么呢?

二维空间的直线方程已经推导完成,将其推广到n维空间,就变成了超平面方程。(一个超平面,在二维空间的例子就是一个直线)但是它的公式没变,依然是:

ω T x + γ = 0 \boldsymbol{\omega}^{T} \boldsymbol{x}+\gamma=0 ωTx+γ=0

ω = [ ω 1 , ω 2 , ⋯   , ω n ] T x = [ x 1 , x 2 , ⋯   , x n ] T \begin{array}{l} \boldsymbol{\omega}=\left[\omega_{1}, \omega_{2}, \cdots, \omega_{n}\right]^{T} \\ \boldsymbol{x}=\left[x_{1}, x_{2}, \cdots, x_{n}\right]^{T} \end{array} ω=[ω1,ω2,,ωn]Tx=[x1,x2,,xn]T

我们已经顺利推导出了"决策面"方程,它就是我们的超平面方程,之后,我们统称其为超平面方程。

2.1.2"分类间隔"方程

在这里插入图片描述
我们已经知道间隔的大小实际上就是支持向量对应的样本点到决策面的距离的二倍。那么图中的距离d我们怎么求?我们高中都学过,点到直线的距离距离公式如下:
d = ∣ A x 0 + B y 0 + C A 2 + B 2 ∣ d=\left|\frac{A x_{0}+B y_{0}+C}{\sqrt{A^{2}+B^{2}}}\right| d= A2+B2 Ax0+By0+C
请添加图片描述
现在,将直线方程扩展到多维,求得我们现在的超平面方程,对公式进行如下变形:

d = ∣ ω T x + γ ∣ ∥ ω ∥ d=\frac{\left|\boldsymbol{\omega}^{T} \boldsymbol{x}+\gamma\right|}{\|\boldsymbol{\omega}\|} d=ω ωTx+γ
分析图片!!:
已知W其实是垂直所求平面的法向量,先对W向量求模,即单位化,再乘某一点到平面一点的向量,就得到某点到该平面的距离

这个d就是"分类间隔"。其中||w||表示w的二范数,求所有元素的平方和,然后再开方。比如对于二维平面:

ω = [ ω 1 , ω 2 ] T \omega=\left[\omega_{1}, \omega_{2}\right]^{T} ω=[ω1,ω2]T

∥ ω ∥ = ω 1 2 + ω 2 2 2 \|\boldsymbol{\omega}\|=\sqrt[2]{\omega_{1}^{2}+\omega_{2}^{2}} ω=2ω12+ω22

我们目的是为了找出一个分类效果好的超平面作为分类器。分类器的好坏的评定依据是分类间隔W=2d的大小,即分类间隔W越大,我们认为这个超平面的分类效果越好。此时,求解超平面的问题就变成了求解分类间隔W最大化的为题。W的最大化也就是d最大化的

2.1.3约束条件

看起来,我们已经顺利获得了目标函数的数学形式。但是为了求解w的最大值。我们不得不面对如下问题:

  1. 我们如何判断超平面是否将样本点正确分类?
  2. 我们知道相求距离d的最大值,我们首先需要找到支持向量上的点,怎么在众多的点中选出支持向量上的点呢?

这个二维平面上有两种点,我们分别对它们进行标记:

  1. 红颜色的圆点标记为1,我们人为规定其为正样本
  2. 蓝颜色的五角星标记为-1,我们人为规定其为负样本

对每个样本点xi加上一个类别标签yi:

y i = { + 1  红色点  − 1  蓝色点  y_{i}=\left\{\begin{array}{ll} +1 & \text { 红色点 } \\ -1 & \text { 蓝色点 } \end{array}\right. yi={+11 红色点  蓝色点 

如果我们的超平面方程能够完全正确地对上图的样本点进行分类,就会满足下面的方程:

{ ω T x i + γ > 0 y i = 1 ω T x i + γ < 0 y i = − 1 \left\{\begin{array}{cc} \boldsymbol{\omega}^{T} x_{i}+\gamma>0 & y_{i}=1 \\ \boldsymbol{\omega}^{T} x_{i}+\gamma<0 & y_{i}=-1 \end{array}\right. {ωTxi+γ>0ωTxi+γ<0yi=1yi=1

如果我们要求再高一点,假设决策面正好处于间隔区域的中轴线上,并且相应的支持向量对应的样本点到决策面的距离为d,那么公式进一步写成:

{ ω T x i + γ ∥ ω ∥ ≥ d ∀ y i = 1 ω T x i + γ ∥ ω ∥ ≤ − d ∀ y i = − 1 \left\{\begin{array}{lr} \frac{\boldsymbol{\omega}^{\boldsymbol{T}} x_{i}+\gamma}{\|\boldsymbol{\omega}\|} \geq \mathrm{d} \quad & \forall y_{i}=1 \\ \frac{\boldsymbol{\omega}^{\boldsymbol{T}} x_{i}+\gamma}{\|\boldsymbol{\omega}\|} \leq-\mathrm{d} \quad & \forall y_{i}=-1 \end{array}\right. {ωωTxi+γdωωTxi+γdyi=1yi=1

上述公式的解释就是,对于所有分类标签为1的样本点,它们到直线的距离都大于等于d(支持向量上的样本点到超平面的距离)。对于所有分类标签为-1的样本点,它们到直线的距离都小于等于d。公式两边都除以d,就可以得到:

{ ω d T x i + γ d ≥ 1 ∀ y i = 1 ω d T x i + γ d ≤ − 1 ∀ y i = − 1 \left\{\begin{array}{lr} \boldsymbol{\omega}_{d}^{T} x_{i}+\gamma_{d} \geq 1 & \forall y_{i}=1 \\ \boldsymbol{\omega}_{d}^{T} x_{i}+\gamma_{d} \leq-1 & \forall y_{i}=-1 \end{array}\right. {ωdTxi+γd1ωdTxi+γd1yi=1yi=1

ω d = ω ∥ ω ∥ d , γ d = γ ∥ ω ∥ d \boldsymbol{\omega}_{d}=\frac{\boldsymbol{\omega}}{\|\boldsymbol{\omega}\| d}, \quad \gamma_{d}=\frac{\gamma}{\|\boldsymbol{\omega}\| d} ωd=ωdω,γd=ωdγ

上述两个公式,都是描述一条直线,数学模型代表的意义是一样的。现在,让我们对wd和γd重新起个名字,就叫它们w和γ。因此,我们就可以说:“对于存在分类间隔的两类样本点,我们一定可以找到一些超平面面,使其对于所有的样本点均满足下面的条件:”

将不等式的右边与0的关系转化为与1的关系

{ ω T x i + γ ≥ 1 ∀ y i = 1 ω T x i + γ ≤ − 1 ∀ y i = − 1 \left\{\begin{array}{lr} \boldsymbol{\omega}^{T} x_{i}+\gamma \geq 1 & \forall y_{i}=1 \\ \boldsymbol{\omega}^{T} x_{i}+\gamma \leq-1 & \forall y_{i}=-1 \end{array}\right. {ωTxi+γ1ωTxi+γ1yi=1yi=1

y i ( ω T x i + γ ) ≥ 1 ∀ x i y_{i}\left(\boldsymbol{\omega}^{T} x_{i}+\gamma\right) \geq 1 \quad \forall x_{i} yi(ωTxi+γ)1xi

2.1.4线性SVM优化问题基本描述

目标函数:

d = ∣ ω T x + γ ∣ ∥ ω ∥ d=\frac{\left|\boldsymbol{\omega}^{T} \boldsymbol{x}+\gamma\right|}{\|\boldsymbol{\omega}\|} d=ω ωTx+γ

在这里插入图片描述
因为,我们只关心支持向量上的点。随后我们求解d的最大化问题变成了||w||的最小化问题。进而||w||的最小化问题等效于

min ⁡ 1 2 ∥ ω ∥ 2 \min \frac{1}{2}\|\omega\|^{2} min21ω2

为什么要做这样的等效呢?这是为了在进行最优化的过程中对目标函数求导时比较方便,但这绝对不影响最优化问题最后的求解。我们将最终的目标函数和约束条件放在一起进行描述:

min ⁡ 1 2 ∥ ω ∥ 2 \min \frac{1}{2}\|\omega\|^{2} min21ω2

 s.t.  y i ( ω T x i + b ) ≥ 1 , i = 1 , 2 , … , n \text { s.t. } y_{i}\left(\boldsymbol{\omega}^{T} x_{i}+b\right) \geq 1, i=1,2, \ldots, n  s.t. yi(ωTxi+b)1,i=1,2,,n

这里n是样本点的总个数,缩写s.t.表示"Subject to",是"服从某某条件"的意思。上述公式描述的是一个典型的不等式约束条件下的二次型函数优化问题,同时也是支持向量机的基本数学模型。

2.1.5求解准备(讲讲凸函数)

我们已经得到支持向量机的基本数学模型,接下来的问题就是如何根据数学模型,求得我们想要的最优解。在学习求解方法之前,我们得知道一点,想用我下面讲述的求解方法有一个前提,就是我们的目标函数必须是凸函数。理解凸函数,我们还要先明确另一个概念,凸集。在凸几何中,凸集(convex set)是在)凸组合下闭合的放射空间的子集。看一幅图可能更容易理解:
在这里插入图片描述
左右量图都是一个集合。如果集合中任意2个元素连线上的点也在集合中,那么这个集合就是凸集。显然,上图中的左图是一个凸集,上图中的右图是一个非凸集

凸函数的定义也是如此,其几何意义表示为函数任意两点连线上的值大于对应自变量处的函数值。若这里凸集C即某个区间L,那么,设函数f为定义在区间L上的函数,若对L上的任意两点x1,x2和任意的实数λ,λ属于(0,1),总有:
在这里插入图片描述
则函数f称为L上的凸函数,当且仅当其上镜图(在函数图像上方的点集)为一个凸集。再看一幅图,也许更容易理解:
在这里插入图片描述
像上图这样的函数,它整体就是一个非凸函数,我们无法获得全局最优解的,只能获得局部最优解。比如红框内的部分,如果单独拿出来,它就是一个凸函数。对于我们的目标函数:

min ⁡ 1 2 ∥ ω ∥ 2 \min \frac{1}{2}\|\omega\|^{2} min21ω2

很显然,它是一个凸函数

通常我们需要求解的最优化问题有如下几类:

  1. 无约束优化问题,可以写为:
    min ⁡ f ( x ) \min f(x) minf(x)
    尝尝使用的方法就是费马大定理(Fermat),即使用求取函数f(x)的导数,然后令其为零,可以求得候选最优值,再在这些候选值中验证;如果是凸函数,可以保证是最优解。这也就是我们高中经常使用的求函数的极值的方法。

  2. 有等式约束的优化问题,可以写为:
    min ⁡ f ( x ) s . t . h i ( x ) = 0 , i = 1 , 2 , … , n \min f(x) s.t. h_{i(x)}=0, \quad i=1,2, \ldots, n minf(x)s.t.hi(x)=0,i=1,2,,n
    常常使用的方法就是拉格朗日乘子法(Lagrange Multiplier) ,即把等式约束h_i(x)用一个系数与f(x)写为一个式子,称为拉格朗日函数,而系数称为拉格朗日乘子。通过拉格朗日函数对各个变量求导,令其为零,可以求得候选值集合,然后验证求得最优值。

  3. 有不等式约束的优化问题,可以写为:
    min ⁡ f ( x ) s . t . g i ( x ) ≤ 0 , i = 1 , 2 , … , n h j ( x ) = 0 , j = 1 , 2 , … , m \min f(x) s.t. g_{i(x)} \leq 0, \quad i=1,2, \ldots, n h_{j(x)}=0, \quad j=1,2, \ldots, m minf(x)s.t.gi(x)0,i=1,2,,nhj(x)=0,j=1,2,,m

常常使用的方法就是KKT条件。同样地,我们把所有的等式、不等式约束与f(x)写为一个式子,也叫拉格朗日函数,系数也称拉格朗日乘子,通过一些条件,可以求出最优值的必要条件,这个条件称为KKT条件。

我们的最优化问题,属于C类问题:
min ⁡ 1 2 ∥ ω ∥ 2 s . t . y i ( ω T x i + b ) ≥ 1 , i = 1 , 2 , … , n \min \frac{1}{2}\|\omega\|^{2} s.t. y_{i}\left(\boldsymbol{\omega}^{T} x_{i}+b\right) \geq 1, i=1,2, \ldots, n min21ω2s.t.yi(ωTxi+b)1,i=1,2,,n

2.1.6拉格朗日函数

在这里插入图片描述
现在,我们的问题变成了求新目标函数的最小值,即:
min ⁡ w , b θ ( w ) = min ⁡ w , b max ⁡ α i ≥ 0 L ( w , b , α ) = p ∗ \min _{w, b} \theta(w)=\min _{w, b} \max _{\alpha_{i} \geq 0} \mathcal{L}(w, b, \alpha)=p^{*} w,bminθ(w)=w,bminαi0maxL(w,b,α)=p
这里用p*表示这个问题的最优值,且和最初的问题是等价的。
在这里插入图片描述
max ⁡ α i ≥ 0 min ⁡ w , b L ( w , b , α ) = d ∗ \max _{\alpha_{i} \geq 0} \min _{w, b} \mathcal{L}(w, b, \alpha)=d^{*} αi0maxw,bminL(w,b,α)=d

交换以后的新问题是原始问题的对偶问题,这个新问题的最优值用d来表示。而且d<=p*。我们关心的是d=p的时候,这才是我们要的解。需要什么条件才能让d=p呢?

首先必须满足这个优化问题是凸优化问题。其次,需要满足KKT条件。

凸优化问题的定义是:求取最小值的目标函数为凸函数的一类优化问题。

目标函数是凸函数我们已经知道,这个优化问题又是求最小值。所以我们的最优化问题就是凸优化问题。

2.1.7KKT条件

见链接

2.1.8对偶问题求解

在这里插入图片描述
在这里插入图片描述
带回:
在这里插入图片描述
从上面的最后一个式子,我们可以看出,此时的L(w,b,α)函数只含有一个变量,即αi。

现在内侧的最小值求解完成,我们求解外侧的最大值,从上面的式子得到:
在这里插入图片描述
现在我们的优化问题变成了如上的形式。对于这个问题,我们有更高效的优化算法,即序列最小优化(SMO)算法我们通过这个优化算法能得到α,再根据α,我们就可以求解出w和b,进而求得我们最初的目的:找到超平面,即"决策平面"。

2.1.9最后求解

在这里插入图片描述
在这里插入图片描述

2.2 SMO算法

见链接: https://jackcui.blog.csdn.net/article/details/78072313!!!!!!

在这里插入图片描述
在这里插入图片描述

三、代码实战

3.1准备数据

'''
@Project :MachineLearning 
@File    :svm-getdata.py
@Author  :Kyrie Irving
@Date    :2022/11/3 20:15 
'''
import matplotlib.pyplot as plt
import numpy as np

def loadDataSet(fileName):
    dataMat = []
    labelMat = []
    fr = open(fileName)
    for line in fr.readlines():
        line = line.strip().split('\t')
        dataMat.append([float(line[0]), float(line[1])])
        labelMat.append(float(line[2]))
    return dataMat, labelMat

def showDataSet(dataMat, labelMat):
    data_plus = []  # 正样本
    data_minus = []  # 负样本
    for i in range(len(labelMat)):
        if labelMat[i] > 0:
            data_plus.append(dataMat[i])
        else:
            data_minus.append(dataMat[i])
    data_plus_np = np.array(data_plus)  # 转换为numpy矩阵
    data_minus_np = np.array(data_minus)  # 转换为numpy矩阵
    plt.scatter(np.transpose(data_plus_np)[0], np.transpose(data_plus_np)[1])   #正样本散点图
    plt.scatter(np.transpose(data_minus_np)[0], np.transpose(data_minus_np)[1]) #负样本散点图
    plt.show()

if __name__ == '__main__':
    dataMat, labelMat = loadDataSet('testSet.txt')
    showDataSet(dataMat, labelMat)

在这里插入图片描述

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

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

相关文章

M_Map工具箱简介及地理图形绘制

M_Map工具箱简介及地理图形绘制 1 M_Map简介1.1 具体代码说明 2 地理图形绘制案例2.1 M_Map给定案例2.1.1 M_Map Logo2.1.2 Lambert Conformal Conic projection of North American Topography2.1.3 Stereographic projection of North Polar regions2.1.4 Colourmaps 2.2 案例…

vue封装公共组件库并发布到npm库详细教程

vue组件封装的原理&#xff1a;利用vue框架提供的api: Vue.use( plugin )&#xff0c;我们需要把封装好组件的项目打包成vue库&#xff0c;并提供install方法&#xff0c;然后发布到npm中。Vue.use( plugin )的时候会自动执行插件中的install方法。 一、组件库代码目录 目录…

常见的四种排名函数的用法(sql)

四个排名函数&#xff1a; 1.row_number 2.rank 3.dense_rank 4.ntile 1. ROW_NUMBER&#xff08;排名场景推荐&#xff09; 1.1 介绍 在 SQL 中&#xff0c;ROW_NUMBER() 是一个窗口函数&#xff0c;它为结果集中的每一行分配一个唯一的序号。该函数的语法如下&#xff1a; …

内网渗透之横向移动PTHPTTPTK

0x00前言 pass the hash&#xff08;哈希传递攻击&#xff0c;简称pth&#xff09; pass the ticket&#xff08;票据传递攻击&#xff0c;简称ptt&#xff09; pass the key&#xff08;密钥传递攻击&#xff0c;简称ptk&#xff09; PTH(pass the hash) #利用的lm或ntlm的值…

【社区图书馆】 Go佬—Go程序开发实战宝典书评

文章目录 前言内容介绍文章大致划分总结 前言 《Go 程序开发实战宝典》是一本非常实用的 Go 语言开发工具书&#xff0c;本书由深入浅出的案例讲解、详细的技术实现、贴近实际的应用开发等组成&#xff0c;非常适合 Go 语言开发爱好者、从事相关行业的工程师、技术负责人以及深…

ThinkPHP视图

ThinkPHP视图 前言视图一、运算符二、模版函数三、循环标签四,volist 循环标签五&#xff0c;if 判断标签六&#xff0c;switch 判断标签七、包含文件八、其他标签1. 条件标签2. 比较标签3. 循环标签4. 杂项标签 总结 前言 ThinkPHP视图基本语法和PHP语法非常的像&#xff0c;所…

React Native 9个好用的开发工具盘点

近几年在大前端的开发领域&#xff0c;选择跨端方案的公司和部门越来越多&#xff0c;曾一何时市面有不下10种跨端框架&#xff0c;但随着“生物进化论”的推动&#xff0c;目前市面上仅剩两种主流方案&#xff0c;就是经常听到的 React Native 和 Flutter。去年终于引来了 Rea…

企业网络安全漏洞分析及其解决_kaic

摘要 为了防范网络安全事故的发生,互联网的每个计算机用户、特别是企业网络用户&#xff0c;必须采取足够的安全防护措施&#xff0c;甚至可以说在利益均衡的情况下不惜一切代价。事实上&#xff0c;许多互联网用户、网管及企业老总都知道网络安全的要性&#xff0c;却不知道网…

《JavaEE初阶》多线程进阶

《JavaEE初阶》多线程进阶 文章目录 《JavaEE初阶》多线程进阶常见锁策略乐观锁与悲观锁普通互斥锁与读写锁轻量级锁与重量级锁自旋锁与挂起等待锁公平锁和非公平锁可重入锁和不可重入锁 CAS什么是CASCAS的应用场景:CAS 的 ABA 问题什么是CAS 的 ABA 问题解决方案: synchronize…

libxml2交叉编译和移植

编译后的libxml2如果交叉编译环境一致可以直接使用资源-CSDN文库 嵌入式开发过程中实用libxml2进行xml文件的解析、创建、使用。 这里介绍一下该libxml2的交叉编译过程和移植步骤 下载地址 libxml2 各版本下载地址 ftp://xmlsoft.org/libxml2/ ftp://xmlsoft.org/libxml2…

【汽车电子】5分钟了解汽车操作系统(科普篇)

在智能汽车电动汽车的浪潮下&#xff0c;「软件定义汽车」的理念已经成为很多厂家的共识&#xff0c;未来决定汽车个性化差异的不再是马力大小、座椅材质、底盘软硬等&#xff0c;而应该是人工智能、大数据和云计算技术的综合体。 要想实现这一切&#xff0c;就要给汽车安装一个…

【论文简述】WT-MVSNet: Window-based Transformers forMulti-view Stereo(arxiv 2023)

一、论文简述 1. 第一作者&#xff1a;Jinli Liao、Yikang Ding 2. 发表年份&#xff1a;2023 3. 发表期刊&#xff1a;arxiv 4. 关键词&#xff1a;MVS、3D重建、Transformer、极线、几何约束 5. 探索动机&#xff1a;然而&#xff0c;在没有极几何约束的情况下匹配参考图…

【Java数据结构】二叉树

二叉树 树型结构概念树中的概念树的表现形式 二叉树两种特殊的二叉树二叉树的性质二叉树的存储二叉树基本操作 树型结构 概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像…

读论文--Token Merging for Fast Stable Diffusion(用于快速Diffusion模型的tome技术)

摘要 The landscape of image generation has been forever changed by open vocabulary diffusion models. However, at their core these models use transformers, which makes generation slow. Better implementations to increase the throughput of these transformers …

JMeter的使用(一)

JMeter的使用 参考黑马视频 下载工具 一、准备工作 1、准备文件sql SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS 0;-- ---------------------------- -- Table structure for sys_follow_user -- ---------------------------- DROP TABLE IF EXISTS sys_follow_user; CR…

Html5惯性小鸟游戏制作与分享(怀旧小游戏)

当年电子词典中的经典游戏&#xff0c;后来出了无数变种的玩法。这里还原了最初的玩法与操作。实现了这一款有点难度“的怀旧经典游戏。 玩法也很简单&#xff0c;不用碰到任何东西、持续下去。。。 可以进行试玩&#xff0c;手机玩起来效果会更好些。 点击试玩 还有很多变种的…

网络安全SQL注入

1.何为Sql注入&#xff1f; 所谓SQL注入&#xff0c;就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串&#xff0c;最终达到欺骗服务器执行恶意的SQL命令。具体来说&#xff0c;它是利用现有应用程序&#xff0c;将&#xff08;恶意的&#xff09;SQL命令注…

发送结构化的网络消息数据

server.cpp #define WIN32_LEAN_AND_MEAN //尽力减少一些其他依赖库的引用 #define _WINSOCK_DEPRECATED_NO_WARNINGS#include<windows.h> #include<WinSock2.h> #include<stdio.h> //#pragma comment(lib,"ws2_32.lib")struct DataPackage {int …

HTTP Keep-Alive模式

故事发生在10月份的一次面试经历中&#xff0c;本来我不想说出来丢人显眼&#xff0c;但是为了警醒自己和告诫后人&#xff0c;我决定写成博文发出来。因为在面试过程中&#xff0c;我讲在2009年写过QQ农场助手&#xff0c;在这期间深入学习了HTTP协议&#xff0c;而且在2010-0…

盐湖钛系提锂吸附剂

#盐湖钛系提锂吸附剂 盐湖钛系提锂吸附剂HPL900是一种高选择性高容量锂离子筛吸附剂。其通过纳米杂化、锂离子印迹等技术制备而成。该吸附剂活性纳米晶粒子对锂离子具有高效吸附性能&#xff08;其对锂的吸附容量大于10.0g Li/L&#xff09;&#xff0c;同时吸附位点对锂离子具…