Python | 机器学习之逻辑回归

news2024/10/5 9:31:39

🌈个人主页:Sarapines Programmer
🔥 系列专栏:《人工智能奇遇记》
🔖少年有梦不应止于心动,更要付诸行动。

目录结构


1. 机器学习之逻辑回归概念

1.1 机器学习

1.2 逻辑回归

2. 逻辑回归

2.1 实验目的

2.2 实验准备

2.3 实验题目

2.4 实验内容

2.5 实验心得

致读者


1. 机器学习之逻辑回归概念

1.1 机器学习

传统编程要求开发者明晰规定计算机执行任务的逻辑和条条框框的规则。然而,在机器学习的魔法领域,我们向计算机系统灌输了海量数据,让它在数据的奔流中领悟模式与法则,自主演绎未来,不再需要手把手的指点迷津。

机器学习,犹如三千世界的奇幻之旅,分为监督学习、无监督学习和强化学习等多种类型,各具神奇魅力。监督学习如大师传道授业,算法接收标签的训练数据,探索输入与输出的神秘奥秘,以精准预测未知之境。无监督学习则是数据丛林的探险者,勇闯没有标签的领域,寻找隐藏在数据深处的秘密花园。强化学习则是一场与环境的心灵对话,智能体通过交互掌握决策之术,追求最大化的累积奖赏。

机器学习,如涓涓细流,渗透各行各业。在图像和语音识别、自然语言处理、医疗诊断、金融预测等领域,它在智慧的浪潮中焕发生机,将未来的可能性绘制得更加丰富多彩。

1.2 逻辑回归

逻辑回归是一种用于解决二分类问题的统计学习方法。尽管其名字中包含"回归"一词,但实际上,逻辑回归是一种分类算法,用于预测一个样本属于两个类别中的哪一个。

逻辑回归的核心思想是通过一个称为"逻辑函数"或"sigmoid函数"的特殊函数,将线性组合的输入特征映射到0和1之间的概率值。该函数的输出可以被解释为属于正类别的概率。在二分类问题中,逻辑回归通过设置一个阈值(通常为0.5),将概率大于阈值的样本预测为正类别,而概率小于阈值的样本预测为负类别。

逻辑回归模型的训练过程涉及到找到最适合拟合训练数据的参数,通常使用最大似然估计等方法来实现。由于其简单、高效且易于解释的特点,逻辑回归在实际应用中广泛用于医学、社会科学、经济学等领域的二分类问题。

机器学习源文件icon-default.png?t=N7T8https://download.csdn.net/download/m0_57532432/88521177?spm=1001.2014.3001.5503


2. 逻辑回归

2.1 实验目的

(1)加深对有监督学习的理解和认识;

(2)了解逻辑回归的损失函数;

(3)掌握逻辑回归的优化方法;

(4)了解sigmoid函数;

(5)了解逻辑回归的应用场景;

(6)应用LogisticRegression实现逻辑回归预测;

(7)理解精确率、召回率指标的区别。


2.2 实验准备

(1)安装机器学习必要库,如NumPy、Pandas、Scikit-learn等;

(2)配置环境用来运行 Python、Jupyter Notebook和相关库等内容。


2.3 实验题目

假设你是某大学招生主管,你想根据两次考试的结果决定每个申请者的录取机会。现有以往申请者的历史数据,可以此作为训练集建立逻辑回归模型,并用其预测某学生能否被大学录取。请按要求完成实验。建议使用 python 编程实现。

数据集:

文件 ex2data1.txt 为该实验的数据集,第一列、第二列分别表示申请者两次考试的成绩,第三列表示录取结果(1 表示录取,0 表示不录取)。2.4 实验内容

总体步骤:

1.请导入数据并进行数据可视化,观察数据分布特征。(建议用 python 的matplotlib)

2.将逻辑回归参数初始化为 0,然后计算代价函数(cost  function)并求出初始值。

3.选择一种优化方法求解逻辑回归参数。

4.某学生两次考试成绩分别为 42、85,预测其被录取的概率。

5.画出分类边界。

具体内容:

1.导入数据并进行数据可视化,观察数据分布特征。(建议用 python 的matplotlib)

图3-1

