当前位置: 首页 > news >正文

从感知机到神经网络

感知机

  • 一、感知机是什么
  • 二、用感知机搭建简单逻辑电路
    • 2.1 与门
    • 2.2 与非门
    • 2.3 或门
  • 三、感知机的局限性
    • 3.1 异或门
    • 3.2 线性和非线性
  • 四、多层感知机
    • 4.1 已有门电路的组合
    • 4.2 Python异或门的实现
  • 五、感知机模型
    • 5.1 感知机模型
    • 5.2 感知机损失函数
    • 5.3 感知机学习算法
  • 六、感知机原始形式、对偶形式算法描述
    • 6.1 原始形式
    • 6.2 对偶形式
    • 6.3 原始形式和对偶形式的选择

一、感知机是什么

感知机接收多个信号输出一个信号。如图所示,是一个接收两个输入信号 ( x 1 、 x 2 ) (x_1、x_2) (x1x2)的感知机的例子,y是输出信号。图中的○称为“神经元”或者“节点”。输入信号被送往神经元时,会被分别乘以固定的权重 ( w 1 x 1 、 w 2 x 2 ) (w_1x_1、 w_2x_2) (w1x1w2x2),权重代表了该信号的重要程度。神经元会计算传送过来的信号的总和,只有当这个总和超过了某个界限值时,才会输出1。这也称为“神经元被激活” 。这里将这个界限值称为阈值,用符号 θ θ θ表示。

图1 两个输入的感知机

