第R4周:LSTM-火灾温度预测(TensorFlow版)

>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客**
>- **🍖 原作者:[K同学啊]**

往期文章可查阅: 深度学习总结

任务说明:数据集中提供了火灾温度(Tem1)、一氧化碳浓度(CO 1)、烟雾浓度(Soot 1)随着时间变化数据,我们需要根据这些数据对未来某一时刻的火灾温度做出预测
🍺要求:
1、了解LSTM是什么,并使用其构建一个完整的程序。
2、R2达到0.83
🍻拔高:
使用第1~8个时刻的数据 预测第9~10个时刻的温度数据。

🚀我的环境:

  • 语言环境:Python3.11.7
  • 编译器:jupyter notebook
  • 深度学习框架:TensorFlow2.13.0

一、理论知识基础

1. LSTM原理

一句话介绍LSTM,他是RNN的进阶版,如果说RNN的最大限度是理解一句话,那么LSTM的最大限度是理解一段话,详细介绍如下:

LSTM,全称为长短期记忆网络(Long Short Term Memory networks),是一种特殊的RNN,能够虚席到长期依赖关系。LSTM由Hochreiter & Schmidhuber(1997)提出,许多研究者进行了一系列的工作对其改进并使之发扬光大。LSTM在许多问题上效果非常好,现在被广泛使用。

所有的循环神经网络都有着重复的神经网络模块形成链的形式。在普通的RNN中,重复模块结构非常简单,其结构如下:

LSTM避免了长期依赖的问题。可以记住长期信息!LSTM内部有较为复杂的结构。能通过门控状态来选择调整传输的信息,记住需要长时间记忆的信息,忘记不重要的信息,其结构如下:

2. LSTM的数据处理流程

 为了更好的理解SLTM输入数据的结构,将时序数据(LSTM输入数据)以可视化的形式呈现。

根据输入的数据结构、预测输出,我们的程序可以大致分为以下六类:

二、前期准备工作

1. 导入数据

打开数据集看到如下图所示:

其中数据集里面的每列的标签含义为:

  • Time:时间
  • Tem1:火灾温度
  • CO 1:一氧化碳浓度
  • Soot 1:烟雾浓度

 后面有关火灾的数据都是随着时间而变化的,我们需要根据这些数据对未来某时刻的火灾温度进行预测。

导入数据:

import tensorflow as tf
import pandas as pd
import numpy as npgpus=tf.config.list_physical_devices("GPU")
if gpus:tf.config.experimental.set_memory_growth(gpus[0],True) #设置GPU显存用量按需使用tf.config.set_visible_devices([gpus[0]],"GPU")
print(gpus)df_1=pd.read_csv("D:\THE MNIST DATABASE\RNN\R4\woodpine2.csv")
print(df_1.head())

代码输出:

[]Time  Tem1  CO 1  Soot 1
0  0.000  25.0   0.0     0.0
1  0.228  25.0   0.0     0.0
2  0.456  25.0   0.0     0.0
3  0.685  25.0   0.0     0.0
4  0.913  25.0   0.0     0.0

由于我的电脑没有安装GPU版本的TensorFlow,故显示"[]"。

同时,读取一个名为"woodpine2.csv"的文件,并将其存储在一个名为df_1的pandas DataFrame中。然后,它打印出这个DataFrame的前几行。

2. 数据可视化

import matplotlib.pyplot as plt
import seaborn as snsplt.rcParams['savefig.dpi']=500 #图片像素
plt.rcParams['figure.dpi']=500 #分辨率fig,ax=plt.subplots(1,3,constrained_layout=True,figsize=(14,3))sns.lineplot(data=df_1["Tem1"],ax=ax[0])
sns.lineplot(data=df_1["CO 1"],ax=ax[1])
sns.lineplot(data=df_1["Soot 1"],ax=ax[2])
plt.show()

运行结果:

使用matplotlib和seaborn库创建了三个并排的折线图。

1. `plt.rcParams['savefig.dpi'] = 500`:这行代码设置保存图像时的分辨率,即每英寸的像素数。如果你将绘制的图像保存为图片文件(比如PNG格式),它的分辨率将是500 DPI。