运行结果:

图3-2

代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import ticker

def plot_data():
    # 首先需要读取数据
raw_data = pd.read_csv("data/data.csv")  

    # 从名为 "data.csv" 的文件中读取原始数据
raw_data.columns = ['first', 'second', 'admited']  

    # 为数据的列添加标签,分别为 'first', 'second', 'admited'
    # 接下来将数据中的 0 和 1 分开存储
admit_array_x = []  

    # 存储通过测试的数据的第一次考试成绩
admit_array_y = []  

    # 存储通过测试的数据的第二次考试成绩
not_admit_array_x = []  

    # 存储未通过测试的数据的第一次考试成绩
not_admit_array_y = []  

    # 存储未通过测试的数据的第二次考试成绩
    for i in range(raw_data.shape[0]):
        if raw_data.iloc[i][2] == 1:
            admit_array_x.append(raw_data.iloc[i][0])
            admit_array_y.append(raw_data.iloc[i][1])
        else:
            not_admit_array_x.append(raw_data.iloc[i][0])
            not_admit_array_y.append(raw_data.iloc[i][1])

    # 设置标题和横纵坐标的标注
    plt.xlabel("Exam 1 score")  
# 设置 x 轴标签为 "Exam 1 score"

    plt.ylabel("Exam 2 score")  
    # 设置 y 轴标签为 "Exam 2 score"

    # 设置通过测试和不通过测试数据的样式。
    # marker: 记号形状, color: 颜色, s: 点的大小, label: 标注
    plt.scatter(not_admit_array_x, not_admit_array_y, marker='o', color='red', s=15, label='Not admitted')
    plt.scatter(admit_array_x, admit_array_y, marker='x', color='green', s=15, label='Admitted')

    # 标注的显示位置:右上角
    plt.legend(loc='upper right')

    # 设置坐标轴上刻度的精度为一位小数。
# 因为训练数据中的分数的小数点太多,
# 若不限制坐标轴上刻度显示的精度,会影响最终散点图的美观度
    plt.gca().xaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))
    plt.gca().yaxis.set_major_formatter(ticker.FormatStrFormatter('%.1f'))
   
 # 显示图像
plt.show()

plot_data() #绘制图像

源码分析:

  1. 函数plot_data()被定义用于绘制散点图。它的主要功能是读取原始数据,并根据通过测试和未通过测试的两类数据的考试成绩创建相应的数组。数据读取是通过调用pd.read_csv()方法来实现的,从名为"data.csv"的文件中读取数据,并为数据的列添加了相应的标签,即'first'、'second'和'admited'。假设数据集的结构为三列。
  2. 在创建了用于存储通过测试和未通过测试数据的考试成绩的空数组后,使用循环遍历数据集的每一行。通过检查"admited"列的值,将考试成绩数据分别存储到对应的数组中。当"admited"列的值为1时,表示该数据是通过测试的,将该行的第一次考试成绩添加到admit_array_x数组中,将第二次考试成绩添加到admit_array_y数组中。当"admited"列的值不为1时,表示该数据未通过测试,将相应的考试成绩分别添加到not_admit_array_x和not_admit_array_y数组中。
  3. 在数据准备完毕后,对图形进行设置。首先设置图的标题和横纵坐标的标注。将x轴标签设置为"Exam 1 score",表示第一次考试成绩,将y轴标签设置为"Exam 2 score",表示第二次考试成绩。
  4. 接下来使用plt.scatter()函数绘制散点图。通过设置不同的参数来指定通过测试和未通过测试数据的样式。未通过测试数据使用圆形作为标记(marker='o'),通过测试数据使用叉号作为标记(marker='x')。未通过测试数据的颜色设置为红色(color='red'),通过测试数据的颜色设置为绿色(color='green')。点的大小设置为15(s=15)。同时,通过设置标注的参数(label='Not admitted'和label='Admitted'),为未通过测试和通过测试的数据添加相应的标注。
  5. 使用plt.legend()函数将标注显示在右上角。
  6. 为了提高坐标轴刻度的可读性和美观度,使用plt.gca().xaxis.set_major_formatter()和plt.gca().yaxis.set_major_formatter()函数设置坐标轴上刻度的精度为一位小数。这里使用ticker.FormatStrFormatter('%.1f')指定显示格式为保留一位小数。
  7. 最后调用plt.show()函数显示图像,将图像呈现在屏幕上。
  8. 在定义完函数之后,调用plot_data()函数即可执行绘制图像的操作,根据数据绘制出相应的散点图。

