基于LSTM神经网络结构模型的北京空气质量预测实验报告含python程序源代码数据说明

发布时间:2024年01月15日

基于LSTM神经网络结构模型的北京空气质量预测实验报告含python程序源代码数据说明

本实验旨在利用LSTM(Long Short-Term Memory,长短期记忆网络)神经网络模型,对北京市的空气质量进行预测。通过历史的气象和空气质量数据,训练LSTM模型,以便在未来时间点预测北京市的空气质量水平,从而提供有关空气质量改善措施的预测参考。**LSTM模型构建:**- 设计LSTM神经网络结构,包括输入层、隐藏层和输出层,根据数据特点和预测目标进行合适的设置。- 配置LSTM模型的超参数,如时间步长、隐藏层神经元数量、学习率等。- 使用训练集数据对LSTM模型进行训练,通过反向传播算法更新模型参数,优化模型性能。**模型评估与调优:**- 使用测试集数据对训练好的LSTM模型进行评估,计算预测结果与真实值之间的误差指标(如均方根误差、平均绝对误差等)。- 根据评估结果进行模型调优,可能调整模型结构或超参数,以提高预测准确性。

数据集介绍

这是一个空气质量数据集,报告了北京2010年到2014年每小时气压风向雨雪量等相关物理量的数据集来反映空气污染水平。

属性字段

简要说明

No

行号

year

此列中数据的年份

month

此列中数据的月份

day

此列中数据的几号

hour

此行中数据的小时

pm2.5

PM2.5浓度

DEWP

露点温度

TEMP

对应时刻的温度

PRES

对应时刻的气压

cbwd

组合风向

Iws

累计风速

Is

累计降雪时数

ls

累计降雨时数

  • 数据处理

1.将日期时间信息合并为单个日期时间,以便可以将其用作 Pandas 中的索引。

2.删除存在空值数据和标签属性行。

3.将数据集中的'pollution'列中的缺失值(NA)用 0 填充。

4.删除数据集中的前 24 行数据。

5.将数据集保存到名为'pollution.csv'的 CSV 文件中

综合起来,该段代码实现了从名为 'raw.csv'的文件中读取数据集,解析日期时间列,进行一些数据处理(如删除列、填充缺失值、删除行),然后将处理后的数据保存为'pollution.csv'文件,并打印出数据集的前 5 行。

处理结果(部分'pollution.csv'数据展示):

数据绘图

这段代码的目的是通过绘图展示数据集中特定列的趋势变化。每个子图对应于一个特定列,图表的纵轴表示该列的数值,横轴表示时间或数据点的索引。通过绘制折线图,可以观察到每个特定列随时间的变化趋势。不同的子图分别展示了不同列的趋势,每个子图都有相应的标题来指示所展示的列。该代码段的输出结果是一个包含多个子图的图表,每个子图对应一个特定列的趋势。

结果:

  • 将数据转换成监督学习数据

该步骤将数据集构建为监督学习问题并对输入变量进行标准化。

将监督学习问题定义为根据前一时间步骤的污染测量和天气条件来预测当前时间 (t) 的污染。首先,加载“pollution.csv”数据集。风向特征是标签编码的(整数编码)。接下来,对所有特征进行归一化,然后将数据集转化为监督学习问题。然后删除要预测的小时 (t) 的天气变量。

1.定义series_to_supervised函数:该函数将时间序列数据转换为监督学习型数据。它接受参数data表示输入数据,n_in表示输入序列长度,n_out表示输出序列长度,dropna表示是否删除包含空值的行。函数首先将数据转换为数据框,并创建空的列列表和列名列表。然后,它通过使用df.shift方法向列列表中添加平移后的数据。接下来,函数将列列表中的张量按列拼接起来,创建一个包含输入和输出序列的数据框。最后,函数重命名列名,并根据dropnan参数删除包含空值的行,最终返回转换后的数据框。

2.数据预处理:

?? 对"风向"列进行数字编码转换:使用LabelEncoder将字符串标签转换为数值编码,并将结果存储回原始数据集中。

