R5天气识别学习笔记

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

LSTM-天气识别预测

  • 雨天百分比
  • 数据预处理
  • 模型训练
  • 结果可视化
  • 个人总结

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Activation,Dropout
from tensorflow.python.keras.callbacks import EarlyStopping
from tensorflow.python.keras.layers import Dropout
from sklearn.metrics import classification_report,confusion_matrix
from sklearn.metrics import r2_score
from sklearn.metrics import mean_absolute_error , mean_absolute_percentage_error , mean_squared_error
data = pd.read_csv(r"C:\Users\11054\Desktop\kLearning\R5\weatherAUS.csv")
df   = data.copy()
data.head()
DateLocationMinTempMaxTempRainfallEvaporationSunshineWindGustDirWindGustSpeedWindDir9am...Humidity9amHumidity3pmPressure9amPressure3pmCloud9amCloud3pmTemp9amTemp3pmRainTodayRainTomorrow
02008-12-01Albury13.422.90.6NaNNaNW44.0W...71.022.01007.71007.18.0NaN16.921.8NoNo
12008-12-02Albury7.425.10.0NaNNaNWNW44.0NNW...44.025.01010.61007.8NaNNaN17.224.3NoNo
22008-12-03Albury12.925.70.0NaNNaNWSW46.0W...38.030.01007.61008.7NaN2.021.023.2NoNo
32008-12-04Albury9.228.00.0NaNNaNNE24.0SE...45.016.01017.61012.8NaNNaN18.126.5NoNo
42008-12-05Albury17.532.31.0NaNNaNW41.0ENE...82.033.01010.81006.07.08.017.829.7NoNo

5 rows × 23 columns

data.describe()
MinTempMaxTempRainfallEvaporationSunshineWindGustSpeedWindSpeed9amWindSpeed3pmHumidity9amHumidity3pmPressure9amPressure3pmCloud9amCloud3pmTemp9amTemp3pm
count143975.000000144199.000000142199.00000082670.00000075625.000000135197.000000143693.000000142398.000000142806.000000140953.000000130395.00000130432.00000089572.00000086102.000000143693.000000141851.00000
mean12.19403423.2213482.3609185.4682327.61117840.03523014.04342618.66265768.88083151.5391161017.649941015.2558894.4474614.50993016.99063121.68339
std6.3984957.1190498.4780604.1937043.78548313.6070628.9153758.80980019.02916420.7959027.106537.0374142.8871592.7203576.4887536.93665
min-8.500000-4.8000000.0000000.0000000.0000006.0000000.0000000.0000000.0000000.000000980.50000977.1000000.0000000.000000-7.200000-5.40000
25%7.60000017.9000000.0000002.6000004.80000031.0000007.00000013.00000057.00000037.0000001012.900001010.4000001.0000002.00000012.30000016.60000
50%12.00000022.6000000.0000004.8000008.40000039.00000013.00000019.00000070.00000052.0000001017.600001015.2000005.0000005.00000016.70000021.10000
75%16.90000028.2000000.8000007.40000010.60000048.00000019.00000024.00000083.00000066.0000001022.400001020.0000007.0000007.00000021.60000026.40000
max33.90000048.100000371.000000145.00000014.500000135.000000130.00000087.000000100.000000100.0000001041.000001039.6000009.0000009.00000040.20000046.70000
data.dtypes
Date              object
Location          object
MinTemp          float64
MaxTemp          float64
Rainfall         float64
Evaporation      float64
Sunshine         float64
WindGustDir       object
WindGustSpeed    float64
WindDir9am        object
WindDir3pm        object
WindSpeed9am     float64
WindSpeed3pm     float64
Humidity9am      float64
Humidity3pm      float64
Pressure9am      float64
Pressure3pm      float64
Cloud9am         float64
Cloud3pm         float64
Temp9am          float64
Temp3pm          float64
RainToday         object
RainTomorrow      object
dtype: object
#将数据转换为日期时间格式
data['Date'] = pd.to_datetime(data['Date'])data['year']  = data['Date'].dt.year
data['Month'] = data['Date'].dt.month
data['day']   = data['Date'].dt.daydata.head()
DateLocationMinTempMaxTempRainfallEvaporationSunshineWindGustDirWindGustSpeedWindDir9am...Pressure3pmCloud9amCloud3pmTemp9amTemp3pmRainTodayRainTomorrowyearMonthday
02008-12-01Albury13.422.90.6NaNNaNW44.0W...1007.18.0NaN16.921.8NoNo2008121
12008-12-02Albury7.425.10.0NaNNaNWNW44.0NNW...1007.8NaNNaN17.224.3NoNo2008122
22008-12-03Albury12.925.70.0NaNNaNWSW46.0W...1008.7NaN2.021.023.2NoNo2008123
32008-12-04Albury9.228.00.0NaNNaNNE24.0SE...1012.8NaNNaN18.126.5NoNo2008124
42008-12-05Albury17.532.31.0NaNNaNW41.0ENE...1006.07.08.017.829.7NoNo2008125

