神经网络 | 基于多种神经网络模型的轴承故障检测

Hi,大家好,我是半亩花海。本文主要源自《第二届全国技能大赛智能制造工程技术项目比赛试题(样题) 模块 E 工业大数据与人工智能应用》,基于给出的已知轴承状态的振动信号样本,对数据进行分析,建立轴承故障诊断模型,对未知状态的振动信号样本进行预测,判断该样本属于哪种状态。


目录

技术描述

任务说明

任务一

一、导入必要库

二、读取并处理训练数据

三、绘制比例分布饼图

任务二

一、导入必要库

二、数据预处理

2.1 数据切片和分层抽样

2.2 轴承振动信号检视-时域分析

2.3 频域功率谱的分布

三、模型构建与训练

3.1 循环神经网络模型 (RNN)

3.3.1 构建 RNN 模型

3.3.2 训练 RNN 模型

3.1.3 可视化训练结果 (RNN)

3.2 卷积神经网络模型 (CNN)

3.2.1 构建 CNN 模型

3.2.2 训练 CNN 模型

3.2.3 可视化训练结果 (CNN)

3.3 多层感知器模型 (MLP)

3.3.1 构建 MLP 模型

3.3.2 训练 MLP 模型

3.3.3 可视化训练结果 (MLP)

四、模型预测

4.1 数据预处理

4.2 模型预测和结果保存

五、结果分析


技术描述

轴承是当代机械设备中一种重要零部件。它的主要功能是支撑机械旋转体,降低其运动过程中的摩擦系数,并保证其回转精度。由于轴承的关键作用和广泛使用,其健康状况直接影响着所在设备运行的稳定性与安全性,因此轴承故障的早期诊断具有重要意义。

传统的轴承故障诊断方法包括听声音、手持设备点检和测温度等,但是这些方法的缺点是对人的经验与感觉强依赖,难以传承和标准化,且实时性和精确性较差,往往检测到故障时故障已经很严重了。为了克服这些传统轴承故障诊断方法的缺点,现在轴承故障诊断的研究领域主要聚焦在将振动分析和大数据、人工智能等技术相结合,采用机理+数据驱动的方法来提升轴承故障诊断的效果。

常见的轴承故障如下图所示:

本试题的任务是基于给出的已知轴承状态(包括健康状态和不同故障状态)的振动信号样本,对数据进行分析,建立轴承故障诊断模型,对未知状态的振动信号样本进行预测,判断该样本属于哪种状态。

所提供的数据中包含 4 种不同状态的轴承振动信号样本,包括健康状态和 3 种不同的故障状态。每个样本为一组连续采集的轴承振动信号,下表为轴承振动信号的基本信息。

采样率50Hz
轴承转速13.33Hz
每组振动信号长度40960

每一组振动信号样本对应一个轴承状态标签,下表为 4 种不同轴承状态的标签和相应的说明。

标签说明
normal健康
inner内圈故障
outer外圈故障
roller滚动体故障

数据分为样本数据、样本标签和测试数据,样本数据混合了4种状态的样本,样本标签是各样本对应的轴承状态,测试数据是未知状态待检测的样本。数据存储在工业大数据平台中(有需要训练集和测试集的朋友可以在评论区或者私信我,train.csvtest_data.csv 文件如下)。


任务说明

任务一

从工业大数据平台中查询数据,分析各种状态类型轴承样本的数量,制作一张比例分布饼图,要求有图例和占比数字标签。


一、导入必要库

import pandas as pd
import matplotlib.pyplot as plt
import warnings

warnings.filterwarnings("ignore")  # 忽略警告信息
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置黑体样式
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号

二、读取并处理训练数据

train_data = pd.read_csv('train.csv')
labels = train_data['label']  # 提取标签列
print(train_data)
# 统计各标签数量并转换为字典
count_dict = labels.value_counts().to_dict()


三、绘制比例分布饼图