?? 数据类型转换:将数据集中的所有值转换为浮点型,以便后续的数据缩放。

?? 数据缩放:使用MinMaxScaler对数据进行缩放,将所有特征值缩放到[0, 1]的范围内。

3.数据转换为监督学习型数据:调用series_to_supervised函数,将缩放后的数据转换为监督学习型数据集。设置输入序列长度为1,输出序列长度为1。转换后的数据集存储在reframed变量中。

4.删掉不需要预测的列:使用drop方法删除不需要的列,通过指定axis=1表示列操作,inplace=True表示原地修改。

5.打印删减后的数据集的前几行,最终的数据集形式是:v1(t-1), v2(t-2), v3(t-3), v4(t-4), v5(t-5), v6(t-6), v7(t-7), v8(t-1), v1(t),其中v1(t-1)到v8(t-1)表示前一天的数据,v1(t)表示当天要预测的数据。

转换后部分数据展示:

三、模型介绍

1.LSTM模型

LSTM(Long Short-Term Memory)是一种常用于处理序列数据的循环神经网络(RNN)模型。相比于传统的RNN,LSTM在处理长期依赖性问题上表现更好。它通过引入特殊的记忆单元和门控机制来有效地捕捉和管理序列中的长期依赖关系。

1.1 LSTM单元

LSTM模型中的关键组件是LSTM单元,每个LSTM单元由以下部分组成:

1. 输入门(Input Gate):决定是否将输入信息纳入记忆。

2. 遗忘门(Forget Gate):决定是否从记忆中删除先前的信息。

3. 输出门(Output Gate):决定从记忆中输出的信息。

4. 记忆单元(Cell State):负责存储和传递信息的长期记忆。

LSTM通过在每个时间步骤中执行一系列的数学操作来处理序列数据:

1. 输入信息经过输入门,决定哪些信息需要被记忆。

2. 遗忘门根据当前输入信息和上一个时间步骤的隐藏状态,决定需要从记忆单元中删除哪些信息。

3. 记忆单元根据输入门和遗忘门的结果来更新和存储记忆。

4. 输出门根据当前输入信息和上一个时间步骤的隐藏状态,决定从记忆单元中输出哪些信息。

5.隐藏状态(Hidden State)是LSTM的输出,它被传递到下一个时间步骤,并作为输入用于更新记忆单元。

    1. RNN与LSRM对比

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

LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

1.3 LSTM的核心思想

LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个按位的乘法操作。

Sigmoid 层输出0到1之间的数值,描述每个部分有多少量可以通过。代表“不许任何量通过”,就指“允许任意量通过”。

1.4 LSTM的优点

LSTM模型在处理序列数据时具有以下优点:

1. 长期依赖性处理:传统的RNN模型在处理长序列时容易出现梯度消失或梯度爆炸的问题,导致难以捕捉长期依赖关系。LSTM通过门控机制可以有效地解决这个问题,使得模型能够更好地记住和利用长期的信息。

2. 学习长期模式:LSTM能够学习到序列数据中的长期模式和规律,对于时间序列预测、自然语言处理等任务非常有效。

3. 可变长度输入:LSTM模型可以接受可变长度的输入序列,适用于处理不同长度的序列数据。

4. 鲁棒性:LSTM模型对于噪声和输入数据中的局部扰动具有一定的鲁棒性,能够更好地处理复杂的序列数据。

在实际应用中,LSTM模型常用于时间序列预测、文本生成、语音识别等任务,它的灵活性和强大的建模能力使其成为处理序列数据的重要工具。

四、划分数据集

将数据集按照一定的时间范围划分为训练集和测试集,并将输入数据和输出标签进行预处理和格式转换,以便用于 LSTM 模型的训练和测试。

  • LSTM模型结构

模型的输入形状为 (None, train_X.shape[1], train_X.shape[2]),其中 train_X.shape[1]表示训练数据的时间步数,train_X.shape[2]表示每个时间步的特征数量。输出形状为 (None, 1),预测一个数值。模型总共有 10,651 个可训练参数,其中 LSTM 层有10,600个参数,Dense层有51个参数。该模型使用均方误差(MAE)作为损失函数,使用 Adam 优化器进行模型训练。

  • 训练模型