2.将逻辑回归参数初始化为 0,然后计算代价函数(cost  function)并求出初始值。

图3-3

代码:

def init_data():
    # 将数据初始化
    data = pd.read_csv("data/data.csv")  
    # 从名为 "data.csv" 的文件中读取数据
    data.columns = ['first', 'second', 'admited']  
    # 为数据的列添加标签,分别为 'first', 'second', 'admited'
    # 尝试对数据进行标准化
    column_list = list(data.columns)  
    # 获取数据集中的列名列表
    min_value = []  
    # 存储每一列的最小值
    max_value = []  
    # 存储每一列的最大值
    for j in range(data.shape[1] - 1):
        min_value.append(data[column_list[j]].min())  
        # 计算每一列的最小值并存储
        max_value.append(data[column_list[j]].max())  
        # 计算每一列的最大值并存储
        for i in range(data.shape[0]):
            # 对每一个数据点进行标准化,将其转换为0到1之间的值
            data.loc[i, column_list[j]] = (data.loc[i, column_list[j]] - min_value[j]) / (max_value[j] - min_value[j])
    data_x = data.iloc[:, 0:2]  
    # 特征值,取第一列和第二列作为特征
    data_y = data.iloc[:, -1]  
    # 标签,取最后一列作为标签
    return data_x.values, data_y.values, min_value, max_value

3.选择一种优化方法求解逻辑回归参数。

图3-4

图3-5

运行结果:

图3-6

代码:

# 与逻辑回归有关的函数

# 定义 sigmoid 函数,用于将输入值映射到0到1之间
def sigmoid(z):
    return 1 / (1 + np.exp(-z))

# 定义代价函数,用于计算逻辑回归模型的代价
def cost_function(X, y, theta):
    m = len(y)  # 样本数量
    h = sigmoid(np.dot(X, theta))  # 计算假设函数的预测值
    J = -(1/m) * np.sum(y * np.log(h) + (1-y) * np.log(1-h))  # 代价函数表达式
    return J

# 定义梯度下降函数,用于更新模型参数
def gradient_descent(X, y, theta, alpha, num_iterations):
    m = len(y)  # 样本数量
    J_history = []  # 存储每次迭代的代价值

    for i in range(num_iterations):
        h = sigmoid(np.dot(X, theta))  # 计算假设函数的预测值
        gradient = np.dot(X.T, (h - y)) / m  # 计算梯度
        theta = theta - alpha * gradient  # 更新模型参数
        cost = cost_function(X, y, theta)  # 计算当前模型参数下的代价
        J_history.append(cost)  # 将代价添加到代价历史列表中
return theta, J_history

# 逻辑回归主函数
# 从 CSV 文件读取数据
data = pd.read_csv('data/data.csv')
data.columns = ['first','second','admited']

# 提取特征和标签
data_x, data_y, min_value, max_value = init_data()

# 初始化参数
theta = np.zeros(2)  # 将权重初始设置为0
alpha = 0.01  # 学习率
num_iterations = 1000  # 迭代次数

# 训练逻辑回归模型
theta, J_history = gradient_descent(data_x, data_y, theta, alpha, num_iterations)

# 绘制代价函数的变化曲线
plt.plot(J_history)  # 绘制迭代次数与代价值之间的关系曲线
plt.xlabel('iteration')  # 设置x轴标签
plt.ylabel('cost value')  # 设置y轴标签
plt.title('curve of cost values')  # 设置图的标题为"cost values的变化曲线"
# 显示图像
plt.show()