2. `plt.rcParams['figure.dpi'] = 500`:这行代码设置绘制图像时的分辨率,默认情况下图像在屏幕或笔记本中显示的效果。较高的分辨率值会使图像显示更加清晰和细节丰富。

3. `fig, ax = plt.subplots(1, 3, constrained_layout=True, figsize=(14, 3))`:创建一个图形对象和三个子图(坐标轴),子图按照一行三列的方式排列。`fig` 是图形对象,`ax` 是一个包含三个子图坐标轴的数组,每个子图用于显示一个折线图。`constrained_layout=True`选项确保子图之间的间距合适,不会重叠。 

4. `sns.lineplot(data=df_1["Tem1"], ax=ax[0])`:创建"Tem1"列的折线图,数据来自DataFrame `df_1`。折线图被放置在第一个子图(`ax[0]`)中。`sns.lineplot`是seaborn库中简化绘制折线图的函数。

5. `sns.lineplot(data=df_1["CO 1"], ax=ax[1])`:创建"CO 1"列的折线图,数据同样来自DataFrame `df_1`。折线图被放置在第二个子图(`ax[1]`)中。

6. `sns.lineplot(data=df_1["Soot 1"], ax=ax[2])`:这行代码创建了"Soot 1"列的折线图,数据同样来自DataFrame `df_1`。折线图被放置在第三个子图(`ax[2]`)中。

三、构建数据集

 是从 `df_1` DataFrame 中选取所有行和从第二列开始的所有列,然后将结果赋值给一个新的 DataFrame 变量 `dataFrame`。

dataFram=df_1.iloc[:,1:]
dataFram

运行结果:

1. 设置x、y

width_x=8
width_y=1

取前8个时间段的Tem1、CO 1、Soot 1 为x,第9个时间段的Tem1 为y。

x=[]
y=[]in_start=0for _,_ in df_1.iterrows():in_end=in_start+width_xout_end=in_end+width_yif out_end<len(dataFram):x_=np.array(dataFram.iloc[in_start:in_end, ])x_=x_.reshape((len(x_)*3))y_=np.array(dataFram.iloc[in_end:out_end,0])x.append(x_)y.append(y_)in_start+=1x=np.array(x)
y=np.array(y)x.shape,y.shape

for _, _ in df_1.iterrows():: 此循环遍历了 df_1 中的每一行数据。但是在代码中并没有使用循环中的变量 _,这意味着这个循环仅仅用于迭代,而没有在循环体内使用行的具体数据。 

运行结果:

((5939, 24), (5939, 1))

2. 归一化

from sklearn.preprocessing import MinMaxScaler#将数据归一化,范围是0到1
sc=MinMaxScaler(feature_range=(0,1))
x_scaled=sc.fit_transform(x)
x_scaled.shape

运行结果:

(5939, 24)

 x_scaled.shape: 这行代码打印出 X_scaled 数组的形状。x_scaled 是缩放后的特征矩阵,其形状为 (样本数, 特征数)


x_scaled=x_scaled.reshape(len(x_scaled),width_x,3)
x_scaled.shape

运行结果:

(5939, 8, 3)

 x_scaled = x_scaled.reshape(len(x_scaled), width_x, 3): 这行代码对 x_scaled 进行了 reshape 操作。reshape 函数用于改变数组的形状。在这里,将 x_scaled 数组的形状改为 (样本数, width_x, 3)。width_x 是输入窗口的宽度,而 3 是每个时间步包含的特征数。

3. 划分数据集

取5000之前的数据为训练集,5000之后的为验证集

x_train=np.array(x_scaled[:5000]).astype('float64')
y_train=np.array(y[:5000]).astype('float64')x_test=np.array(x_scaled[5000:]).astype('float64')
y_test=np.array(y[5000:]).astype('float64')
x_train.shape

运行结果:

(5000, 8, 3)

四、构建模型

使用 TensorFlow 中的 Keras API 来构建一个 LSTM(长短期记忆网络)模型