5 rows × 26 columns

data.drop('Date',axis=1,inplace=True)
data.columns
Index(['Location', 'MinTemp', 'MaxTemp', 'Rainfall', 'Evaporation', 'Sunshine','WindGustDir', 'WindGustSpeed', 'WindDir9am', 'WindDir3pm','WindSpeed9am', 'WindSpeed3pm', 'Humidity9am', 'Humidity3pm','Pressure9am', 'Pressure3pm', 'Cloud9am', 'Cloud3pm', 'Temp9am','Temp3pm', 'RainToday', 'RainTomorrow', 'year', 'Month', 'day'],dtype='object')
plt.figure(figsize=(15,13))
data_select = data.select_dtypes(include=[np.number])
<Figure size 1500x1300 with 0 Axes>
ax = sns.heatmap(data_select.corr(), square=True, annot=True, fmt='.2f')
ax.set_xticklabels(ax.get_xticklabels(), rotation=90)
plt.show()

请添加图片描述

# 设置样式和调色板
sns.set(style="whitegrid", palette="Set2")# 创建一个 1 行 2 列的图像布局
fig, axes = plt.subplots(1, 2, figsize=(10, 4))  # 图形尺寸调大 (10, 4)# 图表标题样式
title_font = {'fontsize': 14, 'fontweight': 'bold', 'color': 'darkblue'}# 第一张图:RainTomorrow
sns.countplot(x='RainTomorrow', data=data, ax=axes[0], edgecolor='black')  # 添加边框
axes[0].set_title('Rain Tomorrow', fontdict=title_font)  # 设置标题
axes[0].set_xlabel('Will it Rain Tomorrow?', fontsize=12)  # X轴标签
axes[0].set_ylabel('Count', fontsize=12)  # Y轴标签
axes[0].tick_params(axis='x', labelsize=11)  # X轴刻度字体大小
axes[0].tick_params(axis='y', labelsize=11)  # Y轴刻度字体大小# 第二张图:RainToday
sns.countplot(x='RainToday', data=data, ax=axes[1], edgecolor='black')  # 添加边框
axes[1].set_title('Rain Today', fontdict=title_font)  # 设置标题
axes[1].set_xlabel('Did it Rain Today?', fontsize=12)  # X轴标签
axes[1].set_ylabel('Count', fontsize=12)  # Y轴标签
axes[1].tick_params(axis='x', labelsize=11)  # X轴刻度字体大小
axes[1].tick_params(axis='y', labelsize=11)  # Y轴刻度字体大小sns.despine()      # 去除图表顶部和右侧的边框
plt.tight_layout() # 调整布局,避免图形之间的重叠
plt.show()

请添加图片描述

x=pd.crosstab(data['RainTomorrow'],data['RainToday'])
x
RainTodayNoYes
RainTomorrow
No9272816858
Yes1660414597
y=x/x.transpose().sum().values.reshape(2,1)*100
y
RainTodayNoYes
RainTomorrow
No84.61664815.383352
Yes53.21624346.783757
y.plot(kind="bar",figsize=(4,3),color=['#006666','#d279a6']);

请添加图片描述

雨天百分比

x=pd.crosstab(data['Location'],data['RainToday'])
# 获取每个城市下雨天数和非下雨天数的百分比
y=x/x.transpose().sum().values.reshape((-1, 1))*100
# 按每个城市的雨天百分比排序
y=y.sort_values(by='Yes',ascending=True )color=['#cc6699','#006699','#006666','#862d86','#ff9966'  ]
y.Yes.plot(kind="barh",figsize=(15,20),color=color)
<Axes: ylabel='Location'>

请添加图片描述

data.columns
Index(['Location', 'MinTemp', 'MaxTemp', 'Rainfall', 'Evaporation', 'Sunshine','WindGustDir', 'WindGustSpeed', 'WindDir9am', 'WindDir3pm','WindSpeed9am', 'WindSpeed3pm', 'Humidity9am', 'Humidity3pm','Pressure9am', 'Pressure3pm', 'Cloud9am', 'Cloud3pm', 'Temp9am','Temp3pm', 'RainToday', 'RainTomorrow', 'year', 'Month', 'day'],dtype='object')
plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Pressure9am',y='Pressure3pm',hue='RainTomorrow');