源码分析:

  1. 这里定义了逻辑回归相关的函数,包括sigmoid函数、代价函数和梯度下降函数。然后在逻辑回归主函数中读取数据,提取特征和标签,并初始化模型参数。通过调用梯度下降函数进行模型训练,并绘制代价函数的变化曲线,以评估模型的训练效果。这些步骤构成了一个基本的逻辑回归训练过程。
  2. sigmoid函数。sigmoid函数将输入值映射到0到1之间的范围是逻辑回归中的核心函数之一。逻辑回归的目标是将线性加权和的输出转化为概率值,而sigmoid函数正是用于实现这个转化过程。
  3. 代价函数cost_function。该函数用于计算逻辑回归模型的代价。它接受输入数据X、标签y和模型参数theta作为参数,并根据逻辑回归的代价函数公式计算代价J。代价函数是衡量模型预测结果与实际标签之间差异的指标,逻辑回归的目标是最小化代价函数,以找到最优的模型参数。
  4. 梯度下降函数gradient_descent。该函数用于更新模型参数,以使代价函数逐步降低。它接受输入数据X、标签y、模型参数theta、学习率alpha和迭代次数num_iterations作为参数。在每次迭代中,函数通过计算假设函数的预测值h和计算梯度gradient来更新模型参数theta。梯度下降算法通过沿着梯度的反方向更新参数,使得代价函数逐步减小,从而逐步接近最优解。在每次迭代结束后,函数还计算当前模型参数下的代价cost,并将代价值添加到代价历史列表J_history中。
  5. 在逻辑回归主函数中,首先从CSV文件中读取数据,并将数据的列标签设置为'first'、'second'和'admited'。这些列标签指定了数据集中各列的含义。
  6. 调用函数init_data()来提取特征和标签。该函数的具体实现在代码中并未给出,但可以假设它用于对原始数据进行处理,提取特征和标签,并进行必要的数据预处理步骤。提取得到的特征存储在data_x中,标签存储在data_y中。
  7. 初始化模型参数theta为0,学习率alpha为0.01,迭代次数num_iterations为1000。这些参数将用于训练逻辑回归模型。
  8. 调用梯度下降函数gradient_descent进行模型训练。函数传入输入数据data_x、标签data_y、模型参数theta、学习率alpha和迭代次数num_iterations。函数将返回更新后的模型参数theta和代价历史列表J_history。
  9. 使用matplotlib库绘制代价函数的变化曲线。函数使用plt.plot()将迭代次数与代价值之间的关系绘制成曲线图。通过设置x轴标签为'iteration',y轴标签为' cost value',以及图的标题为'curve of cost values',可以更直观地观察训练过程中代价函数的变化情况。最后,调用plt.show()函数显示绘制的图像,使得代价函数的变化曲线可见。
  10. 这个曲线图对于评估模型的训练效果非常有用。如果代价函数的值在每次迭代后都逐渐减小,说明模型的训练是有效的,参数在朝着最优值的方向更新。

训练模型:

图3-7

运行结果:

图3-8

图3-9

代码:

########## 使用测试集进行测试 #####################
# 读取测试集数据
test_data = pd.read_csv('data/data_test.csv')
test_data.columns = ['first','second','admited']

# 测试集数据标准化
column_list = list(test_data.columns)
for j in range(test_data.shape[1]-1):
    for i in range(test_data.shape[0]):
        test_data.loc[i,column_list[j]] = (test_data.loc[i,column_list[j]]-min_value[j]) / (max_value[j]-min_value[j])
test_data_x = test_data.iloc[:,0:2].values
test_data_y = test_data.iloc[:,-1].values

# 输入 sigmoid 函数进行预测
prediction = sigmoid(np.dot(test_data_x, theta))
print(prediction)

# 输出正确率
num = 0  # 预测正确的个数
for i in range(len(prediction)):
    if prediction[i] > 0.5:
        temp_value = 1
    else:
        temp_value = 0
    if test_data_y[i] == temp_value:
        num = num + 1
print(f"模型的正确率为:{num/len(prediction)}")

################# 绘制决策边界 #################
# 定义决策边界的阈值
threshold = 0.5

# 生成网格点
x_min, x_max = data_x[:, 0].min() - 0.01, data_x[:, 0].max() + 0.01
y_min, y_max = data_x[:, 1].min() - 0.01, data_x[:, 1].max() + 0.01
h = 0.0001  # 网格点的间隔
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))