LSTM模型的参数:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM,Bidirectional
from tensorflow.keras import Input# 多层 LSTM
model_lstm=Sequential()
model_lstm.add(LSTM(units=64,activation='relu',return_sequences=True,input_shape=(x_train.shape[1],3)))
model_lstm.add(LSTM(units=64,activation='relu'))model_lstm.add(Dense(width_y))

 构建了一个 LSTM 模型,其中包含两个 LSTM 层和一个 Dense 输出层。LSTM 层用于处理时间序列数据,`return_sequences=True` 设置确保中间的 LSTM 层输出也是一个时间序列,而不仅仅是最后一个时间步的输出。最后的 Dense 层输出预测目标的结果。

1. `from tensorflow.keras.models import Sequential`: 导入 Keras 中的 Sequential 模型类,它允许我们按照顺序将各种层叠加起来构建神经网络。

2. `from tensorflow.keras.layers import Dense, LSTM, Bidirectional`: 导入 Keras 中的 Dense 层(全连接层)、LSTM 层(长短期记忆层)和 Bidirectional 层(双向 LSTM 层)。

3. `from tensorflow.keras import Input`: 导入 Keras 中的 Input 类,用于指定输入数据的形状。

4. `model_lstm = Sequential()`: 创建一个空的 Sequential 模型对象 `model_lstm`。

5. `model_lstm.add(LSTM(units=64, activation='relu', return_sequences=True, input_shape=(X_train.shape[1], 3)))`: 向模型中添加一个 LSTM 层。

   - `units=64`: 表示 LSTM 层中有 64 个神经元。
   - `activation='relu'`: 表示 LSTM 层使用 ReLU(Rectified Linear Unit)激活函数。
   - `return_sequences=True`: 表示 LSTM 层的输出将作为下一个 LSTM 层的输入,而不是仅返回最后一个时间步的输出。
   - `input_shape=(X_train.shape[1], 3)`: 指定输入数据的形状。`X_train` 是输入数据的训练集,它的形状为 `(样本数, 时间步数, 特征数)`,在这里 `X_train.shape[1]` 表示时间步数,而 `3` 表示每个时间步的特征数。

6. `model_lstm.add(LSTM(units=64, activation='relu'))`: 向模型中再添加一个 LSTM 层。

   - `units=64`: 表示 LSTM 层中有 64 个神经元。
   - `activation='relu'`: 表示 LSTM 层使用 ReLU(Rectified Linear Unit)激活函数。

7. `model_lstm.add(Dense(width_y))`: 向模型中添加一个 Dense 层。

   - `width_y`: 这是一个之前定义的变量,表示预测目标的宽度,也就是需要预测的时间步数。
   - 这个 Dense 层用于输出最终的预测结果,因此它的神经元数等于 `width_y`,并且没有指定激活函数,即默认为线性激活函数。

五、模型训练

1. 编译

#只观测loss数值,不观测准确率,所以删去metrics选项
model_lstm.compile(optimizer=tf.keras.optimizers.Adam(1e-3),loss='mean_squared_error') #损失函数用均方误差

2. 训练

x_train.shape,y_train.shape

运行结果:

((5000, 8, 3), (5000, 1))

history_lstm=model_lstm.fit(x_train,y_train,batch_size=64,epochs=40,validation_data=(x_test,y_test),validation_freq=1)

运行结果:

Epoch 1/40
79/79 [==============================] - 3s 11ms/step - loss: 10764.3506 - val_loss: 9891.9375
Epoch 2/40
79/79 [==============================] - 1s 7ms/step - loss: 253.9480 - val_loss: 1172.7687
Epoch 3/40
79/79 [==============================] - 1s 7ms/step - loss: 70.3796 - val_loss: 668.7833
Epoch 4/40
79/79 [==============================] - 1s 7ms/step - loss: 64.9149 - val_loss: 481.6623
Epoch 5/40
79/79 [==============================] - 1s 7ms/step - loss: 54.8473 - val_loss: 336.6349
Epoch 6/40
79/79 [==============================] - 1s 7ms/step - loss: 14.0086 - val_loss: 182.0771
Epoch 7/40
79/79 [==============================] - 1s 7ms/step - loss: 7.8964 - val_loss: 123.3019
Epoch 8/40
79/79 [==============================] - 1s 7ms/step - loss: 7.9218 - val_loss: 139.7560
Epoch 9/40
79/79 [==============================] - 1s 7ms/step - loss: 7.6670 - val_loss: 114.2544
Epoch 10/40
79/79 [==============================] - 1s 7ms/step - loss: 7.9219 - val_loss: 135.5925
Epoch 11/40
79/79 [==============================] - 1s 7ms/step - loss: 7.6049 - val_loss: 174.2708
Epoch 12/40
79/79 [==============================] - 1s 7ms/step - loss: 7.5125 - val_loss: 154.6042
Epoch 13/40
79/79 [==============================] - 1s 7ms/step - loss: 8.3222 - val_loss: 111.5982
Epoch 14/40
79/79 [==============================] - 1s 7ms/step - loss: 8.0469 - val_loss: 157.4362
Epoch 15/40
79/79 [==============================] - 1s 7ms/step - loss: 7.4982 - val_loss: 127.7658
Epoch 16/40
79/79 [==============================] - 1s 7ms/step - loss: 7.1061 - val_loss: 146.1830
Epoch 17/40
79/79 [==============================] - 1s 7ms/step - loss: 7.1750 - val_loss: 156.5059
Epoch 18/40
79/79 [==============================] - 1s 7ms/step - loss: 7.5197 - val_loss: 101.5926
Epoch 19/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2387 - val_loss: 117.7334
Epoch 20/40
79/79 [==============================] - 1s 7ms/step - loss: 7.3422 - val_loss: 105.7751
Epoch 21/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2852 - val_loss: 116.7700
Epoch 22/40
79/79 [==============================] - 1s 7ms/step - loss: 7.4932 - val_loss: 136.8479
Epoch 23/40
79/79 [==============================] - 1s 7ms/step - loss: 7.4134 - val_loss: 98.3815
Epoch 24/40
79/79 [==============================] - 1s 7ms/step - loss: 7.6605 - val_loss: 112.9966
Epoch 25/40
79/79 [==============================] - 1s 7ms/step - loss: 6.9967 - val_loss: 135.6190
Epoch 26/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2674 - val_loss: 131.4203
Epoch 27/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2850 - val_loss: 105.6638
Epoch 28/40
79/79 [==============================] - 1s 7ms/step - loss: 7.3508 - val_loss: 107.9184
Epoch 29/40
79/79 [==============================] - 1s 7ms/step - loss: 7.5499 - val_loss: 129.0708
Epoch 30/40
79/79 [==============================] - 1s 7ms/step - loss: 6.9623 - val_loss: 99.9334
Epoch 31/40
79/79 [==============================] - 1s 7ms/step - loss: 7.1018 - val_loss: 139.2192
Epoch 32/40
79/79 [==============================] - 1s 7ms/step - loss: 7.4560 - val_loss: 97.3027
Epoch 33/40
79/79 [==============================] - 1s 7ms/step - loss: 7.7134 - val_loss: 92.7316
Epoch 34/40
79/79 [==============================] - 1s 7ms/step - loss: 7.0855 - val_loss: 196.1367
Epoch 35/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2137 - val_loss: 176.6974
Epoch 36/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2358 - val_loss: 119.6593
Epoch 37/40
79/79 [==============================] - 1s 7ms/step - loss: 8.9363 - val_loss: 81.6089
Epoch 38/40
79/79 [==============================] - 1s 7ms/step - loss: 7.5995 - val_loss: 72.8987
Epoch 39/40
79/79 [==============================] - 1s 7ms/step - loss: 7.8327 - val_loss: 85.2255
Epoch 40/40
79/79 [==============================] - 1s 7ms/step - loss: 7.2542 - val_loss: 114.3509

五、评估

1. loss图

# 支持中文
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号plt.figure(figsize=(5,3),dpi=300)plt.plot(history_lstm.history['loss'],label='LSTM Training Loss')
plt.plot(history_lstm.history['val_loss'],label='LSTM Validation Loss')plt.title('Training and Validation Loss')
plt.legend()
plt.show()

运行结果:

2. 调用模型进行预测