进行 LSTM 模型的拟合,训练模型并记录训练过程中的损失值和验证损失值,最后将损失曲线进行可视化展示。通过观察损失曲线的变化,可以评估模型的训练效果和验证效果,以判断模型的性能和是否存在过拟合或欠拟合的情况。

  • 模型预测

模型拟合后,预测整个测试数据集,计算模型的误差分数。

数据集介绍

这是一个空气质量数据集,报告了北京2010年到2014年每小时气压风向雨雪量等相关物理量的数据集来反映空气污染水平。

属性字段

简要说明

No

行号

year

此列中数据的年份

month

此列中数据的月份

day

此列中数据的几号

hour

此行中数据的小时

pm2.5

PM2.5浓度

DEWP

露点温度

TEMP

对应时刻的温度

PRES

对应时刻的气压

cbwd

组合风向

Iws

累计风速

Is

累计降雪时数

ls

累计降雨时数

  • 数据处理

1.将日期时间信息合并为单个日期时间,以便可以将其用作 Pandas 中的索引。

2.删除存在空值数据和标签属性行。

3.将数据集中的'pollution'列中的缺失值(NA)用 0 填充。

4.删除数据集中的前 24 行数据。

5.将数据集保存到名为'pollution.csv'的 CSV 文件中

综合起来,该段代码实现了从名为 'raw.csv'的文件中读取数据集,解析日期时间列,进行一些数据处理(如删除列、填充缺失值、删除行),然后将处理后的数据保存为'pollution.csv'文件,并打印出数据集的前 5 行。

处理结果(部分'pollution.csv'数据展示):

数据绘图

这段代码的目的是通过绘图展示数据集中特定列的趋势变化。每个子图对应于一个特定列,图表的纵轴表示该列的数值,横轴表示时间或数据点的索引。通过绘制折线图,可以观察到每个特定列随时间的变化趋势。不同的子图分别展示了不同列的趋势,每个子图都有相应的标题来指示所展示的列。该代码段的输出结果是一个包含多个子图的图表,每个子图对应一个特定列的趋势。

结果:

  • 将数据转换成监督学习数据

该步骤将数据集构建为监督学习问题并对输入变量进行标准化。

将监督学习问题定义为根据前一时间步骤的污染测量和天气条件来预测当前时间 (t) 的污染。首先,加载“pollution.csv”数据集。风向特征是标签编码的(整数编码)。接下来,对所有特征进行归一化,然后将数据集转化为监督学习问题。然后删除要预测的小时 (t) 的天气变量。

1.定义series_to_supervised函数:该函数将时间序列数据转换为监督学习型数据。它接受参数data表示输入数据,n_in表示输入序列长度,n_out表示输出序列长度,dropna表示是否删除包含空值的行。函数首先将数据转换为数据框,并创建空的列列表和列名列表。然后,它通过使用df.shift方法向列列表中添加平移后的数据。接下来,函数将列列表中的张量按列拼接起来,创建一个包含输入和输出序列的数据框。最后,函数重命名列名,并根据dropnan参数删除包含空值的行,最终返回转换后的数据框。

2.数据预处理:

?? 对"风向"列进行数字编码转换:使用LabelEncoder将字符串标签转换为数值编码,并将结果存储回原始数据集中。

?? 数据类型转换:将数据集中的所有值转换为浮点型,以便后续的数据缩放。

?? 数据缩放:使用MinMaxScaler对数据进行缩放,将所有特征值缩放到[0, 1]的范围内。

3.数据转换为监督学习型数据:调用series_to_supervised函数,将缩放后的数据转换为监督学习型数据集。设置输入序列长度为1,输出序列长度为1。转换后的数据集存储在reframed变量中。

4.删掉不需要预测的列:使用drop方法删除不需要的列,通过指定axis=1表示列操作,inplace=True表示原地修改。