请添加图片描述

plt.figure(figsize=(8,6))
sns.scatterplot(data=data,x='Humidity9am',y='Humidity3pm',hue='RainTomorrow');

请添加图片描述

plt.figure(figsize=(8,6))
sns.scatterplot(x='MaxTemp', y='MinTemp',data=data, hue='RainTomorrow');

请添加图片描述

数据预处理


# 每列中缺失数据的百分比
data.isnull().sum()/data.shape[0]*100
Location          0.000000
MinTemp           1.020899
MaxTemp           0.866905
Rainfall          2.241853
Evaporation      43.166506
Sunshine         48.009762
WindGustDir       7.098859
WindGustSpeed     7.055548
WindDir9am        7.263853
WindDir3pm        2.906641
WindSpeed9am      1.214767
WindSpeed3pm      2.105046
Humidity9am       1.824557
Humidity3pm       3.098446
Pressure9am      10.356799
Pressure3pm      10.331363
Cloud9am         38.421559
Cloud3pm         40.807095
Temp9am           1.214767
Temp3pm           2.481094
RainToday         2.241853
RainTomorrow      2.245978
year              0.000000
Month             0.000000
day               0.000000
dtype: float64
# 在该列中随机选择数进行填充
lst=['Evaporation','Sunshine','Cloud9am','Cloud3pm']
for col in lst:fill_list = data[col].dropna()data[col] = data[col].fillna(pd.Series(np.random.choice(fill_list, size=len(data.index))))
s = (data.dtypes == "object")
object_cols = list(s[s].index)
object_cols
['Location','WindGustDir','WindDir9am','WindDir3pm','RainToday','RainTomorrow']
# inplace=True:直接修改原对象,不创建副本
# data[i].mode()[0] 返回频率出现最高的选项,众数for i in object_cols:data[i].fillna(data[i].mode()[0], inplace=True)
t = (data.dtypes == "float64")
num_cols = list(t[t].index)
num_cols
['MinTemp','MaxTemp','Rainfall','Evaporation','Sunshine','WindGustSpeed','WindSpeed9am','WindSpeed3pm','Humidity9am','Humidity3pm','Pressure9am','Pressure3pm','Cloud9am','Cloud3pm','Temp9am','Temp3pm']
# .median(), 中位数
for i in num_cols:data[i].fillna(data[i].median(), inplace=True)
data.isnull().sum()
Location         0
MinTemp          0
MaxTemp          0
Rainfall         0
Evaporation      0
Sunshine         0
WindGustDir      0
WindGustSpeed    0
WindDir9am       0
WindDir3pm       0
WindSpeed9am     0
WindSpeed3pm     0
Humidity9am      0
Humidity3pm      0
Pressure9am      0
Pressure3pm      0
Cloud9am         0
Cloud3pm         0
Temp9am          0
Temp3pm          0
RainToday        0
RainTomorrow     0
year             0
Month            0
day              0
dtype: int64
from sklearn.preprocessing import LabelEncoderlabel_encoder = LabelEncoder()
for i in object_cols:data[i] = label_encoder.fit_transform(data[i])
X = data.drop(['RainTomorrow','day'],axis=1).values
y = data['RainTomorrow'].values
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.25,random_state=101)
scaler = MinMaxScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test  = scaler.transform(X_test)
model = Sequential()
model.add(Dense(units=24,activation='tanh',))
model.add(Dense(units=18,activation='tanh'))
model.add(Dense(units=23,activation='tanh'))
model.add(Dropout(0.5))
model.add(Dense(units=12,activation='tanh'))
model.add(Dropout(0.2))
model.add(Dense(units=1,activation='sigmoid'))from tensorflow.python.keras.optimizers import adam_v2
optimizer = adam_v2.Adam(1e-3)model.compile(loss='binary_crossentropy',optimizer=optimizer,metrics="accuracy")
early_stop = EarlyStopping(monitor='val_loss',mode='min',min_delta=0.001,verbose=1,patience=25,restore_best_weights=True)

模型训练


model.fit(x=X_train,y=y_train,validation_data=(X_test, y_test), verbose=1,callbacks=[early_stop],epochs = 10,batch_size = 32
)