# 对网格点进行预测
X_grid = np.c_[xx.ravel(), yy.ravel()]
Z = np.dot(X_grid, theta)
Z = sigmoid(Z)
Z = Z.reshape(xx.shape)

# 绘制决策边界和分类结果
plt.contourf(xx, yy, Z, alpha=0.8)  
# 绘制决策边界
plt.scatter(data_x[:, 0], data_x[:, 1], c=data_y)  
# 绘制样本点
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title('Decision Boundary')
plt.show()

源码分析:

1.读取测试集数据:

  1. 从名为'data_test.csv'的文件中读取测试集数据,并将列名改为'first'、'second'和'admited'。

2.测试集数据标准化:

  1. 获取列名列表column_list。
  2. 对每一列进行标准化,即将每个元素减去最小值(min_value[j]),然后除以最大值和最小值的差值(max_value[j]-min_value[j]),使得数据在0到1之间。
  3. 提取标准化后的特征值(test_data_x)和标签值(test_data_y)。

3.使用sigmoid函数进行预测:

  1. 根据预测模型的参数(theta)和测试集特征值(test_data_x),计算预测概率值(prediction)。这里使用np.dot函数进行矩阵乘法,将特征值和参数进行相乘,并通过sigmoid函数将结果映射到0到1之间的概率值。

4.输出正确率:

  1. 初始化变量num为0,用于记录预测正确的个数。
  2. 遍历每个预测概率值(prediction)。
  3. 如果预测概率值大于0.5,将临时变量temp_value设为1,否则设为0。
  4. 如果测试集标签值(test_data_y)等于临时变量temp_value,表示预测正确,将num加1。
  5. 计算并输出模型的正确率。

5.绘制决策边界:

  1. 定义决策边界的阈值为0.5。
  2. 获取数据集中特征1和特征2的最小值和最大值,并略微扩展范围,生成一个网格点矩阵(xx, yy)。
  3. 对网格点进行预测,即根据模型参数(theta)和网格点特征值(X_grid)计算预测概率值(Z)。将预测概率值通过sigmoid函数进行映射,并重新调整形状为与网格点相同。
  4. 使用contourf函数绘制决策边界的等高线,alpha参数设置透明度。
  5. 使用scatter函数绘制数据集中的样本点,c参数根据标签值(data_y)设置样本点的颜色。
  6. 添加x轴和y轴标签,设置标题,并展示图像。

6.定义决策边界的阈值:

  1. 将决策边界的阈值设为0.5,即当预测概率值大于0.5时,将其判定为正类,否则为负类。

7.生成网格点:

  1. 获取数据集中特征1和特征2的最小值和最大值,并稍微扩展范围。
  2. 定义一个间隔大小h,用于生成网格点。
  3. 利用np.meshgrid函数生成一个网格点矩阵(xx, yy),其中xx和yy分别是特征1和特征2在网格上的坐标值。

8.对网格点进行预测:

  1. 将网格点矩阵(xx, yy)转换为一维数组形式,便于进行预测。
  2. 利用np.dot函数计算预测概率值(Z),即将网格点特征值与模型参数(theta)进行矩阵乘法。
  3. 将预测概率值(Z)通过sigmoid函数进行映射,将其转换为0到1之间的概率值。
  4. 将预测概率值(Z)重新调整形状,使其与网格点矩阵(xx, yy)的形状相同。

9.绘制决策边界和分类结果:

  1. 使用contourf函数绘制决策边界的等高线,将预测概率值(Z)作为填充颜色,alpha参数设置透明度。
  2. 使用scatter函数绘制数据集中的样本点,特征1和特征2作为坐标,标签值(data_y)决定样本点的颜色。
  3. 添加x轴和y轴标签,设置标题。
  4. 显示绘制的图像。

4.某学生两次考试成绩分别为 42、85,预测其被录取的概率。

图3-10

代码:

# 当输入为42和85时,计算通过概率
# 标准化输入值
x1 = (42 - min_value[0]) / (max_value[0] - min_value[0])
x2 = (85 - min_value[1]) / (max_value[1] - min_value[1])
# 将输入值转换为数组
arr = np.array((x1, x2))
# 计算最终通过概率
print(f"通过概率为:{sigmoid(np.dot(arr, theta))}")

