深度学习 Day22——利用LSTM实现火灾温度预测

news/2024/5/20 9:08:20/文章来源:https://blog.csdn.net/qq_52417436/article/details/128347800

深度学习 Day22——利用LSTM实现火灾温度预测

文章目录

  • 深度学习 Day22——利用LSTM实现火灾温度预测
    • 一、前言
    • 二、我的环境
    • 三、LSTM介绍
      • 1、长期依赖的问题
      • 2、LSTM
      • 3、LSTM结构
    • 四、前期工作
      • 1、设置GPU
      • 2、导入数据
      • 3、数据可视化
    • 五、构建数据集
      • 1、设置X、y
      • 2、设置归一化
      • 3、划分数据集
    • 六、构建模型
    • 七、编译模型
    • 八、训练模型
    • 九、评估模型
      • 1、Loss图
      • 2、调用训练的模型进行预测
      • 3、打印均方根误差和R2
    • 十、最后我想说

一、前言

🍨 本文为🔗365天深度学习训练营 中的学习记录博客

🍦 参考文章:第R2周:LSTM-火灾温度预测(训练营内部可读)

🍖 作者:K同学啊

在这里插入图片描述

在本期我们将使用LSTM来实现对火灾温度的预测任务,有人肯定会问这个LSTM是什么,它的全程叫做长短期记忆网络,它是RNN的进阶版,简单的介绍一下就是RNN最大限度是理解一句话,那么LSTM的最大限度就是能理解一段话,具体的介绍我们在下面来叙述,我们首先来打开一下我们的数据集看看:

在这里插入图片描述

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

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

后面有关火灾的数据都是随着时间而变化的,我们需要根据这些数据对未来某时刻的火灾温度进行预测,好啦,介绍完之后我们开始正题内容。

二、我的环境

  • 电脑系统:Windows 11
  • 语言环境:Python 3.8.5
  • 编译器:DataSpell 2022.2
  • 深度学习环境:TensorFlow 2.4.0
  • 显卡及显存:RTX 3070 8G

三、LSTM介绍

1、长期依赖的问题

在前面的简单介绍中,我们说了LSTM是RNN的进阶版,那么我们就需要知道为什么要研究LSTM,RNN能够将以前的信息连接到当前的任务,这很好,有时候我们只需要查看最近的信息就行,例如,我们需要通过一个语言模型根据前面的单词预测下一个单词,例如我们尝试预测“这些云朵在天空中”这句话中的天空,我们就不需要参考更远的上下文,在这种情况下,相关信息和需要它的地方之间的差距很小,这个时候RNN就可以胜任,但是在某些情况下,我们需要更多的上下文,例如预测“我在中国湖北长大的…我会说中文”这句话的最后的说中文,如果使用RNN进行预测,RNN能预测出这词应该要填一个语言,但是不知道填哪种语言,这个时候我们就需要前面的信息来判断后面应该填什么语言,如果这两个信息之前差距变得很大很大,那么RNN就变得无法学习连接信息。

在这里插入图片描述

RNN在实际应用中无法解决这种长期依赖的问题,这个时候LSTM就派上用场了。

2、LSTM

短期记忆网络——通常简称为“LSTM”——是一种特殊的 RNN,能够学习长期依赖关系。它在处理大量问题时表现出色,现在已被广泛使用。

所有循环神经网络都具有神经网络重复模块链的形式。在标准 RNN 中,这个重复模块将具有非常简单的结构,例如单个 tanh 层:

在这里插入图片描述

LSTM 也有这种链状结构,但重复模块有不同的结构。不是只有一个神经网络层,而是有四个,以一种非常特殊的方式进行交互,是通过门控状态来选择调整传输的信息,简单的来说就是记住需要长时间记忆的信息,忘记不重要的信息,其结构如下:

在这里插入图片描述

3、LSTM结构

LSTM由三个部分组成,每个部分执行一个单独的功能,这些部分被称为门,第一部分称遗忘门,第二部分称输入门,第三部分称输出门。

在这里插入图片描述

具体的介绍大家可以去看一下这篇国外的文章:长短期记忆 (LSTM) 简介

四、前期工作

1、设置GPU

和之前一样,如果你GPU很好就只使用GPU进行训练,如果GPU不行就推荐使用CPU训练加GPU加速。

只使用GPU:

import tensorflow as tfgpus = 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)
[PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]

使用CPU+GPU:

import tensorflow as tf
import os
os.environ["CUDA_VISIBLE_DEVICES"] = "-1"

2、导入数据

import pandas     as pd
import numpy      as npdf_1 = pd.read_csv("./data/woodpine2.csv")