ps:isinstance(ds, input_lib.DistributedDatasetInterface) 需要修改源码 直接返回False就行

Epoch 1/10
3410/3410 [==============================] - 6s 2ms/step - loss: 0.3992 - accuracy: 0.8299 - val_loss: 0.3842 - val_accuracy: 0.8312
Epoch 2/10
3410/3410 [==============================] - 6s 2ms/step - loss: 0.3829 - accuracy: 0.8364 - val_loss: 0.3731 - val_accuracy: 0.8402
Epoch 3/10
3410/3410 [==============================] - 5s 2ms/step - loss: 0.3805 - accuracy: 0.8376 - val_loss: 0.3828 - val_accuracy: 0.8282
Epoch 4/10
3410/3410 [==============================] - 6s 2ms/step - loss: 0.3783 - accuracy: 0.8378 - val_loss: 0.3887 - val_accuracy: 0.8346
Epoch 5/10
3410/3410 [==============================] - 6s 2ms/step - loss: 0.3758 - accuracy: 0.8393 - val_loss: 0.3715 - val_accuracy: 0.8412
Epoch 6/10
3410/3410 [==============================] - 6s 2ms/step - loss: 0.3747 - accuracy: 0.8392 - val_loss: 0.3800 - val_accuracy: 0.8381
Epoch 7/10
3410/3410 [==============================] - 6s 2ms/step - loss: 0.3729 - accuracy: 0.8402 - val_loss: 0.3655 - val_accuracy: 0.8419
Epoch 8/10
3410/3410 [==============================] - 6s 2ms/step - loss: 0.3727 - accuracy: 0.8401 - val_loss: 0.3649 - val_accuracy: 0.8422
Epoch 9/10
3410/3410 [==============================] - 6s 2ms/step - loss: 0.3717 - accuracy: 0.8408 - val_loss: 0.3669 - val_accuracy: 0.8416
Epoch 10/10
3410/3410 [==============================] - 6s 2ms/step - loss: 0.3709 - accuracy: 0.8408 - val_loss: 0.3765 - val_accuracy: 0.8403<tensorflow.python.keras.callbacks.History at 0x27751cb3b50>

结果可视化