5.打印删减后的数据集的前几行,最终的数据集形式是:v1(t-1), v2(t-2), v3(t-3), v4(t-4), v5(t-5), v6(t-6), v7(t-7), v8(t-1), v1(t),其中v1(t-1)到v8(t-1)表示前一天的数据,v1(t)表示当天要预测的数据。

转换后部分数据展示:

三、模型介绍

1.LSTM模型

LSTM(Long Short-Term Memory)是一种常用于处理序列数据的循环神经网络(RNN)模型。相比于传统的RNN,LSTM在处理长期依赖性问题上表现更好。它通过引入特殊的记忆单元和门控机制来有效地捕捉和管理序列中的长期依赖关系。

1.1 LSTM单元

LSTM模型中的关键组件是LSTM单元,每个LSTM单元由以下部分组成:

1. 输入门(Input Gate):决定是否将输入信息纳入记忆。

2. 遗忘门(Forget Gate):决定是否从记忆中删除先前的信息。

3. 输出门(Output Gate):决定从记忆中输出的信息。

4. 记忆单元(Cell State):负责存储和传递信息的长期记忆。

LSTM通过在每个时间步骤中执行一系列的数学操作来处理序列数据:

1. 输入信息经过输入门,决定哪些信息需要被记忆。

2. 遗忘门根据当前输入信息和上一个时间步骤的隐藏状态,决定需要从记忆单元中删除哪些信息。

3. 记忆单元根据输入门和遗忘门的结果来更新和存储记忆。

4. 输出门根据当前输入信息和上一个时间步骤的隐藏状态,决定从记忆单元中输出哪些信息。

5.隐藏状态(Hidden State)是LSTM的输出,它被传递到下一个时间步骤,并作为输入用于更新记忆单元。

    1. RNN与LSRM对比

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

LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

1.3 LSTM的核心思想

LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个按位的乘法操作。

Sigmoid 层输出0到1之间的数值,描述每个部分有多少量可以通过。代表“不许任何量通过”,就指“允许任意量通过”。

1.4 LSTM的优点

LSTM模型在处理序列数据时具有以下优点:

1. 长期依赖性处理:传统的RNN模型在处理长序列时容易出现梯度消失或梯度爆炸的问题,导致难以捕捉长期依赖关系。LSTM通过门控机制可以有效地解决这个问题,使得模型能够更好地记住和利用长期的信息。

2. 学习长期模式:LSTM能够学习到序列数据中的长期模式和规律,对于时间序列预测、自然语言处理等任务非常有效。

3. 可变长度输入:LSTM模型可以接受可变长度的输入序列,适用于处理不同长度的序列数据。

4. 鲁棒性:LSTM模型对于噪声和输入数据中的局部扰动具有一定的鲁棒性,能够更好地处理复杂的序列数据。

在实际应用中,LSTM模型常用于时间序列预测、文本生成、语音识别等任务,它的灵活性和强大的建模能力使其成为处理序列数据的重要工具。

四、划分数据集

将数据集按照一定的时间范围划分为训练集和测试集,并将输入数据和输出标签进行预处理和格式转换,以便用于 LSTM 模型的训练和测试。

  • LSTM模型结构

模型的输入形状为 (None, train_X.shape[1], train_X.shape[2]),其中 train_X.shape[1]表示训练数据的时间步数,train_X.shape[2]表示每个时间步的特征数量。输出形状为 (None, 1),预测一个数值。模型总共有 10,651 个可训练参数,其中 LSTM 层有10,600个参数,Dense层有51个参数。该模型使用均方误差(MAE)作为损失函数,使用 Adam 优化器进行模型训练。

  • 训练模型

进行 LSTM 模型的拟合,训练模型并记录训练过程中的损失值和验证损失值,最后将损失曲线进行可视化展示。通过观察损失曲线的变化,可以评估模型的训练效果和验证效果,以判断模型的性能和是否存在过拟合或欠拟合的情况。

  • 模型预测

模型拟合后,预测整个测试数据集,计算模型的误差分数。

