Python | 机器学习之逻辑回归

🌈个人主页: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.mfbz.cn/a/151531.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

不可错过的10本架构师必读书籍,带你嗨翻架构师之路,三连评论送书!

书籍目录 一:书前开胃菜 二:高并发架构实战 三:架构师的自我修炼 四:中台架构与实现 五:分布式系统架构 六:流程自动化实战 七:分布式系统架构与开发 八:服务端开发 九&am…

代码随想录图论|130. 被围绕的区域 417太平洋大西洋水流问题

130. 被围绕的区域 **题目:**给你一个 m x n 的矩阵 board ,由若干字符 ‘X’ 和 ‘O’ ,找到所有被 ‘X’ 围绕的区域,并将这些区域里所有的 ‘O’ 用 ‘X’ 填充。 题目链接:130. 被围绕的区域 解题思路&#xff1a…

基于springboot实现“漫画之家”系统项目【项目源码+论文说明】

基于springboot实现“漫画之家”系统演示 摘要 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生&am…

FreeSWITCH案例跟踪之一,sip bye发不出去

报故障的说&#xff0c;网关呼叫fs&#xff0c;网关收不到fs的sip bye Wireshark看call-flow, 是这样的&#xff1a; INVITE里面的contact是<sip:172.23.4.109:5060;transporttcp> 于是Wireshark设置过滤条件为ip.addr 172.23.4.109 and tcp.port 5060 fs tcp连网关被…

提高生存能力的7个关键技巧!

作为一款备受热议和玩家喜爱的多人在线射击游戏&#xff0c;《绝地求生》中生存能力的提高是取得胜利的关键。在这篇实用干货分享中&#xff0c;我们将详细说明7个关键技巧&#xff0c;帮助你在游戏中提高生存能力&#xff0c;获得更多胜利。 1.选择降落点&#xff1a;选择适合…

make和makefile

一、认识make和Makefile 1、会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成大型工程的能力 2、一个工程中的源文件不计数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;makefile定义了一系列的规则来指定&#xff0c;哪些文件需要先编译…

java版直播商城平台规划及常见的营销模式 电商源码/小程序/三级分销+商城免费搭建

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

Windows10关闭系统自动更新

1.背景 2.步骤 第一步: 第二步: 完美

笔记本电脑没有声音?几招恢复声音流畅!

笔记本电脑已经成为我们日常生活和工作的重要工具&#xff0c;而其中的声音是其功能之一。然而&#xff0c;有时您可能会遇到笔记本电脑没有声音的问题&#xff0c;这可能是由多种原因引起的。在本文中&#xff0c;我们将深入探讨笔记本电脑没有声音的常见原因&#xff0c;并提…

jbase实现通用码表

没有通用码表的体系是不完美的&#xff0c;当年我用C#能实现的通用码表&#xff0c;现在在java一样的实现了&#xff0c;通用码表对提高开发效率和降低开发成本的作用巨大&#xff0c;开发可以专注写业务&#xff0c;而不必被太多的维护界面束缚。进而体现在产品竞争力上面&…

加密狗作用是什么?工作原理及使用方法

加密狗是一种用于软件保护的硬件设备&#xff0c;通常被用于防止软件被非法复制、篡改或者恶意使用。以下是加密狗的作用、工作原理及使用方法&#xff1a; 作用 加密狗的主要作用是提供软件保护&#xff0c;它能够通过加密算法对软件进行加密&#xff0c;以防止软件被非法复制…

从0开始学习JavaScript--JavaScript 类和模块详解

JavaScript的类和模块是现代Web开发中的重要组成部分&#xff0c;它们提供了一种更面向对象的编程方式和模块化的组织代码方式。本文将深入探讨JavaScript中类和模块的各个方面&#xff0c;并通过丰富的示例代码来帮助大家更好地理解和运用这些概念。 1. 类的基本概念与语法 …

Linux编译器:gcc/g++的使用

我们在学习编译器时&#xff0c;我们不仅要只会使用编译器&#xff0c;还要理解程序的编译过程。一个程序存在两个不同的环境。第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令&#xff1b;第2种是执行环境&#xff0c;它用于实际执行代码。本篇文章将…

Linux C 进程间通信

进程间通信 概述进程间通信方式管道概述管道函数无名管道 pipe有名管道 makefifo删除有名管道 rmove 有名管道实现 双人无序聊天 例子 信号信号概述信号处理过程信号函数传送信号给指定的进程 kill注册信号 signal查询或设置信号处理方式 sigaction设置信号传送闹钟 alarm 有名…

【ONE·Linux || 网络基础(三)】

总言 主要内容&#xff1a;HTTP和HTTPS工作方式简述。 文章目录 总言6、HTTP协议&#xff08;应用层二&#xff09;6.1、入门认识6.1.1、认识URL6.1.2、urlencode和urldecode 6.2、快速构建6.2.1、快速构建http请求和响应的报文格式6.2.2、http demo6.2.2.1、sock.hpp &&a…

vite环境变量相关

环境变量&#xff1a;根据环境的不同&#xff0c;灵活的自动读取相应的变量。避免了手动修改。 import path from path import postCssPxToRem from postcss-pxtorem import { defineConfig, loadEnv } from vite import createVitePlugins from ./vite/plugins import copy f…

【LeetCode刷题笔记】二叉树(三)

701. 二叉搜索树中的插入操作 解题思路: 1. 模拟 ,如果 根节点为空 ,就用 插入值创建根节点 直接返回。否则, cur 从 根节点 开始,比较 当前节点的值和插入值的大小关系 : 1)如果 插入值 < cur ,就

一张图系列 - “position_embedding”

关于位置编码&#xff0c;我感觉应该我需要知道点啥&#xff1f; 0、需要知道什么知识&#xff1f; multi head atten 计算 复数的常识 1、embedding 是什么&#xff1f; position embedding常识、概念&#xff0c;没有会怎样&#xff1f; 交换token位置&#xff0c;没有P…

vue手动搭建脚手架(保姆式教案)

目录 1.创建项目 1.node.js环境搭建 2.安装vue-cli 3.搭建项目 目录结构 1.创建项目 1.node.js环境搭建 下载安装node.js&#xff08;Download | Node.js&#xff09;&#xff0c;安装时不要安装在C盘Windowsr打开cmd管理工具开始输入命令检查node.js是否安装和版本号&a…

在IDEA中的DeBug调试技巧

一、条件断点 循环中经常用到这个技巧&#xff0c;例如&#xff1a;遍历1个List的过程中&#xff0c;想让断点停在某个特定值。 参考上图&#xff0c;在断点的位置&#xff0c;右击断点旁边的红点&#xff0c;会出来1个界面&#xff0c;在Condition这里填写断点条件即可&#…