✨机器学习笔记(四)—— 逻辑回归、决策边界、过拟合、正则化

news2024/11/16 22:35:44
Course1-Week3:
https://github.com/kaieye/2022-Machine-Learning-Specialization/tree/main/Supervised%20Machine%20Learning%20Regression%20and%20Classification/week3

机器学习笔记(四)

  • 1️⃣逻辑回归(logistic regression)
    • 🎗️代价函数
    • 🎗️梯度下降
  • 2️⃣决策边界(decision boundary)
  • 3️⃣过拟合(overfit)
  • 4️⃣正则化(regularization)
    • 🎗️线性回归的正则方法
    • 🎗️逻辑回归的正则方法

1️⃣逻辑回归(logistic regression)

🎈分类问题作为有监督学习的一种,在它能根据输入的特征 x \bm{x} x (特征向量),来从有限的分类中预测出属于哪个分类,例如:将电子邮件识别为垃圾邮件还是非垃圾邮件或确定肿瘤为恶性还是良性等这些问题,这两个问题都只有两种结果,可以是二分类问题,如果有多种结果则为多分类问题。
在这里插入图片描述

🎈如下是根据肿瘤的大小去进行肿瘤类型的分类(1表示为恶性,0表示为良性),对于这种情景可以看出,用线性回归去拟合图像不是个很好的选择。
在这里插入图片描述

😞类似这种情况使用线性回归来拟合看上去是有点糟糕,拟合的很不合适,而且对于分类问题,它受数据的影响太大了,导致它拟合的效果会更差。

在这里插入图片描述

😃而逻辑回归就排上用场了,它是通过构造出一个 s i g m o i d sigmoid sigmoid 函数,来形成这样的曲线,可以很好的拟合分类问题。
s i g m o i d : g ( z ) = 1 1 + e − z , 0 < g ( z ) < 1 sigmoid: g(z)=\frac 1 {1+e^{-z}}, 0<g(z)<1 sigmoid:g(z)=1+ez1,0<g(z)<1
在这里插入图片描述

✨逻辑回归模型的构造过程:通过 s i g m o i d sigmoid sigmoid 函数将线性转为非线性,将值域映射到了 0~1 之间,用于分类问题。本质就是找一个更拟合数据情况的函数去套用(线性回归就是这么找出来的)。
f w ⃗ , b ( x ⃗ ) = g ( z ) = g ( w ⃗ ⋅ x ⃗ + b ) = 1 1 + e − ( w ⃗ ⋅ x ⃗ + b ) f_{\vec w,b}(\vec x)=g(z)=g({\vec w} \cdot {\vec x+b})= \frac 1 {1+e^{-(\vec w \cdot \vec x+b)}} fw ,b(x )=g(z)=g(w x +b)=1+e(w x +b)1

在这里插入图片描述

对于逻辑回归输出可以把它视做概率, f w ⃗ , b ( x ⃗ ) = 0.7 f_{\vec w,b}(\vec x)=0.7 fw ,b(x )=0.7 时可以认为对于特征 x \bm x x 预测出的肿瘤为恶性的可能为70%,逻辑回归的输出值越大,肿瘤为恶性的可能性就越大。

在这里插入图片描述

对于一组分类数据,可以看出逻辑回归的拟合效果是不错的。
在这里插入图片描述


🎗️代价函数

🎈代价函数的定义, L L L 为损失函数(Loss function):

J ( w , b ) = 1 m ∑ i = 1 m L ( f w ⃗ , b ( x ⃗ ( i ) ) , y ( i ) ) J(w,b)=\frac 1 {m} \sum_{i=1}^{m}L(f_{\vec w,b}(\vec x^{(i)}),y^{(i)}) J(w,b)=m1i=1mL(fw ,b(x (i)),y(i))

在线性回归中我们使用了平方误差成本作为损失函数,其代价函数 J ( w ⃗ , b ) J(\vec w,b) J(w ,b) 图像为一个下凸的形状,可以通过梯度下降收敛到一个非常好的参数。