把上述内容用数学来表达,就是下面的公式:
y = { 0 if  w 1 x 1 + w 2 x 2 ≤ θ 1 if  w 1 x 1 + w 2 x 2 > θ y=\begin{cases} 0 & \text{if} \ w_1x_1+w_2x_2 \leq \theta \\ 1 & \text{if} \ w_1x_1+w_2x_2 > \theta \end{cases} y={01if w1x1+w2x2θif w1x1+w2x2>θ
感知机的每个输入信号都有各自的权重,表示该信号发挥重要性的作用,也就是说权重越大,对应该权重的信号越重要。

二、用感知机搭建简单逻辑电路

2.1 与门

知道了上面那些概念,那如何用感知机来解决简单的问题呢?这里首先以逻辑电路为题材来思考一下与门(AND gate)。与门是有两个输入和一个输出的门电路。下图这种输入信号和输出信号的对应表称为“真值表”。如图所示,与门仅在两个输入均为1时输出1,其他时候则输出0。

图2 与门真值表

考虑用感知机来表示这个与门,需要做的就是确定能满足图2中的真值表的 w 1 w1 w1 w 2 w2 w2 θ θ θ的值。那么,设定什么样的值才能制作出满足图中条件的感知机呢?实际上,满足上图条件的参数选择方法有无数多个。比如,当 ( w 1 , w 2 , θ ) = ( 0.5 , 0.5 , 0.7 ) (w1, w2, θ) = (0.5, 0.5, 0.7) (w1,w2,θ)=(0.5,0.5,0.7)时,可以满足图中条件。此外,当 ( w 1 , w 2 , θ ) (w1, w2, θ) (w1,w2,θ) ( 0.5 , 0.5 , 0.8 ) (0.5, 0.5, 0.8) (0.5,0.5,0.8)或者 ( 1.0 , 1.0 , 1.0 ) (1.0, 1.0, 1.0) (1.0,1.0,1.0)时,同样也满足与门的条件。设定这样的参数后,仅当x1和x2同时为1时,信号的加权总和才会超过给定的阈 θ θ θ

事实上,图2 与门真值表在坐标轴上画出来是如图3的形式。当输入(0,0)、(0,1)、(1,0)时,输出为0;当输入(1,1)时,输出为1,这其实是一个二分类问题,即找到一个超平面,将正例负例区分,可以看到满足条件的超平面有无数多个,而超平面由参数w1,w2确定。超平面可以表示为 f ( x 1 , x 2 ) = w x 1 + w x 2 f(x_1, x_2)=wx_1+wx_2 f(x1,x2)=wx1+wx2

图3 与门的感知机示例

感知机实现与门

def AND(x1: int, x2: int) -> int:w1, w2, theta = 0.5, 0.5, 0.7if w1 * x1 + w2 * x2 <= theta:return 0else:return 1def test_AND():print(AND(0, 0))print(AND(0, 1))print(AND(1, 0))print(AND(1, 1))if __name__ == '__main__':test_AND()
AND(0, 0) # 输出0
AND(1, 0) # 输出0
AND(0, 1) # 输出0
AND(1, 1) # 输出1

2.2 与非门

接着,我们再来考虑一下与非门(NAND gate)。NAND是Not AND的意思,与非门就是颠倒了与门的输出。用真值表表示的话,如下图所示,仅当x1和x2同时为1时输出0,其他时候则输出1。

图4 与非门真值表

要表示与非门,可以用 ( w 1 , w 2 , θ ) = ( − 0.5 , − 0.5 , − 0.7 ) (w1, w2, θ) = (−0.5, −0.5, −0.7) (w1,w2,θ)=(0.5,0.5,0.7)这样的组合(其他的组合也是无限存在的)。实际上,只要把实现与门的参数值的符号取反,就可以实现与非门。

import numpy as npdef NADN(x1, x2):# 与非门x = np.array([x1, x2])w = np.array([-0.5, -0.5])b = 0.7if np.sum(w * x) + b <= 0:return 0else:return 1def test_NAND():print(NADN(0, 0))print(NADN(0, 1))print(NADN(1, 0))print(NADN(1, 1))if __name__ == '__main__':test_NAND()
1
1
1
0

2.3 或门

接下来咱们再来看一下下面这张图所示的或门。或门是“只要有一个输入信号是1,输出就为1”的逻辑电路。

图4 与非门真值表

import numpy as npdef OR(x1: int, x2: int) -> int:x = np.array([x1, x2])w = np.array([0.5, 0.5])b = -0.2if np.sum(w * x) + b <= 0:return 0else:return 1def test_OR():print(OR(0, 0))print(OR(0, 1))print(OR(1, 0))print(OR(1, 1))if __name__ == '__main__':test_OR()
0
1
1
1

如上所示,我们已经知道使用感知机可以表示与门、与非门、或门的逻辑电路。这里重要的一点是:与门、与非门、或门的感知机构造是一样的。实际上, 3个门电路只有参数的值(权重和阈值)不同。也就是说,相同构造的感知机,只需通过适当地调整参数的值,就可以像“变色龙演员”表演不同的角色一样,变身为与门、与非门、或门。

三、感知机的局限性

3.1 异或门

到这里我们已经知道,使用感知机可以实现与门、与非门、或门三种逻辑电路。现在我们来考虑一下异或门(XOR gate)。

异或门也被称为逻辑异或电路。如图5所示,仅当 x 1 x_1 x1 x 2 x_2 x2中的一方为1时,才会输出1(“异或”是拒绝其他的意思)。那么,要用感知机实现这个异或门的话,应该怎么设定权重参数呢?

图5 异或门真值表

实际上,用前面介绍的感知机是无法实现这个异或门的(应该是“单层感知机无法表示异或门”或者“单层感知机无法分离非线性空间”)。为什么用感知机可以实现与门、或门,却无法实现异或门呢?从坐标轴就可以看出,无法找到一条直线,将两类点区分开。

3.2 线性和非线性

图5中的 ◯ \bigcirc △ \bigtriangleup 无法用一条直线分开,但是如果将“直线”这个限制条件去掉,就可以实现了。比如,我们可以像图3那样,作出分开○和△的空间。

在这里插入图片描述
感知机的局限性就在于它只能表示由一条直线分割的空间。图8这样弯曲的曲线无法用感知机表示。另外,由图8这样的曲线分割而成的空间称为非线性空间,由直线分割而成的空间称为线性空间。线性、非线性这两个术语在机器学习领域很常见,可以将其想象成图6和图8所示的直线和曲线。

四、多层感知机

感知机不能表示异或门让人深感遗憾,但也无需悲观。实际上,感知机的绝妙之处在于它可以“叠加层”(通过叠加层来表示异或门是本节的要点)。

4.1 已有门电路的组合

异或门的制作方法有很多,其中之一就是组合我们前面做好的与门、与非门、或门。
在这里插入图片描述
在这里插入图片描述

4.2 Python异或门的实现

import numpy as npdef AND(x1: int, x2: int) -> int:w1, w2, theta = 0.5, 0.5, 0.7if w1 * x1 + w2 * x2 <= theta:return 0else:return 1def NADN(x1, x2):# 与非门x = np.array([x1, x2])w = np.array([-0.5, -0.5])b = 0.7if np.sum(w * x) + b <= 0:return 0else:return 1def OR(x1: int, x2: int) -> int:x = np.array([x1, x2])w = np.array([0.5, 0.5])b = -0.2if np.sum(w * x) + b <= 0:return 0else:return 1def XOR(x1, x2):s1 = NADN(x1, x2)s2 = OR(x1, x2)y = AND(s1, s2)return yif __name__ == '__main__':print(XOR(0, 0))print(XOR(0, 1))print(XOR(1, 0))print(XOR(1, 1))
0
1
1
0

这样,异或门的实现就完成了。下面我们试着用感知机的表示方法(明
确地显示神经元)来表示这个异或门:
在这里插入图片描述
实际上,与门、或门是单层感知机,而异或门是2层感知机。叠加了多
层的感知机也称为多层感知机(multi-layered perceptron)。

这种2层感知机的运行过程可以比作流水线的组装作业。第1段(第1层)
的工人对传送过来的零件进行加工,完成后再传送给第2段(第2层)的工人。第2层的工人对第1层的工人传过来的零件进行加工,完成这个零件后出货(输出)。

像这样,在异或门的感知机中,工人之间不断进行零件的传送。通过这样的结构(2层结构),感知机得以实现异或门。这可以解释为“单层感知机无法表示的东西,通过增加一层就可以解决”。也就是说,通过叠加层(加深层),感知机能进行更加灵活的表示。

五、感知机模型

感知机(perceptron)是二分类的线性分类模型,属于监督学习算法。输入为实例的特征向量,输出为实例的类别(取+1和-1)。感知机旨在求出将输入空间中的实例划分为两类的分离超平面。为求得超平面,感知机导入了基于误分类的损失函数,利用梯度下降法对损失函数进行最优化求解。

5.1 感知机模型

感知器是一种简单的两类线性分类模型,给定 N N N个样本的训练集 { x i , y i } i = 1 N \{x_i,y_i\}_{i=1}^N {xi,yi}i=1N,其中 y i ∈ { + 1 , − 1 } y_i \in \{+1, -1\} yi{+1,1},感知机模型为:
y = sign ( w T x ) y=\text{sign}(w^{\text{T}} x) y=sign(wTx)
其中,w为感知机模型参数,确定超平面;符号函数 sign ( z ) = { + 1 z ≥ 0 − 1 z < 0 \text {sign}(z)= \begin{cases} +1 & z \geq 0 \\ -1 & z < 0 \\ \end{cases} sign(z)={+11z0z<0
感知机模型可以用如下图表示。
在这里插入图片描述
感知机模型的超平面将正负样本点分为两类,即对所有的 y i = + 1 y_i=+1 yi=+1的样本 x i x_i xi,都有 w x i > 0 wx_i>0 wxi>0;对所有的 y i = − 1 y_i=-1 yi=1的样本 x i x_i xi,都有 w x i < 0 wx_i<0 wxi<0

在这里插入图片描述

5.2 感知机损失函数

假设训练数据集是线性可分的,为了找出一个能够将训练数据集正实例点和负实例点完全正确分开的超平面,即确定感知机模型参数w,需要确定一个学习策略,即定义(经验)损失函数,并将损失函数极小化。

损失函数的一个自然选择是误分类点的总数,但是这样的函数不是连续可导函数,不易优化。因此感知机采用的损失函数是误分类点到超平面的总距离。

假设直线方程为 A x + B y + C = 0 Ax + By + C = 0 Ax+By+C=0 ,点 P P P的坐标为 ( x 0 , y 0 ) ( x_0 , y_0 ) (x0,y0)。点到直线的距离公式为:
d = A x 0 + B y 0 + C A 2 + B 2 d=\frac{Ax_0 + By_0 + C}{\sqrt{A^2+B^2}} d=A2+B2 Ax0+By0+C
假设超平面是 w T x + b w^\text Tx+b wTx+b,则样本点 x ′ x^\prime x到超平面的距离是:
d = w T x ′ + b ∣ ∣ w ∣ ∣ d=\frac{w^\text T x^\prime +b}{||w||} d=∣∣w∣∣wTx+b

任意一个样本点 x i x_i xi到超平面 S S S的距离为:
∣ w T x i + b ∣ ∣ ∣ w ∣ ∣ \frac{|w^ \text T x_i+b|}{||w||} ∣∣w∣∣wTxi+b
对于误分类点 ( x i , y i ) (x_i,y_i) (xi,yi)
− y i ( w T x + b ) = ∣ w T x i + b ∣ > 0 -y_i(w^ \text T x+b) =|w^ \text T x_i+b| > 0 yi(wTx+b)=wTxi+b>0
因此,误分类点 x i x_i xi到超平面 S S S的距离为:
− 1 ∣ ∣ w ∣ ∣ y i ( w T x + b ) -\frac{1}{||w||}y_i(w^ \text T x+b) ∣∣w∣∣1yi(wTx+b)
假设误分类点集合为 M M M,那么所有误分类点到超平面 S S S的距离之和为:
− 1 ∣ ∣ w ∣ ∣ ∑ x i ∈ M y i ( w T x i + b ) -\frac{1}{||w||}\sum_{x_i \in M} y_i(w^\text T x_i+b) ∣∣w∣∣1xiMyi(wTxi+b)

不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} ∣∣w∣∣1,将 b b b吸收到 w w w里面,则损失函数为 L ( w ) = ∑ x i ∈ M − y i w T x i L(w)=\sum_{x_i \in M} -y_iw ^\text Tx_i L(w)=xiMyiwTxi

至此,感知机学习问题就转化为了求解损失函数的最优化问题。

5.3 感知机学习算法

感知器的学习算法是一种错误驱动(犯错时才更新参数,不犯错不更新)的在线学习算法(样本是流式的一个个过来的)。

由于感知机学习算法是误分类驱动的,这里基于随机梯度下降法(SGD)进行优化求解。即任意选取一个超平面 w 0 w_0 w0,然后用梯度下降法不断地极小化损失函数。极小化过程中不是一次使M MM中的所有误分类点的梯度下降,而是一次随机选取一个误分类点使其梯度下降。

这里不能使用基于所有样本的批量梯度下降(BGD)进行优化。这是因为我们的损失函数里面有限定,只有误分类的M MM集合里面的样本才能参与损失函数的优化。所以我们不能用最普通的批量梯度下降,只能采用随机梯度下降(SGD)或者小批量梯度下降(MBGD)。

损失函数 L ( w ) L(w) L(w)的梯度为:
∇ L ( w ) = − ∑ x i ∈ M y i x i \nabla L(w)=-\sum_{x_i \in M}y_ix_i L(w)=xiMyixi

随机选取一个误分类点 ( x i , y i ) (x_i,y_i) (xi,yi),对w进行更新:
w ← w + α y i x i w \leftarrow w+\alpha y_ix_i ww+αyixi

六、感知机原始形式、对偶形式算法描述

6.1 原始形式

输入:训练集 { x i , y i } i = 1 N \{x_i,y_i\}_{i=1}^N {xi,yi}i=1N,学习率 α ∈ ( 0 , 1 ) \alpha \in (0,1) α(0,1)
输出:参数w,感知机模型 f ( x ) = sign ( w T x ) f(x)=\text{sign}(w^ \text{T}x) f(x)=sign(wTx)
步骤:

  1. 随机选取初值 w 0 w_0 w0
  2. 在训练数据集中选取数据 ( x i , y i ) (x_i,y_i) (xi,yi)
  3. 判断该数据点是否为当前模型的误分类点,即 y i w T x i ≤ 0 y_iw^\text{T}x_i \leq 0 yiwTxi0,如果是误分类点则进行更新: w ← w + α y i x i w \leftarrow w+\alpha y_ix_i ww+αyixi
  4. 转到第(2)步,直到训练集中没有误分类点。

【注】感知机学习算法由于采用不同的初值或选取不同的误分类点,解可以不同。

6.2 对偶形式

前面介绍了感知机算法的原始形式,下面要介绍的对偶形式是对算法执行速度的优化

6.3 原始形式和对偶形式的选择

  • 如果特征数过高,计算内积非常耗时,应选择对偶形式算法加速。
  • 如果样本数过多,每次计算累计和就没有必要,应选择原始算法。

参考:

  • https://blog.csdn.net/pxhdky/article/details/86360535

相关文章:

从感知机到神经网络

感知机 一、感知机是什么二、用感知机搭建简单逻辑电路2.1 与门2.2 与非门2.3 或门 三、感知机的局限性3.1 异或门3.2 线性和非线性 四、多层感知机4.1 已有门电路的组合4.2 Python异或门的实现 五、感知机模型5.1 感知机模型5.2 感知机损失函数5.3 感知机学习算法 六、感知机原…...

【HMGD】STM32/GD32 I2C DMA 主从通信

STM32 I2C配置 主机配置 主机只要配置速度就行 从机配置 从机配置相同速度&#xff0c;可以设置第二地址 因为我的板子上面已经有了上拉电阻&#xff0c;所以可以直接通信 STM32 I2C DMA 定长主从通信代码示例 int state 0; static uint8_t I2C_recvBuf[10] {0}; stat…...

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度

leecode 226 翻转二叉树、101 对称二叉树、104 二叉树的最大深度 leecode 226 翻转二叉树 题目链接 &#xff1a;https://leetcode.cn/problems/invert-binary-tree/description/ 题目 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。…...

Redux基础

简介 状态管理工具&#xff0c;集中式管理react、vue、angular等应用中多个组件的状态&#xff0c;是一个库,使用之后可以清晰的知道应用里发生了什么以及数据是如何修改&#xff0c;如何更新的 在项目中添加 Redux 并不是必须的,根据项目需求选择是否引入 Redux 三个原则 …...

国外目标公司的任何一个联系人也许都有意义

我们说跟进一个项目&#xff0c;最好能够联系上拥有决策权的人&#xff0c;不然中间隔着几重关系&#xff0c;所有的更新都需要层层审批申报&#xff0c;特别麻烦&#xff0c;总是要等&#xff0c;也许等到最后就是一场空。如果能够直接和老板或者是拍板的人沟通&#xff0c;则…...

因为本地证书太旧或不全导致的 HTTPS 访问失败问题20240520

因为本地证书太旧或不全导致的 HTTPS 访问失败问题 在生产环境中&#xff0c;我们经常需要使用 curl 命令来测试和调试 HTTPS URL。然而&#xff0c;最近我遇到了一个棘手的问题&#xff1a;在测试环境中使用 curl 可以正常访问某个 URL&#xff0c;但在生产环境中却遇到了 SS…...

Lua获取表的长度

1.代码 -- 创建一个表并添加一些元素 local myTable {10, 20, 30, 40}-- 打印表的长度 print(#myTable) -- 输出 4&#xff0c;因为表中有 4 个元素-- 使用 # 来遍历表中的所有元素 for i 1, #myTable doprint(myTable[i]) end -- 这将依次打印 10, 20, 30, 40...

python九九乘法表的打印思考及实现

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、问题引入 九九乘法表的显示需求 二、问题分析 嵌套循环的概念 屏幕宽度与换行的考虑…...

2.Spring中用到的设计模式

Spring框架中使用了多种设计模式来构建其强大且灵活的功能&#xff0c;这里举例说明Spring中的一些功能使用到的设计模式。 工厂模式&#xff1a;Spring容器本质是一个大工厂&#xff0c;使用工厂模式通过BeanFactory和ApplicationContext这两个核心接口来创建和管理bean对象。…...

.NET调用阿里云人脸核身服务端 (ExecuteServerSideVerification)简易流程保姆级教学

需要注意的是&#xff0c;以下内容仅限基础调用 功能说明 该功能是输入核验人的姓名和身份证以及人脸照片&#xff0c;去阿里库里面匹配&#xff0c;3个信息是否一致&#xff0c;一致则验证通过&#xff0c;需要注意的是&#xff0c;人脸有遮挡&#xff0c;或者刘海&#xff0…...

[大师C语言(第十二篇)]C语言堆排序技术详解

引言 堆排序&#xff08;Heap Sort&#xff09;是一种基于比较的排序算法&#xff0c;它利用堆这种数据结构的特点来进行排序。堆是一种近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子节点的键值或索引总是小于&#xff08;或者大于&#xff09;它的父…...

Activity启动流程要点

一、Activity启动流程 Activity的启动流程一般是通过调用startActivity或者是startActivityForResult来开始的startActivity内部也是通过调用startActivityForResult来启动Activity&#xff0c;只不过传递的requestCode小于0Activity的启动流程涉及到多个进程之间的通讯这里主…...

lua 计算第几周

需求 计算当前赛季的开始和结束日期&#xff0c;2024年1月1日周一是第1周的开始&#xff0c;每两周是一个赛季。 lua代码 没有处理时区问题 local const 24 * 60 * 60 --一整天的时间戳 local server_time 1716595200--todo:修改服务器时间 local date os.date("*t…...

负载均衡策略

...

海外网红营销新趋势:“快闪式”营销如何迅速提升品牌曝光度

在当今数字化时代&#xff0c;海外网红营销已成为品牌迅速触达全球消费者、提升品牌曝光度和刺激销售的重要手段。其中&#xff0c;“快闪式”营销以其独特的时效性、创意性和互动性&#xff0c;成为品牌与海外网红合作的新趋势。本文Nox聚星将和大家探讨如何利用海外网红的影响…...

速看!打造专属数字化能力模型的七大关键!

在数字化浪潮中&#xff0c;企业如何打造适应自身发展的数字化能力模型&#xff1f;这是许多企业面临的重要课题。今天&#xff0c;通过众多企业使用蚓链数字化生态解决方案实践总结&#xff0c;为大家分享至关重要的七大经验&#xff0c;助你开启数字化转型之旅&#xff01; 1…...

青蛙跳台阶问题

本期介绍&#x1f356; 主要介绍&#xff1a;青蛙跳台阶问题&#xff0c;青蛙跳台阶与斐波那契数列的关系&#x1f440;。 文章目录 1. 题目2. 递归解题思路3. 迭代解题思路 1. 题目 从前有一只青蛙他想跳台阶&#xff0c;有n级台阶&#xff0c;青蛙一次可以跳1级台阶&#xff…...

linux日常运维2

下载linux离线安装包---- 利用 Downloadonly 插件下载 RPM 软件包及其所有依赖包 1. 先找个可以上网的linux操作系统&#xff0c;这里是以centos7操作系统为例&#xff0c;如果要使用centos6就先安装一个centos6的系统&#xff0c;然后让他可以上网&#xff0c;后面步骤如下 a.…...

flink cdc mysql整理与总结

文章目录 一、业务中常见的需要数据同步的场景CDC是什么FlinkCDC是什么CDC原理为什么是FlinkCDC业务场景flink cdc对应flink的版本 二、模拟案例1.阿里云flink sql2.开源flink sql(单机模式)flink 安装安装mysql3.flink datastream 三、总结 提示&#xff1a;以下是本篇文章正文…...

【三维重建】ePnP

PnP问题应用与一下场景&#xff1a; 已知三维点和对应二维点以及相机相机内参数&#xff0c;可以获取相机外参。 我们介绍其中的一种算法&#xff1a;ePnP 算法流程 1、ePnP算法首先在世界坐标系内寻找4个控制点&#xff0c;记作 C 1 w , C 2 w , C 3 w , C 4 w C_1^w,C_2^w,…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...