深入学习从入门到放弃:掌握梯度概念,开始征服深度学习!

news2024/11/26 4:32:07

文章目录

      • 从现实中的例子理解什么是梯度
      • 梯度的数学定义
        • 梯度的严格的数学定义
        • 为什么梯度向量指向函数增长最快的方向?
      • 为什么梯度是深度学习优化的最基础概念
      • 在python中实现梯度求导的简单案例
        • 一元线性回归
        • 多元线性回归
      • 结合示例深度学习中的梯度求导的一般过程
        • 数学原理推导
        • 对应到代码中的梯度计算
      • 个人公众号

从现实中的例子理解什么是梯度

想象你在一座被浓雾笼罩的山上,想找到山谷的最低点。但由于能见度低,你无法看到全貌,只能感觉到脚下的坡度。这种坡度感告诉你哪个方向是向下的,哪边更陡峭。这个“坡度”就是梯度的直观表现,它指示了函数在当前点变化最快的方向和速率。此时,真想吟诗一首:

雾锁高山觅谷深,
脚踏迷途辨缓峻。
坡度指引下山路,
梯度犹似暗中灯。

梯度的数学定义

梯度的严格的数学定义

在多元微积分中,梯度(Gradient)是标量函数在某一点的方向导数取得最大值的方向。具体来说,对于一个实值的可微函数 f ( x 1 , x 2 , . . . , x n ) f(x_1, x_2, ..., x_n) f(x1,x2,...,xn),其梯度是由函数对各个变量的偏导数组成的向量:
∇ f = ( ∂ f ∂ x 1 , ∂ f ∂ x 2 , . . . , ∂ f ∂ x n ) \nabla f = \left( \frac{\partial f}{\partial x_1}, \frac{\partial f}{\partial x_2}, ..., \frac{\partial f}{\partial x_n} \right) f=(x1f,x2f,...,xnf)

为什么梯度向量指向函数增长最快的方向?

首先,我们需要引入方向导数的概念。方向导数描述了函数在某个特定方向上的变化率。对于单位向量 u \mathbf{u} u,函数 f f f在点 x \mathbf{x} x沿方向 u \mathbf{u} u的方向导数定义为:

D u f ( x ) = ∇ f ( x ) ⋅ u = ∥ ∇ f ( x ) ∥ ⋅ ∥ u ∥ cos ⁡ θ = ∥ ∇ f ( x ) ∥ cos ⁡ θ D_{\mathbf{u}} f(\mathbf{x}) = \nabla f(\mathbf{x}) \cdot \mathbf{u} = \| \nabla f(\mathbf{x}) \| \cdot \| \mathbf{u} \| \cos \theta = \| \nabla f(\mathbf{x}) \| \cos \theta Duf(x)=f(x)u=∥∇f(x)ucosθ=∥∇f(x)cosθ

其中, θ \theta θ ∇ f ( x ) \nabla f(\mathbf{x}) f(x) u \mathbf{u} u之间的夹角, ∥ ⋅ ∥ \| \cdot \| 表示向量的模。

从上式可以看出,方向导数 D u f ( x ) D_{\mathbf{u}} f(\mathbf{x}) Duf(x)的值取决于 cos ⁡ θ \cos \theta cosθ。当 θ = 0 \theta = 0 θ=0时, cos ⁡ θ \cos \theta cosθ取得最大值1,此时方向导数也达到最大值,即:

D u f ( x ) max = ∥ ∇ f ( x ) ∥ D_{\mathbf{u}} f(\mathbf{x})_{\text{max}} = \| \nabla f(\mathbf{x}) \| Duf(x)max=∥∇f(x)

这意味着,函数 f f f在点 x \mathbf{x} x沿着梯度方向 ∇ f ( x ) \nabla f(\mathbf{x}) f(x),具有最大的增长率。

为什么梯度是深度学习优化的最基础概念

梯度在深度学习中扮演着核心角色,几乎贯穿了整个模型训练和优化的过程。要理解梯度为何如此重要,需要从深度学习模型的构建、训练以及优化方法等多个角度来探讨。