3、数据可视化

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()

在这里插入图片描述

五、构建数据集

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

在这里插入图片描述

1、设置X、y

我们取数据集的前8个时间段的Tem 1、CO 1和Soot 1设置为X,第9九个时间段的Tem 1设置为y。

width_X = 8
width_y = 2X = []
y = []in_start = 0for _, _ in df_1.iterrows():in_end  = in_start + width_Xout_end = in_end   + width_yif out_end < len(dataFrame):X_ = np.array(dataFrame.iloc[in_start:in_end , ])X_ = X_.reshape((len(X_)*3))y_ = np.array(dataFrame.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

我们打印出X、y的数组维度:

((5938, 24), (5938, 2))

2、设置归一化

from sklearn.preprocessing import MinMaxScaler#将数据归一化,范围是0到1
sc       = MinMaxScaler(feature_range=(0, 1))
X_scaled = sc.fit_transform(X)
X_scaled = X_scaled.reshape(len(X_scaled),width_X,3)
X_scaled.shape
(5938, 8, 3)

3、划分数据集

我们取前五千的数据为训练集,五千之后的数据为验证集:、

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)

六、构建模型

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM# 多层 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层,其函数模型为:

tf.keras.layers.LSTM(units,activation="tanh",recurrent_activation="sigmoid",use_bias=True,kernel_initializer="glorot_uniform",recurrent_initializer="orthogonal",bias_initializer="zeros",unit_forget_bias=True,kernel_regularizer=None,recurrent_regularizer=None,bias_regularizer=None,activity_regularizer=None,kernel_constraint=None,recurrent_constraint=None,bias_constraint=None,dropout=0.0,recurrent_dropout=0.0,return_sequences=False,return_state=False,go_backwards=False,stateful=False,time_major=False,unroll=False,**kwargs
)

其中的参数介绍,我直接截图官网的详细介绍:

在这里插入图片描述

七、编译模型

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

八、训练模型

history_lstm = model_lstm.fit(X_train, y_train,batch_size=64,epochs=50,validation_data=(X_test, y_test),validation_freq=1)

训练的结果是:

Epoch 1/50
79/79 [==============================] - 1s 10ms/step - loss: 11686.5967 - val_loss: 3691.0500
Epoch 2/50
79/79 [==============================] - 1s 7ms/step - loss: 151.2972 - val_loss: 317.7450
Epoch 3/50
79/79 [==============================] - 1s 7ms/step - loss: 37.6472 - val_loss: 106.3978
Epoch 4/50
79/79 [==============================] - 1s 7ms/step - loss: 10.1789 - val_loss: 99.7457
Epoch 5/50
79/79 [==============================] - 0s 6ms/step - loss: 8.7049 - val_loss: 115.6766
Epoch 6/50
79/79 [==============================] - 1s 7ms/step - loss: 9.2803 - val_loss: 115.1288
Epoch 7/50
79/79 [==============================] - 0s 6ms/step - loss: 8.1934 - val_loss: 107.6996
Epoch 8/50
79/79 [==============================] - 0s 6ms/step - loss: 7.6814 - val_loss: 73.8946
Epoch 9/50
79/79 [==============================] - 1s 6ms/step - loss: 7.4581 - val_loss: 115.7030
Epoch 10/50
79/79 [==============================] - 1s 7ms/step - loss: 7.7914 - val_loss: 81.8359
Epoch 11/50
79/79 [==============================] - 1s 7ms/step - loss: 9.2118 - val_loss: 86.4748
Epoch 12/50
79/79 [==============================] - 1s 7ms/step - loss: 6.9482 - val_loss: 82.4900
Epoch 13/50
79/79 [==============================] - 1s 7ms/step - loss: 6.7160 - val_loss: 86.3577
Epoch 14/50
79/79 [==============================] - 1s 7ms/step - loss: 7.5583 - val_loss: 82.8828
Epoch 15/50
79/79 [==============================] - 1s 6ms/step - loss: 8.2439 - val_loss: 71.2496
Epoch 16/50
79/79 [==============================] - 1s 7ms/step - loss: 6.9511 - val_loss: 87.5125
Epoch 17/50
79/79 [==============================] - 1s 7ms/step - loss: 6.5218 - val_loss: 95.1897
Epoch 18/50
79/79 [==============================] - 1s 7ms/step - loss: 7.2178 - val_loss: 156.5886
Epoch 19/50
79/79 [==============================] - 1s 7ms/step - loss: 7.7970 - val_loss: 67.9543
Epoch 20/50
79/79 [==============================] - 1s 6ms/step - loss: 6.5448 - val_loss: 80.9858
Epoch 21/50
79/79 [==============================] - 1s 7ms/step - loss: 6.6814 - val_loss: 87.8312
Epoch 22/50
79/79 [==============================] - 1s 6ms/step - loss: 6.7830 - val_loss: 93.9837
Epoch 23/50
79/79 [==============================] - 0s 6ms/step - loss: 6.4453 - val_loss: 89.2516
Epoch 24/50
79/79 [==============================] - 1s 7ms/step - loss: 6.8551 - val_loss: 54.0458
Epoch 25/50
79/79 [==============================] - 0s 6ms/step - loss: 7.1806 - val_loss: 54.7397
Epoch 26/50
79/79 [==============================] - 0s 6ms/step - loss: 7.5586 - val_loss: 54.8446
Epoch 27/50
79/79 [==============================] - 0s 6ms/step - loss: 6.6819 - val_loss: 52.9399
Epoch 28/50
79/79 [==============================] - 0s 6ms/step - loss: 7.6259 - val_loss: 54.6638
Epoch 29/50
79/79 [==============================] - 1s 6ms/step - loss: 8.7933 - val_loss: 55.4396
Epoch 30/50
79/79 [==============================] - 0s 6ms/step - loss: 7.1920 - val_loss: 61.9947
Epoch 31/50
79/79 [==============================] - 1s 6ms/step - loss: 6.7282 - val_loss: 52.4816
Epoch 32/50
79/79 [==============================] - 1s 7ms/step - loss: 7.7619 - val_loss: 52.3930
Epoch 33/50
79/79 [==============================] - 1s 8ms/step - loss: 6.2908 - val_loss: 90.4385
Epoch 34/50
79/79 [==============================] - 1s 7ms/step - loss: 7.8380 - val_loss: 52.6972
Epoch 35/50
79/79 [==============================] - 1s 7ms/step - loss: 7.5878 - val_loss: 52.7349
Epoch 36/50
79/79 [==============================] - 1s 7ms/step - loss: 9.9398 - val_loss: 52.8272
Epoch 37/50
79/79 [==============================] - 1s 8ms/step - loss: 6.9212 - val_loss: 95.1052
Epoch 38/50
79/79 [==============================] - 1s 7ms/step - loss: 7.6226 - val_loss: 72.0266
Epoch 39/50
79/79 [==============================] - 1s 7ms/step - loss: 8.0218 - val_loss: 58.9474
Epoch 40/50
79/79 [==============================] - 1s 7ms/step - loss: 6.2650 - val_loss: 49.7152
Epoch 41/50
79/79 [==============================] - 1s 7ms/step - loss: 7.1157 - val_loss: 51.9619
Epoch 42/50
79/79 [==============================] - 1s 7ms/step - loss: 7.1721 - val_loss: 47.5208
Epoch 43/50
79/79 [==============================] - 1s 7ms/step - loss: 6.2749 - val_loss: 61.2468
Epoch 44/50
79/79 [==============================] - 1s 7ms/step - loss: 9.0165 - val_loss: 68.4650
Epoch 45/50
79/79 [==============================] - 1s 7ms/step - loss: 7.3368 - val_loss: 50.3002
Epoch 46/50
79/79 [==============================] - 0s 6ms/step - loss: 6.1518 - val_loss: 70.3923
Epoch 47/50
79/79 [==============================] - 1s 6ms/step - loss: 7.5889 - val_loss: 62.4437
Epoch 48/50
79/79 [==============================] - 1s 6ms/step - loss: 7.4014 - val_loss: 61.4142
Epoch 49/50
79/79 [==============================] - 1s 7ms/step - loss: 6.2537 - val_loss: 47.6556
Epoch 50/50
79/79 [==============================] - 1s 7ms/step - loss: 7.3076 - val_loss: 58.5787

九、评估模型

1、Loss图

# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号plt.figure(figsize=(5, 3),dpi=120)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=120)
# 画出真实数据和预测数据的对比曲线
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()

在这里插入图片描述

3、打印均方根误差和R2