数据集介绍

这是一个空气质量数据集,报告了北京2010年到2014年每小时气压风向雨雪量等相关物理量的数据集来反映空气污染水平。

属性字段

简要说明

No

行号

year

此列中数据的年份

month

此列中数据的月份

day

此列中数据的几号

hour

此行中数据的小时

pm2.5

PM2.5浓度

DEWP

露点温度

TEMP

对应时刻的温度

PRES

对应时刻的气压

cbwd

组合风向

Iws

累计风速

Is

累计降雪时数

ls

累计降雨时数

  • 数据处理

1.将日期时间信息合并为单个日期时间,以便可以将其用作 Pandas 中的索引。

2.删除存在空值数据和标签属性行。

3.将数据集中的'pollution'列中的缺失值(NA)用 0 填充。

4.删除数据集中的前 24 行数据。

5.将数据集保存到名为'pollution.csv'的 CSV 文件中

综合起来,该段代码实现了从名为 'raw.csv'的文件中读取数据集,解析日期时间列,进行一些数据处理(如删除列、填充缺失值、删除行),然后将处理后的数据保存为'pollution.csv'文件,并打印出数据集的前 5 行。

处理结果(部分'pollution.csv'数据展示):

数据绘图

这段代码的目的是通过绘图展示数据集中特定列的趋势变化。每个子图对应于一个特定列,图表的纵轴表示该列的数值,横轴表示时间或数据点的索引。通过绘制折线图,可以观察到每个特定列随时间的变化趋势。不同的子图分别展示了不同列的趋势,每个子图都有相应的标题来指示所展示的列。该代码段的输出结果是一个包含多个子图的图表,每个子图对应一个特定列的趋势。

结果:

  • 将数据转换成监督学习数据

该步骤将数据集构建为监督学习问题并对输入变量进行标准化。

将监督学习问题定义为根据前一时间步骤的污染测量和天气条件来预测当前时间 (t) 的污染。首先,加载“pollution.csv”数据集。风向特征是标签编码的(整数编码)。接下来,对所有特征进行归一化,然后将数据集转化为监督学习问题。然后删除要预测的小时 (t) 的天气变量。

1.定义series_to_supervised函数:该函数将时间序列数据转换为监督学习型数据。它接受参数data表示输入数据,n_in表示输入序列长度,n_out表示输出序列长度,dropna表示是否删除包含空值的行。函数首先将数据转换为数据框,并创建空的列列表和列名列表。然后,它通过使用df.shift方法向列列表中添加平移后的数据。接下来,函数将列列表中的张量按列拼接起来,创建一个包含输入和输出序列的数据框。最后,函数重命名列名,并根据dropnan参数删除包含空值的行,最终返回转换后的数据框。

2.数据预处理:

?? 对"风向"列进行数字编码转换:使用LabelEncoder将字符串标签转换为数值编码,并将结果存储回原始数据集中。

?? 数据类型转换:将数据集中的所有值转换为浮点型,以便后续的数据缩放。

?? 数据缩放:使用MinMaxScaler对数据进行缩放,将所有特征值缩放到[0, 1]的范围内。

3.数据转换为监督学习型数据:调用series_to_supervised函数,将缩放后的数据转换为监督学习型数据集。设置输入序列长度为1,输出序列长度为1。转换后的数据集存储在reframed变量中。

4.删掉不需要预测的列:使用drop方法删除不需要的列,通过指定axis=1表示列操作,inplace=True表示原地修改。

5.打印删减后的数据集的前几行,最终的数据集形式是:v1(t-1), v2(t-2), v3(t-3), v4(t-4), v5(t-5), v6(t-6), v7(t-7), v8(t-1), v1(t),其中v1(t-1)到v8(t-1)表示前一天的数据,v1(t)表示当天要预测的数据。

转换后部分数据展示:

三、模型介绍

1.LSTM模型