# 提取标签和对应的数量用于饼图
labels = list(count_dict.keys())
sizes = list(count_dict.values())
colors = ['blue', 'green', 'red', 'yellow']  # 为每个扇形定义颜色

# 制作比例分布饼图
fig, ax = plt.subplots(figsize=(6, 6))  # 创建一个大小为6x6的figure对象
ax.pie(sizes, labels=labels, colors=colors, autopct='%1.1f%%', startangle=90, textprops={'fontsize': 12})  # 在ax上绘制饼图
# ax = plt.gca()  # 返回坐标轴
ax.legend(loc='upper right', bbox_to_anchor=(1.1, 1.1), fontsize=10)  # 添加图例
ax.axis('equal')  # 保持纵横比相等, 确保饼图呈圆形
plt.title('轴承状态类型比例分布', fontsize=15)  # 设置饼图标题

plt.show()  # 显示饼图


任务二

对样本数据进行分析,使用 Python 编程语言建立人工智能预测模型,通过模型判断测试数据对应的轴承状态,并保存在如下格式要求的文件中。


一、导入必要库

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from tensorflow.keras.layers import Conv1D, SimpleRNN, MaxPooling1D, Flatten, Dense, Dropout
from tensorflow.keras.utils import to_categorical
from tensorflow.keras import Sequential
from collections import defaultdict
import warnings

warnings.filterwarnings("ignore")  # 忽略警告信息
# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 设置黑体样式
plt.rcParams['axes.unicode_minus'] = False  # 正常显示负号

二、数据预处理

2.1 数据切片和分层抽样
# 读取训练数据
data = pd.read_csv('train.csv')

# 将标签编码为数字
label_encoder = LabelEncoder()
data['label'] = label_encoder.fit_transform(data['label'])