5.画出分类边界。

分类边界在第三步已经完成,如图3-9。


2.5 实验心得

本次实验运用逻辑回归算法进行学生考试成绩和录取结果的分类预测,实现了数据可视化、参数初始化、代价函数计算、梯度下降优化、预测和决策边界绘制等关键步骤。

数据可视化阶段通过matplotlib库创建散点图,生动展示通过和不通过考试学生在两次考试成绩上的分布特征,直观呈现数据的分布情况。

参数初始化和代价函数计算中,将逻辑回归参数初始化为0,定义sigmoid函数和代价函数,用于映射输入值、度量预测与实际标签的差距,以及评估模型准确性。

在梯度下降优化中,通过迭代更新模型参数,减小代价函数的值,以找到最优模型参数。

预测阶段利用训练好的模型参数对测试集进行预测,计算模型的准确率,通过sigmoid函数输出的预测值表示学生被录取的概率。

决策边界绘制中,定义决策边界的阈值,生成网格点,通过对网格点预测和contourf函数绘制决策边界,直观观察模型的分类效果。使用scatter函数将训练集样本点绘制在图上,以不同颜色表示通过和不通过考试的学生,全面展示了模型的分类结果。

此实验深入理解了逻辑回归算法的原理和应用,并通过代码实现了相关功能。


致读者

风自火出,家人;君子以言有物而行有恒

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

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

相关文章

通过注释来埋点

目录 开始 插件编写 功能一 功能二 功能三 合并功能 运行代码 总结 这篇文章主要讲如何根据注释,通过babel插件自动地,给相应函数插入埋点代码,在实现埋点逻辑和业务逻辑分离的基础上,配置更加灵活 这篇文章想要达到的效…

idea查看UML类图

idea查看UML类图 一、如何查看UML类图 1.1 选择需要查看的类或者包,鼠标右键,选择Diagrams->Show Diagram 1.2 对于UML类图中的包,选中后点击鼠标右键-> Expand Nodes(展开节点) 展开前 展开后 1.3 展开后分布比较凌乱&#xff…

inner join left join 什么情况效果相同

效果不同的情况 SELECT g.name AS groupName, g.root_code AS rootCode, g.data_sort AS groupDataSort, l.* FROM wise_system_point_group g LEFT JOIN wise_system_point_list l ON g.code l.group_code WHERE g.code "drug" ORDER BY g.data_sort, l.data_s…

DBA_IND_STATISTICS 字段含义

功能 展示数据库中所有索引的优化器统计信息。 字段说明 参考:https://www.oceanbase.com/docs/enterprise-oceanbase-database-cn-10000000000885743

骨传导式蓝牙耳机值得入手吗?盘点最值得入手的5款骨传导耳机

在骨传导耳机还没有火之前,相信很多朋友都是使用入耳式和头戴式耳机比较多一点,但是慢慢的会发现,这两种耳机都存在很大的问题,比如说入耳式耳机,长时间佩戴会造成耳朵痛等问题,而头戴式耳机因为隔音效果好…

一文解释对比学习

对比学习是一种无监督学习技术,其核心思想是通过比较不同样本之间的相似性和差异性来学习数据的表示(features)。它不依赖于标签数据,而是通过样本之间的相互关系,使得模型能够学习到有意义的特征表示。 在对比学习中…

金融行业备份容灾:如何满足严格行业标准同时实现成本效益优化?

北京时间11月9日,中国工商银行股份有限公司在美全资子公司——工银金融服务有限责任公司(ICBCFS)遭受勒索软件攻击,导致部分业务系统中断,造成部分市场的重大损失。中国工商银行的这次网络攻击事件也再次凸显了金融系统…

[Mac软件]Adobe XD(Experience Design) v57.1.12.2一个功能强大的原型设计软件

Adobe XD是一个直观、强大的UI/UX开发工具,旨在设计、原型设计、用户之间共享材料,以及通过数字技术设计交互。Adobe XD为您提供开发网站、应用程序、语音界面、游戏界面、电子邮件模板等所需的一切。 无限制地创建 设计各种互动,创建看起来…

一起学docker系列之三docker的详细安装步骤