在这里插入图片描述

🎈squared error cost function:

J ( w , b ) = 1 2 m ∑ i = 0 m − 1 ( f w , b ( x ( i ) ) − y ( i ) ) 2 J(w,b)=\frac 1 {2m} \sum_{i=0}^{m-1}(f_{ w,b}(x^{(i)})-y^{(i)})^2 J(w,b)=2m1i=0m1(fw,b(x(i))y(i))2

在线性回归中: f w , b ( x ( i ) ) = w x ( i ) + b 在线性回归中:f_{ w,b}(x^{(i)})=wx^{(i)}+b 在线性回归中:fw,b(x(i))=wx(i)+b

而对于逻辑回归来说直接使用平方误差代价函数,会导致 J ( w ⃗ , b ) J(\vec w,b) J(w ,b) 有多个局部最小值,使用梯度下降很难找到一个好的参数。

在这里插入图片描述

在这里插入图片描述

✨首先直接给出逻辑回归的代价函数定义,再分析:

J ( w ⃗ , b ) = 1 m ∑ i = 1 m L ( f w ⃗ , b ( x ⃗ ( i ) ) , y ( i ) ) = { − l o g ( f w ⃗ , b ( x ⃗ ( i ) ) ) if  y ( i ) = 1 − l o g ( 1 − f w ⃗ , b ( x ⃗ ( i ) ) ) if  y ( i ) = 0 J(\vec w,b)=\frac 1 m \sum_{i=1}^mL(f_{\vec w,b}(\vec x^{(i)}),y^{(i)})= \begin{cases}-log(f_{\vec w,b}(\vec x^{(i)})) & \text{if } y^{(i)} = 1 \\ -log(1-f_{\vec w,b}(\vec x^{(i)})) & \text{if } y^{(i)} = 0 \end{cases} J(w ,b)=m1i=1mL(fw ,b(x (i)),y(i))={log(fw ,b(x (i)))log(1fw ,b(x (i)))if y(i)=1if y(i)=0

在逻辑回归中: f w , b ( x ( i ) ) = 1 1 + e − ( w ⃗ ⋅ x ⃗ + b ) 在逻辑回归中:f_{ w,b}(x^{(i)})= \frac 1 {1+e^{-(\vec w \cdot \vec x+b)}} 在逻辑回归中:fw,b(x(i))=1+e(w x +b)1

🎈先从损失函数 L ( y ^ ( i ) , y ( i ) ) L(\hat y^{(i)},y^{(i)}) L(y^(i),y(i)) 入手,由于逻辑回归其函数在平方误差损失函数中不凸,我们将其映射到一个凸的 l o g log log 函数中,有以下定义和图像性质:

这种函数可以很好的达到我们想要的效果,当 y ( i ) = 1 y^{(i)}=1 y(i)=1 时,逻辑回归函数的值越接近 1 时,有着越接近于 0 的代价;而逻辑回归函数的值越接近于 0 时,有着接近 ∞ \infty 的代价,例如将一个恶性肿瘤预测为良性,其代价是巨大的,这样的代价还能很好的去惩罚模型,让机器不要出现这种预测。

在这里插入图片描述

y ( i ) = 0 y^{(i)}=0 y(i)=0 时,该损失函数亦然达到我们想要的效果。

在这里插入图片描述

在这里插入图片描述

我们可以看出这种函数是行得通的,所以对于逻辑回归问题的代价函数为:

在这里插入图片描述

✨其图像非常适合梯度下降,它没有平台、局部最小值或不连续性。

在这里插入图片描述

🤓我们其实还可以进一步简化逻辑回归的成本函数,因为 y y y 并不能取 0 或 1 外的任何值,可以先简写它的损失函数:

L ( f w ⃗ , b ( x ⃗ ( i ) ) , y ( i ) ) = − y ( i ) l o g ( f w ⃗ , b ( x ⃗ ( i ) ) ) − ( 1 − y ( i ) ) l o g ( 1 − f w ⃗ . b ( x ⃗ ( i ) ) ) L(f_{\vec w,b}(\vec x^{(i)}),y^{(i)})=-y^{(i)}log(f_{\vec w,b}(\vec x^{(i)}))-(1-y^{(i)})log(1-f_{\vec w.b}(\vec x^{(i)})) L(fw ,b(x (i)),y(i))=y(i)log(fw ,b(x (i)))(1y(i))log(1fw .b(x (i)))

看起来是个很复杂的形式,但是当只能考虑 y ( i ) y^{(i)} y(i) 等于 0 或 1 的情况下时,该方程就变会了原来的两段式。

✨简化后的代价函数为:

J ( w ⃗ , b ) = 1 m ∑ i = 1 m [ L ( f w ⃗ , b ( x ⃗ ( i ) ) , y ( i ) ) ] = − 1 m ∑ i = 1 m [ y ( i ) l o g ( f w ⃗ , b ( x ⃗ ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − f w ⃗ . b ( x ⃗ ( i ) ) ) ] \begin{align*} J(\vec w,b)&=\frac 1 m \sum_{i=1}^{m}[L(f_{\vec w,b}(\vec x^{(i)}),y^{(i)})] \\ &=-\frac 1 m \sum_{i=1}^{m}[y^{(i)}log(f_{\vec w,b}(\vec x^{(i)}))+(1-y^{(i)})log(1-f_{\vec w.b}(\vec x^{(i)}))] \end{align*} J(w ,b)=m1i=1m[L(fw ,b(x (i)),y(i))]=m1i=1m[y(i)log(fw ,b(x (i)))+(1y(i))log(1fw .b(x (i)))]


🎗️梯度下降

前面学过了梯度下降法的公式,而逻辑回归的梯度下降同理,只是其成本函数 J J J 有所不同了,将其代入即可。

在这里插入图片描述
🧐可以看到求出来的偏导数和线性回归求出来的长相一样,但是其实函数 f f f 的定义已经改变了,在线性回归中, f w , b ( x ( i ) ) = w x ( i ) + b f_{ w,b}(x^{(i)})=wx^{(i)}+b fw,b(x(i))=wx(i)+b,而在逻辑回归中 f w , b ( x ( i ) ) = 1 1 + e − ( w ⃗ ⋅ x ⃗ + b ) f_{ w,b}(x^{(i)})= \frac 1 {1+e^{-(\vec w \cdot \vec x+b)}} fw,b(x(i))=1+e(w x +b)1,两者并不是一个东西,请注意这一点。

🌹再来直观感受一下逻辑回归的梯度下降过程:

在这里插入图片描述

代码上可以通过 sklearn.linear_model.LogisticRegression 导入逻辑回归模型去拟合数据。

from sklearn.linear_model import LogisticRegression

lr_model = LogisticRegression()
lr_model.fit(X, y)

2️⃣决策边界(decision boundary)

🎈由于逻辑回归模型 f w ⃗ , b ( x ⃗ ) f_{\vec w,b}(\vec x) fw ,b(x ) 输出的是 ( 0 , 1 ) (0,1) (0,1) 连续的值,而预测值 y ^ \hat y y^ 为 0 或 1,由可以结合对模型输出概率上的理解,去定义一个阈值,当 f w ⃗ , b ( x ⃗ ) ≥ 阈值, y ^ = 1 f_{\vec w,b}(\vec x) \geq 阈值,\hat y=1 fw ,b(x )阈值,y^=1;当 f w ⃗ , b ( x ⃗ ) < 阈值, y ^ = 0 f_{\vec w,b}(\vec x) < 阈值,\hat y=0 fw ,b(x )<阈值,y^=0。 若设定阈值为 0.5 0.5 0.5,当 f w ⃗ , b ( x ⃗ ) ≥ 0.5 f_{\vec w,b}(\vec x) \ge 0.5 fw ,b(x )0.5 时,即 w ⃗ ⋅ x ⃗ + b ≥ 0 \vec w \cdot \vec x+b \ge 0 w x +b0,有 y ^ = 1 \hat y=1 y^=1;当 f w ⃗ , b ( x ⃗ ) < 0.5 f_{\vec w,b}(\vec x) < 0.5 fw ,b(x )<0.5 时,即 w ⃗ ⋅ x ⃗ + b < 0 \vec w \cdot \vec x+b<0 w x +b<0 时,有 y ^ = 0 \hat y=0 y^=0

在这里插入图片描述
此定义又让我们专注于 w ⃗ ⋅ x ⃗ + b \vec w \cdot \vec x+b w x +b 上来, 而此时 w ⃗ ⋅ x ⃗ + b = 0 \vec w \cdot \vec x+b=0 w x +b=0 即为决策边界

🎈linear decision boundary:

在这里插入图片描述

🎈Non-linear decision boundaries:

在这里插入图片描述

3️⃣过拟合(overfit)

🎈对于回归问题,如下有三图,🌹可以看到左图用一个线性函数去拟合数据,但是表现的并不怎么好,因为对于数据集来说,明显可以看出 s i z e size size 越大, p r i c e price price 增加的速度越慢,图像应该越平缓,所以左图这种情况被称为欠拟合(underfit)高偏差(high bias);🌹中间的函数图像很好的拟合了数据集,而且具有通用性,因为我们可以想到对于一个新数据它应该也能做出一个合适的预测,即具有泛化性(generalization);🌹而在右图中,该曲线完美的经过了每个数据集,甚至损失为 0,但它只是为了数据集而生的,脱离了数据集毫无作用,可以看到图中对于一个相对较大的 s i z e size size 居然给出了更小的 p r i c e price price ,所以它不具有通用性,不能对新数据进行预测(这将毫无意义),这种情况则成为过拟合(overfit)高方差(high variance)

在这里插入图片描述

🎈在分类问题中,同样会有这种问题。

在这里插入图片描述


✨为了避免过拟合这种情况,有以下的解决方法:

① 添加足够多的数据,让图像具有泛化性。

在这里插入图片描述

② 特征选择,过拟合的一个原因就是特征选择的太多,导致函数成为一个复杂的多项式,我们可以进行特征的选择,只选择其中与 y y y 值最相关的特征,可以有效地解决一些过拟合问题。

在这里插入图片描述

③ 正则化(Regularization)

正则化是通过减小参数 w j w_j wj 来减轻特征对函数值的影响来防止过拟合,相较于 ② 它并不直接消除特征,还是采取更温和的方式去调整。

在这里插入图片描述

4️⃣正则化(regularization)

🎈正则化是机器学习中的一种技术,主要用于减少模型的复杂度,防止过拟合,提高模型的泛化能力,还可以通过正则化来惩罚模型的参数,使得模型变得更简单。正则化就是说给代价函数加上一些限制(正则化项),通过这种限制去规范他们再接下来的循环迭代中,不要自我膨胀。

先改写一下代价函数,给它加上后面两项 1000 w 3 2 1000w_3^2 1000w32 1000 w 4 2 1000w_4^2 1000w42 ,这时如果想要最小化代价函数,由于后面两项过大的影响,需要让 w 3 w_3 w3 w 4 w_4 w4 非常小,这样又变相惩罚的函数 f f f 的参数 w 3 , w 4 w_3,w_4 w3,w4 ,使得高次数的项影响变小,这样变相让函数缓解了过拟合问题。

在这里插入图片描述

🧐顺着这个思路,假设我们不知道各个特征的影响程度,就想让机器自己去惩罚对应的特征项系数 w j w_j wj 去解决过拟合问题,这就是正则化。我们给代价函数加入一个正则化项,里面有所有的 w j w_j wj,由于为了最小化代价,机器会惩罚所有的 w j w_j wj

✨正则化项为: λ 2 m ∑ j = 1 m w j 2   ,   λ 为正则化参数 \frac \lambda {2m} \sum_{j=1}^m w_j^2 \,, \, \lambda 为正则化参数 2mλj=1mwj2,λ为正则化参数

在这里插入图片描述

🤓对于正则化参数 λ \lambda λ,它的选择可以是为了实现损失函数和保持小的 w j w_j wj 这两者的平衡。一个过小的正则化参数 λ \lambda λ 会让正则化参数形同虚设,没法解决过拟合问题;而一个过大的正则化参数 λ \lambda λ 会让 w j w_j wj 被惩罚的过于小,导致欠拟合,所以需要选择一个好的 λ \lambda λ 避免出现这两种情况。

在这里插入图片描述

🎗️线性回归的正则方法

线性回归使用了正则化的代价函数和梯度下降如下:

在这里插入图片描述

如图,当学习率 α = 0.01 \alpha=0.01 α=0.01 ,正则化参数 λ = 1 \lambda=1 λ=1,而样本数量 m = 50 m=50 m=50 时可以看到我们将 w j w_j wj 缩小为了 0.9998 w j 0.9998w_j 0.9998wj,这就是正则化的惩罚作用,比起正则化之前直接在 w j w_j wj 上的梯度下降来说,我们的惩罚使得 w j w_j wj 变得更小。

在这里插入图片描述

def compute_cost_linear_reg(X, y, w, b, lambda_ = 1):
    """
    Computes the cost over all examples
    Args:
      X (ndarray (m,n): Data, m examples with n features
      y (ndarray (m,)): target values
      w (ndarray (n,)): model parameters  
      b (scalar)      : model parameter
      lambda_ (scalar): Controls amount of regularization
    Returns:
      total_cost (scalar):  cost 
    """

    m  = X.shape[0]
    n  = len(w)
    cost = 0.
    for i in range(m):
        f_wb_i = np.dot(X[i], w) + b                                   #(n,)(n,)=scalar, see np.dot
        cost = cost + (f_wb_i - y[i])**2                               #scalar             
    cost = cost / (2 * m)                                              #scalar  
 
    reg_cost = 0
    for j in range(n):
        reg_cost += (w[j]**2)                                          #scalar
    reg_cost = (lambda_/(2*m)) * reg_cost                              #scalar
    
    total_cost = cost + reg_cost                                       #scalar
    return total_cost         

🎗️逻辑回归的正则方法

在逻辑回归中,我们也可以使用正则化方法:

在这里插入图片描述

def compute_cost_logistic_reg(X, y, w, b, lambda_ = 1):
    """
    Computes the cost over all examples
    Args:
    Args:
      X (ndarray (m,n): Data, m examples with n features
      y (ndarray (m,)): target values
      w (ndarray (n,)): model parameters  
      b (scalar)      : model parameter
      lambda_ (scalar): Controls amount of regularization
    Returns:
      total_cost (scalar):  cost 
    """

    m,n  = X.shape
    cost = 0.
    for i in range(m):
        z_i = np.dot(X[i], w) + b                                      #(n,)(n,)=scalar, see np.dot
        f_wb_i = sigmoid(z_i)                                          #scalar
        cost +=  -y[i]*np.log(f_wb_i) - (1-y[i])*np.log(1-f_wb_i)      #scalar
             
    cost = cost/m                                                      #scalar

    reg_cost = 0
    for j in range(n):
        reg_cost += (w[j]**2)                                          #scalar
    reg_cost = (lambda_/(2*m)) * reg_cost                              #scalar
    
    total_cost = cost + reg_cost                                       #scalar
    return total_cost                                                  #scalar

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

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

相关文章

[数据集][目标检测]疟疾恶性疟原虫物种目标检测数据集VOC+YOLO格式948张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;948 标注数量(xml文件个数)&#xff1a;948 标注数量(txt文件个数)&#xff1a;948 标注类别…

数据处理工具(geodataprocess)之哨兵1预处理

在使用 Sentinel-1 数据进行遥感应用时&#xff0c;数据预处理是一个关键步骤&#xff0c;目的是提高数据的质量&#xff0c;消除或减少系统和环境引入的误差&#xff0c;使其更适合后续分析。Sentinel-1 是欧洲空间局&#xff08;ESA&#xff09;的合成孔径雷达&#xff08;SA…

数字高程模型DEM详细应用分析

DEM在各个领域都有广泛应用&#xff0c;它不仅仅是一张“高程地图”&#xff0c;更是地理分析、模拟和预测的重要工具。 一、地形分析 在地形分析中&#xff0c;DEM是不可或缺的工具. 1 坡度分析&#xff08;Slope Analysis&#xff09; 定义&#xff1a;坡度是指地形表面的…

OpenSSH Server 远程代码执行漏洞(CVE-2024-6387)(附代码)

OpenSSH Server 远程代码执行漏洞&#xff08;CVE-2024-6387&#xff09;&#xff08;附代码&#xff09; 前言影响范围验证脚本1.python2.C? 参考链接 前言 2024年7月1日&#xff0c;OpenSSH 官方发布安全通告&#xff0c;披露CVE-2024-6387 OpenSSH Server 远程代码执行漏洞…

Python画笔案例-049 绘制笑脸

1、绘制笑脸 通过 python 的turtle 库绘制 笑脸&#xff0c;如下图&#xff1a; 2、实现代码 绘制 笑脸&#xff0c;以下为实现代码&#xff1a; """笑脸.py """ import turtledef draw_circle(pos,radius):"""以pos为中心点画圆…

加拿大发布的认知战思想与力量发展

文章目录 前言一、心理作战、影响力与欺骗战术1.1 孙子兵法中的认知战思想1.2 虚假信息轰炸1.3 人脑领域的持久胜利二、加拿大及其盟友面临的认知战威胁三、俄罗斯实施的认知战3.1 利用虚假信息加剧社会两级分化并刺激个别激进群体3.2 新一代的虚假信息行动有可能造成严重的认知…

redis基本数据结构-set

文章目录 1. set的基本介绍1.1. set底层结构之hash表的简单介绍1.2. 常用命令 2. 常见的业务场景2.1. 标签系统2.2. 社交网络好友关系 1. set的基本介绍 参考链接&#xff1a;https://mp.weixin.qq.com/s/srkd73bS2n3mjIADLVg72A redis 的 set 数据结构是一个无序的集合&#…

【JavaScript】数据结构之字典 哈希表

字典 键值对存储的&#xff0c;类似于js的对象&#xff0c;但在js对象中键[key]都是字符串类型或者会转换成字符串类型&#xff0c;因此后声明的键值会覆盖之前声明的值。字典以map表示&#xff0c;map的键不会转换类型。 let map new Map() map.set(a, 1) map.set(b, 2) ma…

智能门锁为何选择ESP32-S3芯片?低功耗高性能方案,启明云端乐鑫代理商

在科技日新月异的今天&#xff0c;家庭安全不再仅仅依赖于传统的锁和钥匙。智能门锁&#xff0c;作为智能家居系统的前沿产品&#xff0c;正逐渐走进千家万户&#xff0c;成为家庭安全的高科技守护者。 智能门锁是一种利用现代科技手段&#xff0c;通过电子化、信息化技术改进…

Linux.之设备树DTS(device tree source)(一)

一、概述 Device Tree是一种描述硬件的数据结构&#xff0c;相比于旧架构它起源于 OpenFirmware (OF),在过去的ARM Linux中&#xff0c;arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的冗余代码&#xff0c;相当多数的代码只是在描述板级硬件细节&#xff0c;而这些不同的…

【二十】【QT开发应用】listwidget右键菜单和删除item

创建项目&#xff0c;添加资源文件 在项目文件夹中创建resources资源文件夹。 在vs中打开qrc文件&#xff0c;选择添加资源文件。 选择我们resources资源文件中的所有文件作为资源文件。 最后不要忘记点击保存。 向ListWidget控件添加item 右键菜单 在.h文件中添加QMenu头…

代码随想录算法训练营第五十九天 | Bellman_ford 算法精讲

目录 Bellman_ford 算法精讲 思路 什么叫做松弛 模拟过程 方法一&#xff1a; Bellman_ford算法 Bellman_ford 算法精讲 题目链接&#xff1a;卡码网&#xff1a;94. 城市间货物运输 I 文章讲解&#xff1a;代码随想录 某国为促进城市间经济交流&#xff0c;决定对货物运…

maya-vray渲染蒙版

要用一个叫vrayMulWrapper的材质球&#xff0c;把alpha Conterbution调到-1&#xff0c;勾选matte surface启用蒙版物体。

【C++题解】1406. 石头剪刀布?

欢迎关注本专栏《C从零基础到信奥赛入门级&#xff08;CSP-J&#xff09;》 问题&#xff1a;1406. 石头剪刀布&#xff1f; 类型&#xff1a;二维数组 题目描述&#xff1a; 石头剪刀布是常见的猜拳游戏。石头胜剪刀&#xff0c;剪刀胜布&#xff0c;布胜石头。如果两个人出…

数据库索引底层数据结构之B+树MySQL中的页索引分类【纯理论干货,面试必备】

目录 1、索引简介 1.1 什么是索引 1.2 使用索引的原因 2、索引中数据结构的设计 —— B树 2.1 哈希 2.2 二叉搜索树 2.3 B树 2.4 最终选择之——B树 2.4.1 B树与B树的对比(面向索引)【面试题】 3、MySQL中的页 3.1 页的使用原因 3.2 页的结构 3.2.1 页文件头和页文件…

Unity实战案例全解析:PVZ 植物卡片状态分析

Siki学院2023的PVZ免费了&#xff0c;学一下也坏 卡片状态 卡片可以有三种状态&#xff1a; 1.阳光足够&#xff0c;&#xff08;且cd好了可以种植&#xff09; 2.阳光不够&#xff0c;&#xff08;cd&#xff1f;好了&#xff1a;没好 &#xff08;三目运算符&#xff09;&…

Linux | 探索 Linux 信号机制:信号的产生和自定义捕捉

信号是 Linux 操作系统中非常重要的进程控制机制&#xff0c;用来异步通知进程发生某种事件。理解信号的产生、阻塞、递达、捕捉等概念&#xff0c;可以帮助开发者更好地编写健壮的应用程序&#xff0c;避免由于未处理的信号导致程序异常退出。本文将带你从基础概念开始&#x…

基于SpringBoot+Vue的牙科就诊管理系统(带1w+文档)

基于SpringBootVue的牙科就诊管理系统(带1w文档) 基于SpringBootVue的牙科就诊管理系统(带1w文档) 伴随着互联网发展&#xff0c;现今信息类型愈来愈多&#xff0c;信息量也非常大&#xff0c;那也是信息时代的缩影。近些年&#xff0c;电子元器件信息科学合理发展的趋势变的越…

【React】React18.2.0核心源码解读

前言 本文使用 React18.2.0 的源码&#xff0c;如果想回退到某一版本执行git checkout tags/v18.2.0即可。如果打开源码发现js文件报ts类型错误请看本人另一篇文章&#xff1a;VsCode查看React源码全是类型报错如何解决。 阅读源码的过程&#xff1a; 下载源码 观察 package…

C# System.BadImageFormatException问题及解决

C# System.BadImageFormatException问题 出现System.BadImageFormatException 异常有两种情况&#xff1a;程序目标平台不一致&引用dll文件的系统平台不一致。 异常参考 BadImageFormatException 程序目标平台不一致&#xff1a; 项目>属性>生成&#xff1a;x86 …