# 数据切片处理
X = []
y = []
for i in range(len(data)):
    row = data.iloc[i, 1:].values  # 选择第i行的所有列(除第1列), 再将 DataFrame 行转换为 NumPy 数组
    row_reshaped = np.reshape(row[:len(row) // 512 * 512], (-1, 512))  # 将一维数组 row 切片并重新形状为一个二维数组, 每行包含512个元素
    X.extend(row_reshaped)  # 将二维数据展开成一维数组
    y.extend(np.tile(data.iloc[i, 0], row_reshaped.shape[0]))  # 在给定方向上重复数组: np.tile(要重复的数组, 重复的次数)
X = np.array(X)
y = np.array(y)

# 对标签进行独热编码
y = to_categorical(y)

# 将数据集分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)  # 设置测试集占比25%, 随机种子42
2.2 轴承振动信号检视-时域分析

通过检视数据对信号进行时域分析,可以看到数据集中收集的是一个维度的振动信号,不同的标签对应的信号振幅应该有所不同。

f, ax = plt.subplots(2,2,figsize=(32,16))
state_list = ['normal', 'inner', 'outer', 'roller']
for i in range(2):
    for j in range(2):
        current_ax = ax[j][i]
        current_ax.title.set_text(state_list[2*j+i])
        # 提取数据
        current_data = list(data[data.label==2*j+i].iloc[0][1:513])
        # 绘制线图,并设置线宽、标记大小
        sns.lineplot(data=current_data, ax=current_ax, linewidth=2, markersize=10)
        # 调整横轴和纵轴刻度标签的字体大小
        current_ax.tick_params(axis='x', labelsize=16)
        current_ax.tick_params(axis='y', labelsize=16)
        # 调整标题的字体大小
        current_ax.title.set_fontsize(24)
plt.show()  # 显示图形

2.3 频域功率谱的分布

通过快速傅立叶变换对频域的功率谱做一个快速的可视化。

f, ax = plt.subplots(2,2,figsize=(32,16))
state_list = ['normal', 'inner', 'outer', 'roller']
for i in range(2):
    for j in range(2):
        current_ax = ax[j][i]
        current_ax.title.set_text(state_list[2*j+i])
        # 提取数据
        current_data = data[data.label==2*j+i].iloc[0][1:513]
        # 计算FFT
        fft = np.fft.fft(current_data)
        # 绘制线图,并设置线宽、标记大小
        sns.lineplot(data=(fft.real ** 2 - fft.imag ** 2), ax=current_ax, linewidth=2, color='red')
        # 调整横轴和纵轴刻度标签的字体大小
        current_ax.tick_params(axis='x', labelsize=16)
        current_ax.tick_params(axis='y', labelsize=16)
        # 调整标题的字体大小
        current_ax.title.set_fontsize(24)
plt.show()  # 显示图形


三、模型构建与训练

3.1 循环神经网络模型 (RNN)

循环神经网络 (Recurrent Neural Network,RNN) 是一类具有短期记忆能力的神经网络。在循环神经网络中,神经元不但可以接受其它神经元的信息,也可以接受自身的信息,形成具有环路的网络结构。RNN具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。

RNN 网络中第 t 次的隐含层状态的计算公式为:

S_t = f(W*S_{t-1} + U*X_t)

RNN 网络的特点:

  • 这里的W,U,V在每个时刻都是相等的(权重共享)
  • 隐藏状态可以理解为: S=f(现有的输入+过去记忆总结)

以下是一种典型的 RNN 结构中 Hidden Layer 层级展开图:

3.3.1 构建 RNN 模型
# 构建RNN模型
rnn_model = Sequential()
rnn_model.add(SimpleRNN(64, activation='relu', input_shape=(512, 1), return_sequences=True))  # SimpleRNN层, 64个单元, 激活函数ReLU, 输入形状(512, 1)
rnn_model.add(MaxPooling1D(pool_size=2))  # 一维最大池化层, 窗口大小为2
rnn_model.add(Flatten())  # 将多维数据展平为一维
rnn_model.add(Dense(128, activation='relu'))  # 全连接层, 4个神经元, 激活函数为relu
rnn_model.add(Dropout(0.5))  # Dropout层, 丢弃率为0.5, 减少过拟合风险
rnn_model.add(Dense(4, activation='softmax'))  # 全连接层, 4个神经元, 激活函数为softmax
rnn_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])  # 编译RNN模型 (交叉熵损失函数, Adam优化器,评估指标为准确率)
3.3.2 训练 RNN 模型
# 训练RNN模型
history = rnn_model.fit(X_train.reshape(-1, 512, 1), y_train, epochs=30, batch_size=32,
                        validation_data=(X_test.reshape(-1, 512, 1), y_test))

3.1.3 可视化训练结果 (RNN)
# 绘制RNN模型的损失率和准确率曲线
plt.figure(figsize=(8, 5))
plt.plot(history.history['loss'], color='orange', label='training_loss')  # 训练集损失率
plt.plot(history.history['val_loss'], color='red', label='val_loss')  # 验证集损失率
plt.plot(history.history['accuracy'], color='green', label='training_acc')  # 训练集准确率
plt.plot(history.history['val_accuracy'], color='blue', label='val_acc')  # 验证集准确率
plt.title('RNN Model')
plt.legend(fontsize=11)
plt.xlabel('Epochs', fontsize=12)
plt.ylabel('RNN_loss/acc', fontsize=12)
plt.ylim(0, 1)  # 设置纵坐标范围为0-1
plt.show()

3.2 卷积神经网络模型 (CNN)

CNN 网络是一种带有卷积结构的前馈神经网络,卷积结构可以减少深层网络占用的内存量,其中三个关键操作——局部感受野、权值共享、池化层,有效的减少了网络的参数个数,缓解了模型的过拟合问题。

CNN 网络的主要结构如下:

输入层卷积层激活层池化层光栅化全连接层激活层输出层
输入数据使用卷积核特征提取和映射非线性映射下采样降维展开像素, 联接全连接层在尾部进行拟合, 减少特征损失非线性映射输出结果

CNN 网络的结构可视化如下:

3.2.1 构建 CNN 模型
# 构建CNN模型
Conv1D_model = Sequential()
Conv1D_model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(512, 1)))  # 一维卷积层, 64个滤波器, 大小3, 激活函数relu, 输入形状(512, 1)
Conv1D_model.add(MaxPooling1D(pool_size=2))  # 一维最大池化层, 窗口大小为2
Conv1D_model.add(Flatten())  # 将多维数据展平为一维
Conv1D_model.add(Dense(128, activation='relu'))  # 全连接层, 128个神经元, 激活函数relu
Conv1D_model.add(Dropout(0.5))  # Dropout层, 丢弃率为0.5, 减少过拟合风险
Conv1D_model.add(Dense(4, activation='softmax'))  # 全连接层, 4个神经元, 激活函数为softmax
Conv1D_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])  # 编译CNN模型 (交叉熵损失函数, Adam优化器,评估指标为准确率)
3.2.2 训练 CNN 模型
# 训练CNN模型
history = Conv1D_model.fit(X_train.reshape(-1, 512, 1), y_train, epochs=30, batch_size=32,
                           validation_data=(X_test.reshape(-1, 512, 1), y_test))

3.2.3 可视化训练结果 (CNN)
# 绘制CNN模型的损失率和准确率曲线
plt.figure(figsize=(8, 5))
plt.plot(history.history['loss'], color='orange', label='training_loss')  # 训练集损失率
plt.plot(history.history['val_loss'], color='red', label='val_loss')  # 验证集损失率
plt.plot(history.history['accuracy'], color='green', label='training_acc')  # 训练集准确率
plt.plot(history.history['val_accuracy'], color='blue', label='val_acc')  # 验证集准确率
plt.title('CNN Model')
plt.legend(fontsize=11)
plt.xlabel('Epochs', fontsize=12)
plt.ylabel('CNN_loss/acc', fontsize=12)
plt.ylim(0, 1)  # 设置纵坐标范围为0-1
plt.show()

3.3 多层感知器模型 (MLP)

多层感知器也叫人工神经网络,除了输入层和输出层,它中间可以有多个隐层,最简单的 MLP 只含一个隐层,即三层的结构。MLP 神经网络属于前馈神经网络的一种。在网络训练过程中,需要通过反向传播算法计算梯度,将误差从输出层反向传播回输入层,用于更新网络参数。

MLP 模型的结构如下:

3.3.1 构建 MLP 模型
# 构建MLP模型
mlp_model = Sequential()
mlp_model.add(Dense(256, activation='relu', input_shape=(512,)))  # 全连接层,256个神经元,激活函数ReLU,输入形状(512,)
mlp_model.add(Dropout(0.5))  # Dropout层,丢弃率为0.5,减少过拟合风险
mlp_model.add(Dense(128, activation='relu'))  # 全连接层,128个神经元,激活函数ReLU
mlp_model.add(Dropout(0.5))  # Dropout层
mlp_model.add(Dense(64, activation='relu'))  # 全连接层,64个神经元,激活函数ReLU
mlp_model.add(Dropout(0.5))  # Dropout层
mlp_model.add(Dense(4, activation='softmax'))  # 输出层,4个神经元(对应4个类别),激活函数Softmax
mlp_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])  # 编译MLP模型 (交叉熵损失函数, Adam优化器,评估指标为准确率)
3.3.2 训练 MLP 模型
# 训练MLP模型
history = mlp_model.fit(X_train.reshape(-1, 512), y_train, epochs=50, batch_size=32,
                            validation_data=(X_test.reshape(-1, 512), y_test))