1. 深度学习的目标:最小化损失函数

深度学习的核心目标是通过调整模型参数,使得模型在给定数据集上的损失函数达到最小值。损失函数(Loss Function)衡量了模型预测输出与真实标签之间的差距,是一个关于模型参数的多元函数。优化损失函数的过程本质上是一个在高维参数空间中寻找全局或局部最小值的问题。

2. 梯度提供了最陡下降的方向

在高维参数空间中,直接找到损失函数的最小值是极其困难的。然而,梯度为我们提供了一条捷径。梯度向量指示了损失函数在当前参数点处增长最快的方向。根据梯度的性质,沿着梯度的反方向,即是函数下降最快的路径。因此,梯度为我们提供了在参数空间中如何调整参数以最快速地降低损失函数值的指导。

3. 梯度下降法是深度学习的基础优化算法

梯度下降法(Gradient Descent)利用了梯度信息,通过迭代更新模型参数,使得每一步都朝着损失函数减小的方向前进。其基本更新公式为:

θ n e w = θ o l d − η ∇ θ L ( θ o l d ) \theta_{new} = \theta_{old} - \eta \nabla_{\theta} L(\theta_{old}) θnew=θoldηθL(θold)

其中, θ \theta θ表示模型参数, η \eta η是学习率, L ( θ ) L(\theta) L(θ)是损失函数, ∇ θ L ( θ ) \nabla_{\theta} L(\theta) θL(θ)是损失函数对参数的梯度。

4. 反向传播算法依赖梯度计算

反向传播(Backpropagation)是训练神经网络的关键算法,用于高效地计算损失函数对每个参数的梯度。通过链式法则,反向传播将输出层的误差逐层传递回前面的网络层,计算出每个参数对损失的影响。这个过程的核心就是梯度的计算和传递,没有梯度,反向传播无法进行。

在python中实现梯度求导的简单案例

一元线性回归

下面示例展示了普通线性一元回归的梯度求导以及反向误差传播,并动态可视化其结果:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation

# 生成数据集
np.random.seed(0)
X = np.linspace(0, 10, 50)
y = 2 * X + 1 + np.random.randn(50) * 4  # 增加噪声强度

# 参数初始化
w, b = -10.0, -10.0  # 将初始参数设置为远离最优值
lr = 0.02  # 学习率
epochs = 300  # 训练次数

# 存储参数和损失以便绘图
ws, bs = [], []
losses = []

# 创建图形
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))
scatter = ax1.scatter(X, y, color='blue', label='data scatter')
line, = ax1.plot([], [], 'r-', linewidth=2, label='fitted curve')
text_loss = ax1.text(0.05, 0.85, '', transform=ax1.transAxes, fontsize=12, verticalalignment='top')
ax1.set_xlabel('X')
ax1.set_ylabel('y')
ax1.set_title('simple Linear Regression')
ax1.legend()

ax2.set_xlim(0, epochs)
ax2.set_ylim(0, max((y - y.mean()) ** 2) * 1.2)
loss_line, = ax2.plot([], [], 'b-')
ax2.set_xlabel('epoch')
ax2.set_ylabel('loss')
ax2.set_title('loss curve')


def animate(i):
    global w, b
    y_pred = w * X + b
    loss = ((y_pred - y) ** 2).mean()

    # 计算梯度
    grad_w = 2 * ((y_pred - y) * X).mean()
    grad_b = 2 * (y_pred - y).mean()

    # 更新参数
    w -= lr * grad_w
    b -= lr * grad_b

    # 记录参数和损失
    ws.append(w)
    bs.append(b)
    losses.append(loss)

    # 更新拟合直线
    line.set_data(X, w * X + b)

    # 更新损失曲线
    loss_line.set_data(range(len(losses)), losses)

    # 更新损失文本
    text_loss.set_text(f'epoch: {i + 1}\ncurrent loss: {loss:.2f}')

    return line, loss_line, text_loss


# 初始化函数
def init():
    line.set_data([], [])
    loss_line.set_data([], [])
    text_loss.set_text('')
    return line, loss_line, text_loss