from sklearn import metrics
"""
RMSE :均方根误差,对均方误差开方
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)

打印的结果是:

均方根误差: 7.65367
R2: 0.83103

其中,RMSE是预测值与真实值的误差平方根的均值,它用来估计模型预测目标值的性能(准确度),值越小,模型的质量越好,R2是将预测值跟只使用均值的情况下相比,看能好多少。其区间通常在(0,1)之间。0表示还不如什么都不预测,直接取均值的情况,而1表示所有预测跟真实结果完美匹配的情况,值越接近1,模型的质量越好,可以看见我们这里两者的值都还算不错。

十、最后我想说

本期的博客就到这里结束了,在最后我们聊聊其他的,现在疫情防控放开了,大家身边肯定多了不少“小阳人”,大家一定要多注意身体,尽量避免去人多 的地方,保护好自己的同时也在保护好自己的家人朋友,已经感染的朋友们,也不要慌张,听取专家的建议,一般正常人七天左右就好了,最近博主我也是感冒了,还没有去做检查,应该只是小感冒,最近身体不太舒服,更新比较慢,见谅!

最后祝大家身体都健健康康,一起迎接新年的到来!

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

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

相关文章

宽凳科技完成超亿元B1轮融资 率先突破高精地图量产落地

近日&#xff0c;国内领先的高精地图及其智能应用综合解决方案服务商宽凳科技宣布完成B1轮超亿元融资。本轮融资由聚焦于新能源汽车产业链投资及新兴技术产业投资的紫峰资本与信益资本联合领投&#xff0c;崇业投资跟投&#xff0c;同时本轮资本引入了德清政府战略投资&#xf…

Vue3 —— 使用Vite配置环境变量

文章目录 一、为什么要配置环境变量?二、在Vite中配置环境变量 1.环境变量和模式2.环境变量3.生产环境替换4.env 文件总结一、为什么要配置环境变量? 在一个产品的前端开发过程中&#xff0c;一般来说会经历本地开发、测试脚本、开发自测、测试环境、预上线环境&#xff0c;然…

如何计算香港服务器公网带宽的实际下载速度?

如何计算香港服务器公网带宽的实际下载速度?下面分享香港服务器带宽实际下载速度对照表及计算方法&#xff1a; 香港服务器带宽实际下载速度计算方法 香港服务器以1Mbps公网带宽为例&#xff0c;香港服务器1M带宽实际下载速度峰值128KB/S&#xff0c;为什么不是1M/S&#xff0…

educoder:实验13 算法-穷举法和二分法

第1关&#xff1a;百钱百鸡 任务描述 我国古代数学家张丘建在《算经》一书中提出的数学问题&#xff1a;鸡翁一值钱五&#xff0c;鸡母一值钱三&#xff0c;鸡雏三值钱一。百钱买百鸡&#xff0c;问鸡翁、鸡母、鸡雏各几何&#xff1f; 相关知识 为了完成本关任务&#xff…

《纳瓦尔宝典》笔记三——做自己真正感兴趣的事情

你合上书本&#xff0c;留在你脑子里的才真正是你的智慧 目录 一、开始让你兴致盎然&#xff0c;后来又让你觉得索然无味了吗 二、在“成为自己”这件事“上&#xff0c;没有人比你做得好 三、专长无法被教授&#xff0c;但可以被学习 四、上学能带来什么 五、尽量做不需…

OM6621系列国产M4F内核低功耗BLE5.1大内存SoC蓝牙芯片

目录OM6621系列简介OM6621P系列芯片特性应用领域OM6621系列简介 随着5G与物联网时代的到来&#xff0c;智慧城市、电动出行、智能家居、可穿戴设备等应用高速发展&#xff0c;低功耗蓝牙技术在近几年智能化浪潮中的地位也尤为重要。OM6621系列的开发即是为解决国内低功耗蓝牙应…

[整型/浮点型二分算法详解]二分查找算法真的很简单吗

&#x1f3d6;️作者&#xff1a;malloc不出对象 ⛺专栏&#xff1a;《初识C语言》 &#x1f466;个人简介&#xff1a;一名双非本科院校大二在读的科班编程菜鸟&#xff0c;努力编程只为赶上各位大佬的步伐&#x1f648;&#x1f648; 目录前言一、二分查找是什么二、二分查找…

Linux操作系统的安全合规性检查和加固

1. 账号和口令 1.1 禁用或删除无用账号 减少系统无用账号&#xff0c;降低安全风险。 操作步骤 使用命令 userdel 删除不必要的账号。 使用命令 passwd -l 锁定不必要的账号。 使用命令 passwd -u 解锁必要的账号。 1.2 检查特殊账号 检查是否存在空口令和root权限的账号…

DSPE-PEG-N3,磷脂-聚乙二醇-叠氮 点击化学PEG试剂,可用于药物传递、基因转染和生物分子修饰

中文名称 叠氮聚乙二醇磷脂、磷脂聚乙二醇叠氮 简称 N3-PEG-DSPE、DSPE-PEG-N3 物理性质&#xff1a;米白色/白色固体或粘性液体取决于分子量。 溶剂&#xff1a; 溶于大部分有机溶剂&#xff0c;和水有很好的溶解性。 活性基团&#xff1a; N3 反应基…

C++ Reference: Standard C++ Library reference: Containers: map: map: find

C官网参考链接&#xff1a;https://cplusplus.com/reference/map/map/find/ 公有成员函数 <map> std::map::find iterator find (const key_type& k); const_iterator find (const key_type& k) const;获取指向元素的iterator 在容器中搜索键值等于k的元素&…

和ChatGPT大战多个回合,我知道了这些真相

最近&#xff0c;ChatGPT在国内外社交平台上可谓是火出圈了。作为一款人工智能语言模型&#xff0c;它可以和人类以对话的方式进行互动&#xff0c;比你早已熟知的Siri&#xff0c;小度还有小爱同学要更加智能与专业。因为它除了回答问题外还能进行创作&#xff0c;比如写小作文…

服务器多用户共享Anaconda

实验室最近买了台服务器&#xff0c;这篇Blog用来记载一下给ubuntu 20.04的服务器安装一个共享的anaconda的步骤。 安装Anaconda 首先去anaconda的官网下载linux的安装包&#xff0c;推送到服务上。然后进行安装&#xff1a; sudo bash ./Anaconda3-2022.10-Linux-x86_64.sh…

病毒之Worm.Win32.AutoRun

题外话&#xff1a;在被奥密克戎包围的我(两个室友和我&#xff0c;一个低烧、一个咳嗽、就差我了&#xff0c;这属实是真被包围了丫)在和Worm.Win32.AutoRun决一死战… 本次Worm.Win32.AutoRun的来源&#xff1a; windows电脑上重装vscode&#xff0c;然后没有 mingw-get-setu…

Scala环境搭建

目录1&#xff09;安装步骤2&#xff09;测试3&#xff09;IDEA安装Scala 插件1&#xff09;安装步骤 1.首先确保 JDK1.8 安装成功 2.下载对应的 Scala 安装文件 scala-2.x.zip 3.解压 scala-2.12.11.zip&#xff0c;我这里解压到 F:\software 4.配置 Scala 的环境变量 …

全面解析若依框架(springboot-vue前后分离--后端部分)

1、 若依框架分解 - 启动配置 前端启动 # 进入项目目录 cd ruoyi-ui# 安装依赖 npm install# 强烈建议不要用直接使用 cnpm 安装&#xff0c;会有各种诡异的 bug&#xff0c;可以通过重新指定 registry 来解决 npm 安装速度慢的问题。 npm install --registryhttps://regist…

python 之 numpy图片处理 矩阵操作

目录 一&#xff1a;垂直方向翻转(行逆序) 二&#xff1a;水平方向翻转(列逆序) 三&#xff1a;垂直、水平方向翻转(行、列逆序) 四&#xff1a;调整亮度&#xff0c;变明亮*2.0 五&#xff1a;调整亮度&#xff0c;变暗 六&#xff1a;垂直方向裁剪 七&#xff1a;水平…

漏洞深度分析|Pgadmin 命令执行漏洞

项目介绍 PostgreSQL是世界上第四大流行的开源数据库管理系统&#xff0c;它在各种规模的应用程序中得到了广泛的使用。而管理数据库的传统方法是使用命令行界面(CLI)工具。 PostgreSQL的图形化用户界面(GUI)工具则可以帮助用户对数据库实现更好的管理、操纵、以及可视化其数…

kafka概念及部署

文章目录一.kafka1.kafka的概念2.Kafka的特性3.工作原理4.文件存储5.消息模式5.1点到点5.2订阅模式6.基础架构一.kafka 1.kafka的概念 Kafka是最初由Linkedin公司开发&#xff0c;是一个分布式、支持分区的&#xff08;partition&#xff09;、多副本的&#xff08;replica&a…

微软确认配置错误导致65,000多家公司的数据泄露

©网络研究院 微软证实&#xff0c;在安全漏洞导致端点无需任何身份验证即可通过互联网公开访问后&#xff0c;它无意中暴露了与数千名客户相关的信息。 微软在警报中表示&#xff1a; “这种错误配置可能导致未经身份验证访问与微软和潜在客户之间的交互相对应的一些业务…

Android 跨应用发送自定义广播

话不多说&#xff0c;直接看效果图和代码&#xff01; 一、效果图 1、未发送广播之前&#xff0c;两个APP的主界面图&#xff1b; 2、发送之后&#xff0c;文本框内容改变。 二、代码 1、创建第一个APP &#xff08;1&#xff09;MainActivity中代码如下&#xff1a; p…