import matplotlib.pyplot as pltacc = model.history.history['accuracy']
val_acc = model.history.history['val_accuracy']loss = model.history.history['loss']
val_loss = model.history.history['val_loss']epochs_range = range(10)plt.figure(figsize=(14, 4))
plt.subplot(1, 2, 1)plt.plot(epochs_range, acc, label='Training Accuracy')
plt.plot(epochs_range, val_acc, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, label='Training Loss')
plt.plot(epochs_range, val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

请添加图片描述

个人总结

RNN及其变体在序列数据处理中的应用

  1. RNN
    RNN(Recurrent Neural Network,循环神经网络)是一类专门处理序列数据的神经网络模型。与传统的前馈网络(如全连接网络MLP、卷积网络CNN等)不同,RNN能够在序列的时间步之间传递信息,具备“记忆”先前输入的能力。这种特性使得RNN在处理依赖于上下文或时间顺序的任务时非常有效,例如自然语言处理(NLP)、时间序列预测和语音识别等。

  2. RNN的基本结构
    RNN的基本结构可以概括为以下几点:

序列性:RNN在每个时间步接收当前输入,并结合上一时间步的隐藏状态来更新当前的隐藏状态。
循环结构:在每个时间步,RNN会基于当前输入和上一时刻的隐藏状态来更新当前隐藏状态,然后输出结果。

  1. RNN的关键特征
    循环:RNN通过将过去的隐藏状态反复输入到网络,与当前输入一起决策新的隐藏状态,它在时间序列上“循环”展开。
    参数共享:对于序列中每个时间步,RNN使用相同的一组权重一般的多层感知器(MLP)不同,MLP 每一层都会有一组新的权重。
  2. RNN的优势与局限
    优势:

适合序列数据:相比于传统的全连接网络,RNN能够更好地处理变长的序列输入,捕捉序列中的时序依赖关系。
参数共享:节省模型参数,防止过度膨胀。
局限:

长期依赖问题:经典RNN里,随着序列长度增大,早期输入的信息往往无法传播到后面时间步,会导致梯度消失或梯度爆炸。
训练效率:由于存在序列展开和反向传播(BPTT: Back Propagation Through Time)的特殊性,训练速度通常慢于并行度高的卷积网络。
5. RNN的常见变体:LSTM和GRU
为了克服RNN的局限性,人们提出了带有“门控”机制的循环神经网络结构,其中最典型的是LSTM和GRU。
LSTM(Long Short-Term Memory):
内存单元(Cell State):LSTM通过内存单元来存储长期信息。
门控机制:LSTM引入了忘记门(Forget Gate)、输入门(Input Gate)和输出门(Output Gate)来控制信息的流动,从而保留长期的梯度信息,缓解梯度消失问题。
应用:在很多NLP任务中,LSTM大多表现优于传统RNN。
GRU(Gated Recurrent Unit):
简化结构:GRU结构上比LSTM更简化,只有更新门(Update Gate)和重置门(Reset Gate),虽然结构更简单,但也能保留一定的长期依赖能力。
性能:在某些任务中,GRU的性能与LSTM不相上下,且训练速度更快。
6. RNN的应用实例
自然语言处理(NLP):
情感分析
文本分类
机器翻译
文本生成
时间序列预测:
股票预测
温度预测
信号处理
语音识别或合成:
处理音频序列

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

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

相关文章

SpringMVC (1)

目录 1. 什么是Spring Web MVC 1.1 MVC的定义 1.2 什么是Spring MVC 1.3 Spring Boot 1.3.1 创建一个Spring Boot项目 1.3.2 Spring Boot和Spring MVC之间的关系 2. 学习Spring MVC 2.1 SpringBoot 启动类 2.2 建立连接 1. 什么是Spring Web MVC 1.1 MVC的定义 MVC 是…

【混合开发】CefSharp+Vue 解决Cookie问题

问题表现 使用Element-admin架构搭建Vue前端项目&#xff0c;在与CefSharp搭配时&#xff0c;出现无法使用cookie的问题。 无法将token存入cookiecookie无法被读取 如下图&#xff0c;Cookies下显示file://。 正常的Cookies显示&#xff0c;Cookies显示为http://域名&#x…

jmeter事务控制器-勾选Generate Parent Sample

1、打开jmeter工具&#xff0c;添加线程组&#xff0c;添加逻辑控制器-事务控制器 2、在事务控制器&#xff0c;勾选Generate parent sample&#xff1a;生成父样本&#xff1b;说明勾选后&#xff0c;事务控制器会作为父节点&#xff0c;其下面的请求作为子节点 3、执行&#…

【Linux】进程间通信IPC

目录 进程间通信 IPC 1. 进程间通信方式 2. 无名管道 2.1 特点 2.2 函数接口 2.3 注意事项 3. 有名管道 3.1 特点 3.2 函数接口 3.3 注意事项 3.4 有名管道和无名管道的区别 4. 信号 4.1概念 4.2信号的响应方式 4.3 信号种类 4.4 函数接口 4.4.1 信号发送和挂…

SpringMVC——原理简介

狂神SSM笔记 DispatcherServlet——SpringMVC 的核心 SpringMVC 围绕DispatcherServlet设计。 DispatcherServlet的作用是将请求分发到不同的处理器&#xff08;即不同的Servlet&#xff09;。根据请求的url&#xff0c;分配到对应的Servlet接口。 当发起请求时被前置的控制…

openssl s_server源码剥离

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

算法库里的heap算法,仿函数和模版进阶(续)

文章目录 算法库里面的heap仿函数模版非类型模版参数array特化函数模版的特化类模版的特化 分离编译 算法库里面的heap sort_heap是算法库里的函数&#xff0c;前提要求是堆才能排序is_heap判断是否是堆make_heap建堆算法 int main() {int a[5] { 10,19,27,39,19 };std::vec…

具身导航如何利用取之不尽的网络视频资源!RoomTour3D:基于几何感知的视频-指令训练调优

作者&#xff1a;Mingfei Han, Liang Ma, Kamila Zhumakhanova, Ekaterina Radionova, Jingyi Zhang, Xiaojun Chang, Xiaodan Liang, Ivan Laptev 单位&#xff1a;穆罕默德本扎耶德人工智能大学计算机视觉系&#xff0c;中山大学深圳校区&#xff0c;悉尼科技大学ReLER实验室…

解决报错:未定义标识符 “M_PI“

问题&#xff1a; 使用C编译&#xff0c;已经用#include <cmath>包含了头文件&#xff0c;但是在使用M_PI时依旧报错说未定义 原因&#xff1a; 在某些编译器中&#xff0c;<cmath> 库中的 M_PI 是一个条件宏&#xff0c;需要 _USE_MATH_DEFINES 宏被定义才能使用。…

TensorFlow深度学习实战(5)——神经网络性能优化技术详解

TensorFlow深度学习实战&#xff08;5&#xff09;——神经网络性能优化技术详解 0. 前言1. 识别 MNIST 手写数字1.1 MNIST 数据集1.2 独热编码1.3 定义神经网络1.4 训练神经网络 2. 构建深度神经网络3. 添加 Dropout 提高模型泛化能力4. 不同优化器对模型性能的影响5. 训练 ep…

代码随想录算法训练营day31

代码随想录算法训练营 —day31 文章目录 代码随想录算法训练营前言一、 56. 合并区间二、738. 单调递增的数字三、968.监控二叉树总结 前言 今天是算法营的第31天&#xff0c;希望自己能够坚持下来&#xff01; 今日任务&#xff1a; ● 56. 合并区间 ● 738.单调递增的数字 …

通过maven命令上传jar包至nexus v3.7.1

1 nexus和maven的简介 1.1 nexus ‌Nexus‌是由Sonatype公司开发的一款强大的制品仓库管理软件&#xff0c;主要用于搭建和管理各种类型的仓库&#xff0c;包括Maven、NuGet、npm等。Nexus支持多种仓库类型&#xff0c;如代理仓库&#xff08;代理互联网中的中央仓库&#xf…

level(三) filterblock

filterblock用于确定某个key是否存在于某个datablock中&#xff0c;在插入一个key到datablock中时也会插入一个key到filterblock中&#xff0c;filterblock中会记录所有的key&#xff0c;并通过布隆过滤器来确定一个key是否存于这个datablock中。下面来看下filterblock的代码&a…

优化 Vue项目中 app.js 文件过大,初始化加载过慢、带宽占用过大等问题

已亲测&#xff0c;绝对有效&#xff0c;底部有改善前后对比图证明。 1.服务器 nginx 增加配置 #开启gzip压缩 gzip on; #设置gzip压缩级别&#xff0c;2级是性价比最高的 gzip_comp_level 2; #设置动态gzip压缩的文件类型 gzip_types text/plain text/css text/javascript a…

浅谈云计算16 | 存储虚拟化技术

存储虚拟化技术 一、块级存储虚拟化基础2.1 LUN 解析2.1.1 LUN 概念阐释2.1.2 LUN 功能特性 2.2 Thick LUN与Thin LUN2.2.1 Thick LUN特性剖析2.2.2 Thin LUN特性剖析 三、块级存储虚拟化技术实现3.1 基于主机的实现方式3.1.1 原理阐述3.1.2 优缺点评估 3.2 基于存储设备的实现…

手摸手实战前端项目CI CD

由于图片和格式解析问题&#xff0c;为了更好阅读体验可前往 阅读原文 CI/CD 是 持续集成&#xff08;Continuous Integration&#xff09; 和 持续交付/部署&#xff08;Continuous Delivery/Continuous Deployment&#xff09; 的缩写&#xff0c;是现代软件开发中的一种自动…

【EI 会议征稿通知】第七届机器人与智能制造技术国际会议 (ISRIMT 2025)

第七届机器人与智能制造技术国际会议 (ISRIMT 2025) 2025 7th International Symposium on Robotics & Intelligent Manufacturing Technology 会议主要围绕“机器人”、“智能制造技术” 等研究领域展开讨论&#xff0c;旨在为机器人与智能制造技术等领域的专家学者、工…

【Linux】信号

目录 一、信号的概念二、信号的产生2.1 通过键盘进行信号的产生2.2 通过系统调用进行信号的产生2.2.1 kill函数2.2.2 raise函数2.2.3 abort函数 2.3 通过异常的方式进行信号的产生2.4 通过软件条件的方式进行信号的产生2.4.1 关闭管道读端2.4.2 alarm函数 2.5 Core Dump&#x…

基于go语言的驾考系统设计与实现

在Internet时代&#xff0c;Internet信息技术已广泛应用于各个领域。 对人们的生活以及学习产生了较大的影响。通过信息技术建立的驾照考试管理系统&#xff0c;利用系统对驾照考试进行统一的管理&#xff0c;能够提驾照考试管理的工作效率&#xff0c;具有重要的现实意义。 本…

鸿蒙打包发布

HarmonyOS应用/元服务发布&#xff08;打包发布&#xff09; https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V13/ide-publish-app-V13?catalogVersionV13 密钥&#xff1a;包含非对称加密中使用的公钥和私钥&#xff0c;存储在密钥库文件中&#xff0c;格式…