# 创建动画
ani = FuncAnimation(fig, animate, frames=epochs, init_func=init, interval=100, blit=True)
# 保存动画为 GIF 文件
ani.save('linear_regression_animation.gif', writer='pillow', fps=30)
plt.tight_layout()
plt.show()



在这里插入图片描述

多元线性回归
import numpy as np
import matplotlib.pyplot as plt

# 1. 生成数据集
np.random.seed(42)  # 设置随机种子以保证结果可重复

# 样本数量和特征数量
n_samples = 100
n_features = 5

# 生成随机特征矩阵 X,形状为 (100, 5)
X = np.random.randn(n_samples, n_features)

# 真实的权重和偏置,用于生成目标值 y
true_w = np.array([2, -3, 4, 1, -2])
true_b = 5

# 生成目标值 y,并添加一些噪声
y = X.dot(true_w) + true_b + np.random.randn(n_samples) * 0.5  # 噪声的标准差为 0.5

# 2. 参数初始化
w = np.zeros(n_features)  # 初始化权重为零向量
b = 0.0  # 初始化偏置为 0
lr = 0.01  # 学习率
epochs = 300  # 训练轮数

# 存储损失值以便绘图
losses = []

# 3. 训练过程
for epoch in range(epochs):
    # 前向传播:计算预测值
    y_pred = X.dot(w) + b

    # 计算损失(均方误差)
    loss = ((y_pred - y) ** 2).mean()
    losses.append(loss)

    # 计算梯度
    grad_w = 2 * X.T.dot(y_pred - y) / n_samples
    grad_b = 2 * (y_pred - y).mean()

    # 参数更新
    w -= lr * grad_w
    b -= lr * grad_b

    # 可选:每隔一定迭代次数打印一次损失值
    if (epoch + 1) % 50 == 0:
        print(f"Epoch {epoch + 1}/{epochs}, Loss: {loss:.4f}")