目录 前言1. 准备环境2. 卸载已有的Docker3. 安装编译工具4. 安装必需的软件5. 配置镜像仓库6. 更新YUM软件包索引7. 安装Docker CE8. 启动Docker9. 测试Docker10. 卸载Docker结语 前言 安装Docker是一项重要的任务,因为它为应用程序提供了容器化的环境&#xff0c…

SAP 比较两个内表记录的差异及取元素域值

一、比较两个内表记录的差异,可以使用FM:CTVB_COMPARE_TABLES来比较两个内表间的差异,有那些纪录是新增的,那些是修改过的和那些是被删除的。 CALL FUNCTION CTVB_COMPARE_TABLESEXPORTINGtable_old old_tab[]table_new new_t…

【寒武纪(9)】MLU架构

⼀个MLU 设备由 Memory ⼦系统、MTP(Multi Tensor Processor)⼦系统、Media ⼦系统等构成。MTP⼦系统是寒武纪MLU 架构的核⼼。 文章目录 TP1 架构TP2 架构TP3 1⾯向不同 MLU 架构的 Cambricon BANG 编程最佳实践1.1 Device 级异构调优指南1.2 Cluster …

【VSCode】Visual Studio Code 下载与安装教程

前言 Visual Studio Code(简称 VS Code)是一个轻量级的代码编辑器,适用于多种编程语言和开发环境。本文将介绍如何下载和安装 Visual Studio Code。 下载安装包 首先,我们需要从官方网站下载 Visual Studio Code 的安装包。请访…

d3dx9_39.dll丢失怎么修复?d3dx9_39.dll丢失的四种修复办法分享

d3dx9_39.dll是DirectX库中的一个重要组件,属于Microsoft Direct3D 9 API。它提供了许多用于创建和渲染3D图形的函数。DirectX是一套开发多媒体应用程序的API,广泛应用于游戏、视频和图形处理等领域。d3dx9_39.dll文件主要负责处理3D图形渲染、动画、光源…

[C/C++]数据结构 链表OJ题:随机链表的复制

题目描述: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新…

Python武器库开发-flask篇之URL重定向(二十三)

flask篇之URL重定向(二十三) 通过url_for()函数构造动态的URL: 我们在flask之中不仅仅是可以匹配静态的URL,还可以通过url_for()这个函数构造动态的URL from flask import Flask from flask import url_forapp Flask(__name__)app.route(/) def inde…

B031-网络编程 Socket Http TomCat

目录 计算机网络网络编程相关术语IP地址ip的概念InerAdress的了解与测试 端口URLTCP、UDP和7层架构TCPUDPTCP与UDP的区别和联系TCP的3次握手七层架构 Socket编程服务端代码客户端代码 http协议概念Http报文 Tomcat模拟 计算机网络 见文档 网络编程相关术语 见文档 IP地址 …

Python--快速入门四

Python--快速入门四 1.Python函数 1.在括号中放入函数的参数。 2.可以通过return在函数作用域外获取函数作用域内的值。(默认的return值为None) 代码展示:BMI计算函数 def calculate_BMI(fuc_height,fuc_weight):fuc_BMI fuc_weight/(fuc_height**2)return fuc…

转载:YOLOv8改进全新Inner-IoU损失函数:扩展到其他SIoU、CIoU等主流损失函数,带辅助边界框的损失

0、摘要 随着检测器的快速发展,边界框回归(BBR)损失函数不断进行更新和优化。然而,现有的 IoU 基于 BBR 仍然集中在通过添加新损失项来加速收敛,忽略了 IoU 损失项本身的局限性。尽管从理论上讲,IoU 损失可…

Linux-查询目录下包含的目录数或文件数

1. 前置 1)ls Linux最常用的命令之一,列出该目录下的包含内容。 -l:use a long listing format-以列表的形式展现 -R:list subdirectories recursively-递归列出子目录 2)| 管道符 将上一条命令的输出&#xff…

BUUCTF 被劫持的神秘礼物 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 某天小明收到了一件很特别的礼物,有奇怪的后缀,奇怪的名字和格式。小明找到了知心姐姐度娘,度娘好像知道这是啥,但是度娘也不知道里面是啥。。。你帮帮小明&#xff1…