LSTM(Long Short-Term Memory)是一种常用于处理序列数据的循环神经网络(RNN)模型。相比于传统的RNN,LSTM在处理长期依赖性问题上表现更好。它通过引入特殊的记忆单元和门控机制来有效地捕捉和管理序列中的长期依赖关系。

1.1 LSTM单元

LSTM模型中的关键组件是LSTM单元,每个LSTM单元由以下部分组成:

1. 输入门(Input Gate):决定是否将输入信息纳入记忆。

2. 遗忘门(Forget Gate):决定是否从记忆中删除先前的信息。

3. 输出门(Output Gate):决定从记忆中输出的信息。

4. 记忆单元(Cell State):负责存储和传递信息的长期记忆。

LSTM通过在每个时间步骤中执行一系列的数学操作来处理序列数据:

1. 输入信息经过输入门,决定哪些信息需要被记忆。

2. 遗忘门根据当前输入信息和上一个时间步骤的隐藏状态,决定需要从记忆单元中删除哪些信息。

3. 记忆单元根据输入门和遗忘门的结果来更新和存储记忆。

4. 输出门根据当前输入信息和上一个时间步骤的隐藏状态,决定从记忆单元中输出哪些信息。

5.隐藏状态(Hidden State)是LSTM的输出,它被传递到下一个时间步骤,并作为输入用于更新记忆单元。

    1. RNN与LSRM对比

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

LSTM 同样是这样的结构,但是重复的模块拥有一个不同的结构。不同于 单一神经网络层,这里是有四个,以一种非常特殊的方式进行交互。

1.3 LSTM的核心思想

LSTM 的关键就是细胞状态,水平线在图上方贯穿运行。细胞状态类似于传送带。直接在整个链上运行,只有一些少量的线性交互。信息在上面流传保持不变会很容易。

LSTM 有通过精心设计的称作为“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法。他们包含一个 sigmoid 神经网络层和一个按位的乘法操作。

Sigmoid 层输出0到1之间的数值,描述每个部分有多少量可以通过。代表“不许任何量通过”,就指“允许任意量通过”。

1.4 LSTM的优点

LSTM模型在处理序列数据时具有以下优点:

1. 长期依赖性处理:传统的RNN模型在处理长序列时容易出现梯度消失或梯度爆炸的问题,导致难以捕捉长期依赖关系。LSTM通过门控机制可以有效地解决这个问题,使得模型能够更好地记住和利用长期的信息。

2. 学习长期模式:LSTM能够学习到序列数据中的长期模式和规律,对于时间序列预测、自然语言处理等任务非常有效。

3. 可变长度输入:LSTM模型可以接受可变长度的输入序列,适用于处理不同长度的序列数据。

4. 鲁棒性:LSTM模型对于噪声和输入数据中的局部扰动具有一定的鲁棒性,能够更好地处理复杂的序列数据。

在实际应用中,LSTM模型常用于时间序列预测、文本生成、语音识别等任务,它的灵活性和强大的建模能力使其成为处理序列数据的重要工具。

四、划分数据集

将数据集按照一定的时间范围划分为训练集和测试集,并将输入数据和输出标签进行预处理和格式转换,以便用于 LSTM 模型的训练和测试。

  • LSTM模型结构

模型的输入形状为 (None, train_X.shape[1], train_X.shape[2]),其中 train_X.shape[1]表示训练数据的时间步数,train_X.shape[2]表示每个时间步的特征数量。输出形状为 (None, 1),预测一个数值。模型总共有 10,651 个可训练参数,其中 LSTM 层有10,600个参数,Dense层有51个参数。该模型使用均方误差(MAE)作为损失函数,使用 Adam 优化器进行模型训练。

  • 训练模型

进行 LSTM 模型的拟合,训练模型并记录训练过程中的损失值和验证损失值,最后将损失曲线进行可视化展示。通过观察损失曲线的变化,可以评估模型的训练效果和验证效果,以判断模型的性能和是否存在过拟合或欠拟合的情况。

  • 模型预测

模型拟合后,预测整个测试数据集,计算模型的误差分数。

文章来源:https://blog.csdn.net/yushibing717/article/details/135526864
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。