# 4. 绘制损失曲线
plt.figure(figsize=(8, 6))
plt.plot(range(1, epochs + 1), losses, label='train loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.title('multiple linear regression loss')
plt.legend()
plt.grid(True)
plt.show()

# 5. 打印最终的参数值
print("训练结束后的参数值:")
print(f"w: {w}")
print(f"b: {b}")

# 6. 比较真实参数和模型学习到的参数
print("\n真实的参数值:")
print(f"true_w: {true_w}")
print(f"true_b: {true_b}")

程序输出:

Epoch 50/300, Loss: 9.0096
Epoch 100/300, Loss: 1.7507
Epoch 150/300, Loss: 0.4893
Epoch 200/300, Loss: 0.2570
Epoch 250/300, Loss: 0.2122
Epoch 300/300, Loss: 0.2032
训练结束后的参数值:
w: [ 2.0363504  -2.90204453  3.95529038  1.08716601 -2.00416486]
b: 4.896948074085842
真实的参数值:
true_w: [ 2 -3  4  1 -2]
true_b: 5

以及loss的下降曲线图:

image-20241005160737309

结合示例深度学习中的梯度求导的一般过程

数学原理推导

1. 问题背景

在上面的多元线性回归案例中,我们的目标是找到最优的参数 w \mathbf{w} w b b b,使得模型预测值 y ^ \hat{\mathbf{y}} y^与真实值 y \mathbf{y} y之间的均方误差(Mean Squared Error, MSE)最小化。

模型表示:

y ^ = X w + b \hat{\mathbf{y}} = \mathbf{X} \mathbf{w} + b y^=Xw+b

  • X \mathbf{X} X:形状为 ( n , m ) (n, m) (n,m)的数据矩阵, n n n为样本数, m m m为特征数。
  • w \mathbf{w} w:形状为 ( m , 1 ) (m, 1) (m,1)的权重向量。
  • b b b:偏置项,标量。

损失函数(MSE):

L ( w , b ) = 1 n ∑ i = 1 n ( y ^ i − y i ) 2 L(\mathbf{w}, b) = \frac{1}{n} \sum_{i=1}^n (\hat{y}_i - y_i)^2 L(w,b)=n1i=1n(y^iyi)2


2. 计算梯度

我们需要计算损失函数 L L L对参数 w \mathbf{w} w b b b的梯度,即 ∇ w L \nabla_{\mathbf{w}} L wL ∂ L ∂ b \frac{\partial L}{\partial b} bL

2.1. 对 w \mathbf{w} w的梯度 ∇ w L \nabla_{\mathbf{w}} L wL

步骤1:展开损失函数

L ( w , b ) = 1 n ∑ i = 1 n ( y ^ i − y i ) 2 = 1 n ∑ i = 1 n ( x i ⊤ w + b − y i ) 2 L(\mathbf{w}, b) = \frac{1}{n} \sum_{i=1}^n (\hat{y}_i - y_i)^2 = \frac{1}{n} \sum_{i=1}^n (\mathbf{x}_i^\top \mathbf{w} + b - y_i)^2 L(w,b)=n1i=1n(y^iyi)2=n1i=1n(xiw+byi)2

其中, x i \mathbf{x}_i xi是第 i i i个样本的特征向量。

步骤2:对 w \mathbf{w} w求偏导

w \mathbf{w} w求梯度:

∇ w L = ∂ L ∂ w = ∂ ∂ w ( 1 n ∑ i = 1 n ( x i ⊤ w + b − y i ) 2 ) \nabla_{\mathbf{w}} L = \frac{\partial L}{\partial \mathbf{w}} = \frac{\partial}{\partial \mathbf{w}} \left( \frac{1}{n} \sum_{i=1}^n (\mathbf{x}_i^\top \mathbf{w} + b - y_i)^2 \right) wL=wL=w(n1i=1n(xiw+byi)2)

由于求和和求导可以交换:

∇ w L = 1 n ∑ i = 1 n ∂ ∂ w ( ( x i ⊤ w + b − y i ) 2 ) \nabla_{\mathbf{w}} L = \frac{1}{n} \sum_{i=1}^n \frac{\partial}{\partial \mathbf{w}} \left( (\mathbf{x}_i^\top \mathbf{w} + b - y_i)^2 \right) wL=n1i=1nw((xiw+byi)2)

步骤3:计算单个项的偏导

对每个 i i i,应用链式法则:

∂ ∂ w ( ( x i ⊤ w + b − y i ) 2 ) = 2 ( x i ⊤ w + b − y i ) ∂ ∂ w ( x i ⊤ w ) \frac{\partial}{\partial \mathbf{w}} \left( (\mathbf{x}_i^\top \mathbf{w} + b - y_i)^2 \right) = 2 (\mathbf{x}_i^\top \mathbf{w} + b - y_i) \frac{\partial}{\partial \mathbf{w}} (\mathbf{x}_i^\top \mathbf{w}) w((xiw+byi)2)=2(xiw+byi)w(xiw)

注意到 ∂ ∂ w ( x i ⊤ w ) = x i \frac{\partial}{\partial \mathbf{w}} (\mathbf{x}_i^\top \mathbf{w}) = \mathbf{x}_i w(xiw)=xi,因此:

∂ ∂ w ( ( x i ⊤ w + b − y i ) 2 ) = 2 ( x i ⊤ w + b − y i ) x i \frac{\partial}{\partial \mathbf{w}} \left( (\mathbf{x}_i^\top \mathbf{w} + b - y_i)^2 \right) = 2 (\mathbf{x}_i^\top \mathbf{w} + b - y_i) \mathbf{x}_i w((xiw+byi)2)=2(xiw+byi)xi

步骤4:合并梯度表达式

将所有样本的梯度相加:

∇ w L = 2 n ∑ i = 1 n ( y ^ i − y i ) x i \nabla_{\mathbf{w}} L = \frac{2}{n} \sum_{i=1}^n (\hat{y}_i - y_i) \mathbf{x}_i wL=n2i=1n(y^iyi)xi

将上述求和形式转换为矩阵形式。定义误差向量:

e = y ^ − y \mathbf{e} = \hat{\mathbf{y}} - \mathbf{y} e=y^y

将样本特征矩阵 X \mathbf{X} X的转置 X ⊤ \mathbf{X}^\top X与误差向量相乘:

∇ w L = 2 n X ⊤ ( y ^ − y ) = 2 n X ⊤ e \nabla_{\mathbf{w}} L = \frac{2}{n} \mathbf{X}^\top (\hat{\mathbf{y}} - \mathbf{y}) = \frac{2}{n} \mathbf{X}^\top \mathbf{e} wL=n2X(y^y)=n2Xe

2.2. 对 b b b的梯度 ∂ L ∂ b \frac{\partial L}{\partial b} bL

步骤1:对 b b b求偏导

∂ L ∂ b = ∂ ∂ b ( 1 n ∑ i = 1 n ( x i ⊤ w + b − y i ) 2 ) = 1 n ∑ i = 1 n ∂ ∂ b ( ( x i ⊤ w + b − y i ) 2 ) \frac{\partial L}{\partial b} = \frac{\partial}{\partial b} \left( \frac{1}{n} \sum_{i=1}^n (\mathbf{x}_i^\top \mathbf{w} + b - y_i)^2 \right) = \frac{1}{n} \sum_{i=1}^n \frac{\partial}{\partial b} \left( (\mathbf{x}_i^\top \mathbf{w} + b - y_i)^2 \right) bL=b(n1i=1n(xiw+byi)2)=n1i=1nb((xiw+byi)2)

步骤2:计算单个项的偏导

∂ ∂ b ( ( x i ⊤ w + b − y i ) 2 ) = 2 ( x i ⊤ w + b − y i ) ∂ ∂ b ( x i ⊤ w + b − y i ) \frac{\partial}{\partial b} \left( (\mathbf{x}_i^\top \mathbf{w} + b - y_i)^2 \right) = 2 (\mathbf{x}_i^\top \mathbf{w} + b - y_i) \frac{\partial}{\partial b} (\mathbf{x}_i^\top \mathbf{w} + b - y_i) b((xiw+byi)2)=2(xiw+byi)b(xiw+byi)

由于 ∂ ∂ b ( x i ⊤ w + b − y i ) = 1 \frac{\partial}{\partial b} (\mathbf{x}_i^\top \mathbf{w} + b - y_i) = 1 b(xiw+byi)=1,因此:

∂ ∂ b ( ( x i ⊤ w + b − y i ) 2 ) = 2 ( x i ⊤ w + b − y i ) \frac{\partial}{\partial b} \left( (\mathbf{x}_i^\top \mathbf{w} + b - y_i)^2 \right) = 2 (\mathbf{x}_i^\top \mathbf{w} + b - y_i) b((xiw+byi)2)=2(xiw+byi)

步骤3:合并梯度表达式

∂ L ∂ b = 2 n ∑ i = 1 n ( y ^ i − y i ) = 2 n ∑ i = 1 n e i = 2 ⋅ mean ( y ^ − y ) \frac{\partial L}{\partial b} = \frac{2}{n} \sum_{i=1}^n (\hat{y}_i - y_i) = \frac{2}{n} \sum_{i=1}^n e_i = 2 \cdot \text{mean}(\hat{\mathbf{y}} - \mathbf{y}) bL=n2i=1n(y^iyi)=n2i=1nei=2mean(y^y)


对应到代码中的梯度计算

在代码中:

grad_w = 2 * X.T.dot(y_pred - y) / len(y)
grad_b = 2 * (y_pred - y).mean()
  • X.T.dot(y_pred - y)对应于 X ⊤ ( y ^ − y ) \mathbf{X}^\top (\hat{\mathbf{y}} - \mathbf{y}) X(y^y)
  • len(y)是样本数量 n n n
  • (y_pred - y).mean()对应于误差的平均值 mean ( y ^ − y ) \text{mean}(\hat{\mathbf{y}} - \mathbf{y}) mean(y^y)

对比数学推导和代码如下:

  • 对于 ∇ w L \nabla_{\mathbf{w}} L wL

    数学上:

    ∇ w L = 2 n X ⊤ ( y ^ − y ) \nabla_{\mathbf{w}} L = \frac{2}{n} \mathbf{X}^\top (\hat{\mathbf{y}} - \mathbf{y}) wL=n2X(y^y)

    代码中:

    grad_w = 2 * X.T.dot(y_pred - y) / len(y)
    

    二者完全一致。

  • 对于 ∂ L ∂ b \frac{\partial L}{\partial b} bL

    数学上:

    ∂ L ∂ b = 2 ⋅ mean ( y ^ − y ) \frac{\partial L}{\partial b} = 2 \cdot \text{mean}(\hat{\mathbf{y}} - \mathbf{y}) bL=2mean(y^y)

    代码中:

    grad_b = 2 * (y_pred - y).mean()
    

    也完全一致。

个人公众号

看到这里的各位朋友,肯定都是真爱,在下是一个从事环境科学领域的科研牛马,主要研究方向为深度学习环境领域的应用,如果您也同样的在做相关的研究,关注在下的微信公众号:Environmodel',每日分享环境领域的模型研究、机器学习等研究进展,当然也还会有不少实用的编程技巧分享。
Environmodel

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

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

相关文章

开源AI智能名片链动2+1模式S2B2C商城小程序源码在B2B情境化营销中的应用

摘要:本文探讨情境化营销在B2B环境中的适用性,分析现有的B2B情境化营销案例,如通过物联网传感设备进行设备监控与预防保养。随后引入“开源AI智能名片链动21模式S2B2C商城小程序源码”,阐述其如何助力B2B企业在情境化营销中提升效…

弧形导轨驱动器高效使用技巧!

弧形导轨驱动器是一种用于驱动滑座沿着导轨做弧线运动的设备,其用方法因具体型号和应用场景的不同而有所差异,通常可以归纳为以下几个步骤: 1、安装前要明确弧形导轨的使用需求,根据需求选择合适的弧形导轨驱动器,准备…

Python办公自动化教程(005):Word添加段落

文章目录 2.1 Python-docx介绍2.2 安装2.3 实例 2.1 Python-docx介绍 python-docx 是一个用于创建和修改 Microsoft Word 文档(.docx 格式)的 Python 库。它可以方便地生成和处理 Word 文档,而无需直接与 Microsoft Word 程序交互。 2.2 安…

运营弹性的 5 大支柱

作者:来自 Elastic Elastic Platform Team 什么是运营弹性? 没有哪个组织能够免受干扰。无论是错误的更新、有针对性的网络攻击,还是导致大规模供应链动荡的全球流行病,大多数公司在某个时候都会遇到障碍。这是增长的代价。但成功…

2024/10/5 英语每日一段

“There’s no reason, frankly, that someone who already has a passport and just needs to renew it shouldn’t be able to do that online, “Secretary of State Antony Blinken said at a March budget hearing. The State Department launched a pilot program for on…

ARM嵌入式学习--第一天

-ARM核介绍 -CPU核 CPU又叫中央处理器,其主要功能是进行算数运算和逻辑运算,内部结构大概可以分为控制单元,算术逻辑单元和储存单元等几个部分 -ARM核 工作模式: user mode:用户模式是用户程序的工作模式,他运行在操作…

Python并发编程(3)——Python多线程详解介绍

左手编程,右手年华。大家好,我是一点,关注我,带你走入编程的世界。 公众号:一点sir,关注领取python编程资料 Python 的多线程入门是非常简单的,直接导入threading模块就可以开始多线程之旅了。模…

[C++]使用纯opencv部署yolov11-seg实例分割onnx模型

【算法介绍】 在C中使用纯OpenCV部署YOLOv11-seg进行实例分割是一项具有挑战性的任务,因为YOLOv11通常是用PyTorch等深度学习框架实现的,而OpenCV本身并不直接支持加载和运行PyTorch模型。然而,可以通过一些间接的方法来实现这一目标&#x…

使用statsmodels解锁Python中的统计分析力量

使用 Python 中的 statsmodels 解锁统计分析的力量 引言 在不断发展的数据科学世界中,statsmodels 作为一个专为统计分析和计量经济学应用设计的 Python 库而脱颖而出。与更广泛的机器学习库不同,statsmodels 提供了专门设计的工具,用于深入…

Origin正态分布检验

在spass中用Shapiro-Wilk检验--正态分布检测 Shapiro-Wilk检验--正态分布检测_spss shapiro-wilk检验-CSDN博客

【路径规划】多机器人路径规划

摘要 多机器人路径规划在现代自动化、仓储管理及智能交通系统中有着广泛的应用。本文提出了一种基于A*算法的多机器人路径规划方法,旨在解决多机器人在同一环境中的路径冲突问题。通过采用启发式搜索和路径优化策略,机器人能够在保持避障的前提下实现最…

《Linux从小白到高手》理论篇:Linux的资源监控管理

本篇介绍Linux的资源监控管理。 1、CPU 资源管理 进程调度: Linux 采用公平的进程调度算法,确保每个进程都能获得合理的 CPU 时间。调度算法会根据进程的优先级、等待时间等因素来决定哪个进程获得 CPU 使用权。 可以通过调整进程的优先级来影响其获得…

wpf实现新用户页面引导

第一步 第二部 部分代码: private void show(int xh, FrameworkElement fe, string con, Visibility vis Visibility.Visible) {Point point fe.TransformToAncestor(Window.GetWindow(fe)).Transform(new Point(0, 0));//获取控件坐标点RectangleGeometry rg new Rectangl…

【Linux】进程详解:命令行参数、环境变量及地址空间

✨ 一生如牛不得闲,得闲已与山共眠 🌏 📃个人主页:island1314 🔥个人专栏:Linux—登神长阶 ⛺️ 欢迎关注:👍点赞 &…

如何注册西柚云服务器账号?渠道优惠下单获得立减200优惠

1.什么是生信云服务器? 生信云服务器是一种专门为生物信息学领域打造的一体化服务解决方案,旨在满足生信科研群体的多样化需求。无论你是生物信息学的初学者,还是已经具备丰富经验的生信专家,这个平台都能够提供帮助。 满足不同…

【算法笔记】滑动窗口算法原理深度剖析

【算法笔记】滑动窗口算法原理深度剖析 🔥个人主页:大白的编程日记 🔥专栏:算法笔记 文章目录 【算法笔记】滑动窗口算法原理深度剖析前言一.长度最小的子数组1.1题目1.2思路分析1.3算法流程1.4正确性证明1.5代码实现 二.无重复…

C题(六) 1到 100 的所有整数中出现多少个数字9

场景:编写程序数一下 1到 100 的所有整数中出现多少个数字9 控制循环的变量不可以随意改动!!! 控制循环的变量不可以随意改动!!! 控制循环的变量不可以随意改动!!&#x…

【PyCharm】Ubuntu20.04 卸载 PyCharm 并安装激活 Professional

【PyCharm】Ubuntu20.04 卸载 PyCharm 并安装激活 Professional 1 卸载2 安装激活 1 卸载 参考文档: Link 删除安装目录 删掉之前压缩包解压出来的目录,例如:我之前是放在家目录下 rm -rf ~/pycharm-community-2023.2.1删除配置文件 rm -rf ~/.config…

JAVA运用中springBoot获取前端ajax提交参数方式汇总

本篇文章主要讲解springboot获取前端提交的参数信息,后端进行接受的常见方法汇总,通过本篇文章你可以快速掌握对表单和连接参数获取的能力。 作者:任聪聪 日期:2024年10月5日 一、delete、get等url参数获取方式 前台提交&#xf…

linux下yum安装时出现Loaded plugins: fastestmirror的解决办法

一、centos7修改源 在CentOS 7中,修改系统软件源可以通过编辑/etc/yum.repos.d/目录下的.repo文件来实现。以下是一个基本的步骤和示例代码,用于将默认的软件源修改为阿里云的源。 备份当前的CentOS-Base.repo文件: sudo cp /etc/yum.repos.…