# 测试集输入模型进行预测
predicted_y_lstm=model_lstm.predict(x_test)y_test_one=[i[0] for i in y_test]
predicted_y_lstm_one=[i[0] for i in predicted_y_lstm]plt.figure(figsize=(5,3),dpi=500)
# 画出真实数据和预测数据的对比曲线
plt.plot(y_test_one[:1000],color='red',label='真实值')
plt.plot(predicted_y_lstm_one[:1000],color='blue',label='预测值')plt.title('Title')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()

运行结果:

30/30 [==============================] - 0s 2ms/step

3. 均方根误差和R2 

from sklearn import metrics
"""
RMSE:均方根误差 ----->  %ddir均方误差开方
R2:决定系数,可以简单理解为反映模型拟合优度的重要的统计量
"""
RMSE_lstm=metrics.mean_squared_error(predicted_y_lstm,y_test)**0.5
R2_lstm=metrics.r2_score(predicted_y_lstm,y_test)print('均方根误差:%.5f' % RMSE_lstm)
print('R2:%.5F' % R2_lstm)

运行结果:

均方根误差:10.69350
R2:0.74156

RMSE均方根误差是预测值与真实值的误差平方根的均值,它用来估计模型预测目标值的性能(准确度),值越小,模型的质量越好。

R2是将预测值跟只使用均值的情况下相比,看能好多少。其区间通常在(0,1)之间。0表示还不如什么都不预测,直接取均值的情况,而1表示所有预测跟真实结果完美匹配的情况,值越接近1,模型的质量越好。

六、心得体会

在本项目中体会了LSTM模型的建立过程。同时,修改参数,将batch_size调整为32,epochs调整为50,得到结果如下:

Epoch 1/50
157/157 [==============================] - 4s 7ms/step - loss: 5803.9741 - val_loss: 997.3257
Epoch 2/50
157/157 [==============================] - 1s 5ms/step - loss: 58.7955 - val_loss: 524.5692
Epoch 3/50
157/157 [==============================] - 1s 5ms/step - loss: 14.5207 - val_loss: 225.7290
Epoch 4/50
157/157 [==============================] - 1s 5ms/step - loss: 9.3101 - val_loss: 253.0079
Epoch 5/50
157/157 [==============================] - 1s 5ms/step - loss: 9.3271 - val_loss: 452.0248
Epoch 6/50
157/157 [==============================] - 1s 5ms/step - loss: 9.2289 - val_loss: 173.1531
Epoch 7/50
157/157 [==============================] - 1s 5ms/step - loss: 8.8041 - val_loss: 198.9779
Epoch 8/50
157/157 [==============================] - 1s 5ms/step - loss: 8.7300 - val_loss: 175.1857
Epoch 9/50
157/157 [==============================] - 1s 5ms/step - loss: 8.8531 - val_loss: 171.3546
Epoch 10/50
157/157 [==============================] - 1s 5ms/step - loss: 9.1017 - val_loss: 247.7276
Epoch 11/50
157/157 [==============================] - 1s 5ms/step - loss: 9.0273 - val_loss: 146.3507
Epoch 12/50
157/157 [==============================] - 1s 5ms/step - loss: 9.3682 - val_loss: 264.0306
Epoch 13/50
157/157 [==============================] - 1s 5ms/step - loss: 7.8832 - val_loss: 145.7737
Epoch 14/50
157/157 [==============================] - 1s 5ms/step - loss: 8.3341 - val_loss: 132.9032
Epoch 15/50
157/157 [==============================] - 1s 5ms/step - loss: 7.9307 - val_loss: 120.7632
Epoch 16/50
157/157 [==============================] - 1s 5ms/step - loss: 7.2120 - val_loss: 144.6875
Epoch 17/50
157/157 [==============================] - 1s 5ms/step - loss: 9.3120 - val_loss: 118.4922
Epoch 18/50
157/157 [==============================] - 1s 5ms/step - loss: 8.1260 - val_loss: 98.8698
Epoch 19/50
157/157 [==============================] - 1s 5ms/step - loss: 11.0811 - val_loss: 175.3161
Epoch 20/50
157/157 [==============================] - 1s 5ms/step - loss: 8.7360 - val_loss: 123.1096
Epoch 21/50
157/157 [==============================] - 1s 5ms/step - loss: 11.2534 - val_loss: 240.5431
Epoch 22/50
157/157 [==============================] - 1s 5ms/step - loss: 7.6774 - val_loss: 155.3054
Epoch 23/50
157/157 [==============================] - 1s 5ms/step - loss: 8.0887 - val_loss: 134.8892
Epoch 24/50
157/157 [==============================] - 1s 5ms/step - loss: 7.4270 - val_loss: 111.8976
Epoch 25/50
157/157 [==============================] - 1s 5ms/step - loss: 6.3537 - val_loss: 146.3686
Epoch 26/50
157/157 [==============================] - 1s 5ms/step - loss: 10.4478 - val_loss: 97.9665
Epoch 27/50
157/157 [==============================] - 1s 5ms/step - loss: 9.7261 - val_loss: 188.2359
Epoch 28/50
157/157 [==============================] - 1s 5ms/step - loss: 10.1440 - val_loss: 110.3858
Epoch 29/50
157/157 [==============================] - 1s 5ms/step - loss: 8.5073 - val_loss: 130.2033
Epoch 30/50
157/157 [==============================] - 1s 5ms/step - loss: 7.0013 - val_loss: 74.1561
Epoch 31/50
157/157 [==============================] - 1s 5ms/step - loss: 14.6065 - val_loss: 103.0083
Epoch 32/50
157/157 [==============================] - 1s 5ms/step - loss: 8.0986 - val_loss: 146.9292
Epoch 33/50
157/157 [==============================] - 1s 5ms/step - loss: 7.1963 - val_loss: 121.0111
Epoch 34/50
157/157 [==============================] - 1s 5ms/step - loss: 8.1757 - val_loss: 109.8830
Epoch 35/50
157/157 [==============================] - 1s 5ms/step - loss: 14.4749 - val_loss: 85.2331
Epoch 36/50
157/157 [==============================] - 1s 5ms/step - loss: 7.6397 - val_loss: 87.5315
Epoch 37/50
157/157 [==============================] - 1s 5ms/step - loss: 8.1814 - val_loss: 71.4447
Epoch 38/50
157/157 [==============================] - 1s 5ms/step - loss: 7.5729 - val_loss: 75.2255
Epoch 39/50
157/157 [==============================] - 1s 5ms/step - loss: 6.2785 - val_loss: 59.0330
Epoch 40/50
157/157 [==============================] - 1s 5ms/step - loss: 8.7710 - val_loss: 68.6848
Epoch 41/50
157/157 [==============================] - 1s 5ms/step - loss: 6.9357 - val_loss: 59.7141
Epoch 42/50
157/157 [==============================] - 1s 5ms/step - loss: 7.9186 - val_loss: 65.5545
Epoch 43/50
157/157 [==============================] - 1s 5ms/step - loss: 7.6705 - val_loss: 64.9584
Epoch 44/50
157/157 [==============================] - 1s 5ms/step - loss: 8.2532 - val_loss: 71.9482
Epoch 45/50
157/157 [==============================] - 1s 5ms/step - loss: 8.5755 - val_loss: 66.6713
Epoch 46/50
157/157 [==============================] - 1s 5ms/step - loss: 7.4758 - val_loss: 93.9396
Epoch 47/50
157/157 [==============================] - 1s 5ms/step - loss: 7.3627 - val_loss: 62.4031
Epoch 48/50
157/157 [==============================] - 1s 5ms/step - loss: 7.2103 - val_loss: 55.2000
Epoch 49/50
157/157 [==============================] - 1s 5ms/step - loss: 7.1437 - val_loss: 133.6639
Epoch 50/50
157/157 [==============================] - 1s 5ms/step - loss: 7.1917 - val_loss: 64.8279

loss图结果如下:

模型预测结果为:

 均方根误差和R2值为:

均方根误差:8.05158
R2:0.83787

通过调整,减小了均方根误差的同时提升了R2值的结果。

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

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

相关文章

手搓人工智能—聚类分析(下)谱系聚类与K-mean聚类