3.3.3 可视化训练结果 (MLP)
# 绘制MLP模型的损失率和准确率曲线
plt.figure(figsize=(8, 5))
plt.plot(history.history['loss'], color='orange', label='training_loss')  # 训练集损失率
plt.plot(history.history['val_loss'], color='red', label='val_loss')  # 验证集损失率
plt.plot(history.history['accuracy'], color='green', label='training_acc')  # 训练集准确率
plt.plot(history.history['val_accuracy'], color='blue', label='val_acc')  # 验证集准确率
plt.title('MLP Model')
plt.legend(fontsize=11)
plt.xlabel('Epochs', fontsize=12)
plt.ylabel('MLP_loss/acc', fontsize=12)
plt.ylim(0, 1)  # 设置纵坐标范围为0-1
plt.show()


四、模型预测

4.1 数据预处理
# 读取测试数据
test_data = pd.read_csv('test_data.csv')

# 测试集数据预处理
X_test = []
sample_names = []
for i in range(len(test_data)):
    row = test_data.iloc[i, 1:].values
    row_reshaped = np.reshape(row[:len(row) // 512 * 512], (-1, 512))
    X_test.extend(row_reshaped)
    sample_names.extend([f"sample {i}"] * row_reshaped.shape[0])
X_test = np.array(X_test)
4.2 模型预测和结果保存
# 定义一个模型预测并结果保存的函数
def predict_and_save(model, X_test, output_filename):
    # 使用模型进行预测
    predictions = model.predict(X_test)
    # 获取预测结果中概率最高的类别
    predicted_labels = np.argmax(predictions, axis=1)

    # 定义类别映射关系,将数值标签映射到相应的类别
    labels_mapping = {0: 'normal', 1: 'inner', 2: 'outer', 3: 'roller'}
    predicted_classes = [labels_mapping[label] for label in predicted_labels]

    # 创建包含样本名和预测类别的 DataFrame
    final_predictions = pd.DataFrame({'name': sample_names, 'type': predicted_classes})
    # 对每个样本取众数(出现频率最高的类别)
    final_predictions = final_predictions.groupby('name')['type'].agg(lambda x: x.mode().iat[0]).reset_index()

    # 从样本名中提取样本编号并对 DataFrame 进行排序
    final_predictions['name'] = final_predictions['name'].apply(lambda x: int(x.split(' ')[-1]))
    final_predictions = final_predictions.sort_values(by='name')

    # 格式化样本名并将结果保存到 csv 文件中(不保存行索引)
    final_predictions['name'] = final_predictions['name'].apply(lambda x: f"sample {x}")
    final_predictions.to_csv(output_filename, index=False)


# 调用 predict_and_save 函数对模型进行预测并保存结果
predict_and_save(rnn_model, X_test.reshape(-1, 512, 1), 'test_rnn.csv')
predict_and_save(Conv1D_model, X_test.reshape(-1, 512, 1), 'test_cnn.csv')
predict_and_save(mlp_model, X_test.reshape(-1, 512), 'test_mlp.csv')


五、结果分析

通过读取每个模型的测试结果文件,输出各个标签的数量,并且以直方图来可视化三个模型的标签数量。结果显示 RNN、CNN 和 MLP 模型预测的结果相同

# 读取各个模型的测试结果文件
rnn_result = pd.read_csv('test_rnn.csv')
cnn_result = pd.read_csv('test_cnn.csv')
mlp_result = pd.read_csv('test_mlp.csv')

# 输出各个标签的数量
def output_label_counts(result, model_name):
    label_counts = result['type'].value_counts()
    print(f"\n{model_name} Label Counts:")
    for label in ['normal', 'inner', 'outer', 'roller']:
        count = label_counts.get(label, 0)
        print(f"{label}: {count}")

output_label_counts(rnn_result, 'RNN')
output_label_counts(cnn_result, 'CNN')
output_label_counts(mlp_result, 'MLP')

# 可视化各个模型的标签数量(直方图)
plt.figure(figsize=(8, 5))
def plot_label_counts(result, model_name, index, color):
    label_counts = result['type'].value_counts()
    counts_in_order = [label_counts.get(label, 0) for label in ['normal', 'inner', 'outer', 'roller']]
    
    plt.bar(np.arange(len(counts_in_order)) + 0.2 * index, counts_in_order, width=0.2, label=model_name, color=color)

# 绘制三个模型的直方图并指定颜色
plot_label_counts(rnn_result, 'RNN', 0, 'blue')
plot_label_counts(cnn_result, 'CNN', 1, 'green')
plot_label_counts(mlp_result, 'MLP', 2, 'orange')

# 添加图例、标题和标签
plt.legend()
plt.title('Label Counts Comparison')
plt.xlabel('Label')
plt.ylabel('Count')
plt.xticks(np.arange(4) + 0.2, ['normal', 'inner', 'outer', 'roller'], rotation=45, ha='right')
plt.show()

RNN Label Counts:

normal: 6

inner: 13

outer: 14

roller: 15

CNN Label Counts:

normal: 6

inner: 13

outer: 14

roller: 15

MLP Label Counts:

normal: 6

inner: 13

outer: 14

roller: 15

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

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

相关文章

修改MFC图标

摘要:本文主要讲解了MFC程序窗口图标的添加、任务栏、底部托盘的图标添加,以及所生成的exe文件图标的添加。 ​​​​​​​1、在资源视图添加Icon资源 透明图标怎么制作? 1)点击图片》右键:使用画图3D进行编辑 2&a…

关于Django部署

首先了解一下开发环境服务器跟生产环境服务器有何不同。 一、我们通过 python manage.py runserver 启动开发环境服务器,这条命令背后做了哪些事情? 1、首先加载Django项目的设置(settings) 2、检查数据库迁移,确保数…

蓝桥杯备战——13.PCF8591芯片的使用

目录 1.芯片简介2.读写时序3.控制字4.代码封装库5.原理图分析6.使用示例 1.芯片简介 截取自NXP的PCF8591芯片数据手册,我把重点关注部分划出来了,请务必自行阅读一遍数据手册! 2.读写时序 ①器件地址: Bit0决定是读还是写操作&…

python打造光斑处理系统7:沿割线的像素灰度分布

文章目录 单角度切割多角度切割绘图 光斑处理:python处理高斯光束的图像 光斑处理系统: 程序框架🌟打开图像🌟参数对话框/伪彩映射🌟裁切ROI光强分布🌟高斯拟合 单角度切割 在查看光斑分布时&#xff0c…

【C生万物】初始C语言

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 | 《数据结构与算法》 | 《C生万物》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有…

合并分支rebase和merge的区别

文章目录 一、前言1.1、master分支1.2、dev分支 二、合并2.1、git merge2.2、git rebase 三、总结四、最后 一、前言 实际开发工作的时候,我们都是在自己的分支开发,然后将自己的分合并到主分支,那合并分支用2种操作,这2种操作有…

maven项目管理工具安装和配置

文章目录 1.1 软件下载安装1.1.2 软件安装 1.2 软件配置1.2.1 软件环境配置1.2.2 软件版本测试1.2.3 maven 配置1.2.3.1 仓库配置1.2.3.2 镜像配置1.2.3.3 配置 JDK 1.3 IDEA 结合 Maven 使用 1.1 软件下载安装 首先我们需要去 Maven 官方下载安装软件,本文使用的是…

【深度测试】看到技术方案后,该怎么进行分析和测试

测试左移的思想,讲究尽早测试,测试是一系列的行为,并不一定要等代码运行起来才能测,下面会分享一些经验,提供大家参考。 一、静态分析 1.1 分析方法调用链 目标:梳理结构,化繁为简 原理&#…

Qt多语言翻译

Qt多语言翻译概述 Qt提供了非常简单易用的多语言翻译机制,其核心类为QTranslator.概括来说就是利用Qt的lupdate工具将项目中所有tr函数包裹的字符串提取到.ts文件中,然后使用Qt Linguist由专门的翻译人员对提取的.ts文件进行逐个单词短语的翻译工作. 翻译…

springboot153相亲网站

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

在WORD中设置公式居中编号右对齐设置方式

1 软件环境 Office Microsoft Office LTSC 专业增强版2021 2 最终效果 3 操作步骤 编辑公式;光标定位到公式的最后(不是行的最后);输入#编号光标定位在公式最后(不是行的最后),按Enter键回车…

【Linux系统 01】Vim工具

目录 一、Vim概述 1. 文件打开方式 2. 模式切换 二、命令模式 1. 移动与跳转 2. 复制与粘贴 3. 剪切与撤销 三、编辑模式 1. 插入 2. 替换 四、末行模式 1. 保存与退出 2. 查找与替换 3. 分屏显示 4. 命令执行 一、Vim概述 1. 文件打开方式 vim 文件路径&#…

【CSS】css获取子元素的父元素,即通过子元素选择父元素(使用CSS伪类 :has() :not() )

这里写目录标题 一、:has获取第一个div获取包含 a.active 的 li获取第二个div 二、:not除了类名为active 的 a,其他的a的字体都为18px <div><h1>标题</h1></div><div><ul><li><a href"#" class"active">测…

Filter与Listener(Java Web)

Filter与Listener(Java Web) 概念&#xff1a;Filter表示过滤器&#xff0c;是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控制、…

mysql按周统计数据简述

概述 业务中经常会遇到按年月日统计的场景&#xff1b; 但有时会有按周统计的情况&#xff1b; 我一般是用2中方法去解决&#xff1a; 利用mysql的weekday函数。计算出当前日期是一周中的第几天&#xff0c;然后当前日期 - 这个数值&#xff0c;就可以得到当前周的周一的日期…

Python—数据可视化Seaborn大全:参数详解与实战案例全解析【第52篇—python:Seaborn大全】

文章目录 Seaborn库常用绘图详解与实战引言安装与导入一、散点图参数说明实战案例 二、直方图参数说明实战案例 三、线性关系图参数说明实战案例 四、热力图参数说明实战案例 五、分布图参数说明实战案例 六、箱线图参数说明实战案例 七、联合分布图参数说明实战案例 八、小提琴…

钓鱼攻击:深度解析与防范策略

一、引言 在当今的网络世界中&#xff0c;钓鱼攻击已经成为一种日益猖獗的威胁。这种攻击方式利用电子邮件、社交媒体或其他在线平台&#xff0c;伪装成可信赖的来源&#xff0c;诱导受害者点击恶意链接或下载恶意附件&#xff0c;进而窃取个人信息或实施其他恶意行为。本文将…

[SWPUCTF 2021 新生赛]easyupload2.0

一开始我通过cobaltstrike写一个文件上传的木马它不允许上传php文件 我这边写了一句话木马通过burp拦截修改后缀为phtml然后通过蚁剑找flag

centos7安装oracle

1 安装虚拟机 设置4G内存&#xff0c;硬盘40G 2 配置网络环境 2.1配置主机名 # vi /etc/hostname 修改为 oracle2.2 配置IP地址 # vi /etc/sysconfig/network-scripts/ifcfg-ens33 修改 BOOTPROTO"static" ONBOOT"yes" IPADDR192.168.109.110 NETMAS…

政安晨:示例演绎Python的函数与获取帮助的方法

调用函数和定义我们自己的函数&#xff0c;并使用Python内置的文档&#xff0c;是成为一位Pythoner的开始。 通过我的上篇文章&#xff0c;相信您已经看过并使用了print和abs等函数。但是Python还有许多其他函数&#xff0c;并且定义自己的函数是Python编程的重要部分。 在本…
最新文章