“无论结果如何&#xff0c;至少我们存在过” ——《无人深空》 前言 除了上一篇手搓人工智能-聚类分析&#xff08;上&#xff09;中提到的两种简单聚类方式&#xff0c;还有一些更为常用、更复杂的聚类方式&#xff1a;谱系聚类&#xff0c;K-均值聚类。 谱系聚类 谱系聚类…

文件内容扫描工具

简介 文件扫描助手是一款基于Vite Vue 3 Electron技术栈开发的跨平台桌面应用程序。它提供了强大的文件内容搜索功能&#xff0c;支持Word、Excel、PDF、PPT等常见办公文档格式。用户可以通过关键词快速定位到包含特定内容的文件&#xff0c;极大地提高了文件管理和查找效率…

函数类型注释和Union联合类型注释

函数类型注释格式&#xff08;调用时提示输入参数的类型&#xff09;: )def 函数名(形参名:类型&#xff0c;形参名:类型&#xff09;->函数返回值类型: 函数体 Union联合类型注释&#xff08;可注释多种类型混合的变量&#xff09;格式: #先导入模块 from typing import…

AIGC--AIGC与人机协作:新的创作模式

AIGC与人机协作&#xff1a;新的创作模式 引言 人工智能生成内容&#xff08;AIGC&#xff09;正在以惊人的速度渗透到创作的各个领域。从生成文本、音乐、到图像和视频&#xff0c;AIGC使得创作过程变得更加快捷和高效。然而&#xff0c;AIGC并非完全取代了人类的创作角色&am…

【ue5】UE5运行时下载视频/UE5 runtime download video(MP4)

插件还是老朋友。 节点的content type要打对。 &#xff08;参照表&#xff1a;MIME 类型&#xff08;MIME Type&#xff09;完整对照表 - 免费在线工具&#xff09; 结果展示&#xff1a;

STM32F103外部中断配置

一、外部中断 在上一节我们介绍了STM32f103的嵌套向量中断控制器&#xff0c;其中包括中断的使能、失能、中断优先级分组以及中断优先级配置等内容。 1.1 外部中断/事件控制器 在STM32f103支持的60个可屏蔽中断中&#xff0c;有一些比较特殊的中断&#xff1a; 中断编号13 EXTI…

C嘎嘎探索篇:栈与队列的交响:C++中的结构艺术

C嘎嘎探索篇&#xff1a;栈与队列的交响&#xff1a;C中的结构艺术 前言&#xff1a; 小编在之前刚完成了C中栈和队列&#xff08;stack和queue&#xff09;的讲解&#xff0c;忘记的小伙伴可以去我上一篇文章看一眼的&#xff0c;今天小编将会带领大家吹奏栈和队列的交响&am…

【c语言】文件操作详解 - 从打开到关闭

文章目录 1. 为什么使用文件&#xff1f;2. 什么是文件&#xff1f;3. 如何标识文件&#xff1f;4. 二进制文件和文本文件&#xff1f;5. 文件的打开和关闭5.1 流和标准流5.1.1 流5.1.2 标准流 5.2 文件指针5.3 文件的打开和关闭 6. 文件的读写顺序6.1 顺序读写函数6.2 对比一组…

从 0 到 1 掌握部署第一个 Web 应用到 Kubernetes 中

文章目录 前言构建一个 hello world web 应用项目结构项目核心文件启动项目 检查项目是否构建成功 容器化我们的应用编写 Dockerfile构建 docker 镜像推送 docker 镜像仓库 使用 labs.play-with-k8s.com 构建 Kubernetes 集群并部署应用构建 Kubernetes 集群环境编写部署文件 总…

Matlab以一个图像分类例子总结分类学习的使用方法

目录 前言 导入数据 训练学习 导出训练模型 仿真测试 总结 前言 最近在尝试一些基于Simulink的边沿AI部署,通过这个案例总结Matlab 分类学习功能的使用。本案例通过输入3000张28*28的灰度图像,训练分类学习模型。并验证训练好的模型最后部署到MCU。 导入数据 如下图是…

2025蓝桥杯(单片机)备赛--扩展外设之UART1的原理与应用(十二)

一、串口1的实现原理 a.查看STC15F2K60S2数据手册: 串口一在590页&#xff0c;此款单片机有两个串口。 串口1相关寄存器&#xff1a; SCON:串行控制寄存器&#xff08;可位寻址&#xff09; SCON寄存器说明&#xff1a; 需要PCON寄存器的SMOD0/PCON.6为0&#xff0c;使SM0和SM…

Reactor 模式的理论与实践

1. 引言 1.1 什么是 Reactor 模式&#xff1f; Reactor 模式是一种用于处理高性能 I/O 的设计模式&#xff0c;专注于通过非阻塞 I/O 和事件驱动机制实现高并发性能。它的核心思想是将 I/O 操作的事件分离出来&#xff0c;通过事件分发器&#xff08;Reactor&#xff09;将事…

【Android+多线程】IntentService 知识总结:应用场景 / 使用步骤 / 源码分析

定义 IntentService 是 Android中的一个封装类&#xff0c;继承自四大组件之一的Service 功能 处理异步请求 & 实现多线程 应用场景 线程任务 需 按顺序、在后台执行 最常见的场景&#xff1a;离线下载不符合多个数据同时请求的场景&#xff1a;所有的任务都在同一个T…

Easy Excel 通过【自定义批注拦截器】实现导出的【批注】功能

目录 Easy Excel 通过 【自定义批注拦截器】实现导出的【批注】功能需求原型&#xff1a;相关数据&#xff1a;要导出的对象字段postman 格式导出对象VO 自定义批注拦截器业务代码&#xff1a; 拦截器代码解释&#xff1a;详细解释&#xff1a;格式优化&#xff1a; Easy Excel…

Spring Boot 的 WebClient 实践教程

什么是 WebClient&#xff1f; 在 Spring Boot 中&#xff0c;WebClient 是 Spring WebFlux 提供的一个非阻塞、响应式的 HTTP 客户端&#xff0c;用于与 RESTful 服务或其他 HTTP 服务交互。相比于传统的 RestTemplate&#xff0c;WebClient 更加现代化&#xff0c;具有异步和…

QML学习 —— 29、3种不同使用动画的方式(附源码)

效果 说明 第一种:属性动画 - 当启动软件时候自动执行动画。      第二种:行为动画 - 当属性发生变化则自动执行动画。      第三种:目标动画 - 将动画变为对象,指定对象的目标进行执行动画。 代码 import QtQuick 2.12 import QtQuick.Window 2.12 import QtQu…

Redis缓存穿透及常见的解决方案

一.什么是缓存穿透&#xff1f; 缓存穿透是指当客户端请求的数据在缓存&#xff08;如 Redis&#xff09;中不存在&#xff0c;并且在数据库中也不存在时&#xff0c;直接绕过缓存去请求数据库。这种情况会导致&#xff1a; 缓存系统无法发挥作用&#xff0c;数据每次都会直接…

(原创)Android Studio新老界面UI切换及老版本下载地址

前言 这两天下载了一个新版的Android Studio&#xff0c;发现整个界面都发生了很大改动&#xff1a; 新的界面的一些设置可参考一些博客&#xff1a; Android Studio新版UI常用设置 但是对于一些急着开发的小伙伴来说&#xff0c;没有时间去适应&#xff0c;那么怎么办呢&am…

windows下安装wsl的ubuntu,同时配置深度学习环境

写在前面&#xff0c;本次文章只是个人学习记录&#xff0c;不具备教程的作用。个别信息是网上的&#xff0c;我会标注&#xff0c;个人是gpt生成的 安装wsl 直接看这个就行&#xff1b;可以不用备份软件源。 https://blog.csdn.net/weixin_44301630/article/details/1223900…

Node.js的http模块:创建HTTP服务器、客户端示例

新书速览|Vue.jsNode.js全栈开发实战-CSDN博客 《Vue.jsNode.js全栈开发实战&#xff08;第2版&#xff09;&#xff08;Web前端技术丛书&#xff09;》(王金柱)【摘要 书评 试读】- 京东图书 (jd.com) 要使用http模块&#xff0c;只需要在文件中通过require(http)引入即可。…