手撸梯度下降预测成都市PM2.5值

更多的运行效果和数据集请查看 https://aistudio.baidu.com/aistudio/projectdetail/1938113

预测成都市PM2.5的值

为李宏毅老师的作业内容,自己实现梯度下降来预测未来的PM2.5的值。

但是我并没有完全按照作业内容来,我是读取了2021年4月份的成都市PM2.5的值,并读取前25天的内容,对后五天PM2.5的值进行预测

url = https://www.aqistudy.cn/historydata/daydata.php?city=%E6%88%90%E9%83%BD&month=202104

详细的公式推导请参考李宏毅老师的教学视频,AIstudio上面就有有字幕版本的看起来挺舒服。

数据集介绍

数据集的地址为work/data.txt里面。本来尝试爬下来,但是有反爬机制,只能手动复制下来,大佬们可以试试爬更多的数据。

每组数据有三行分别是

  • 日期 AQI
  • 质量等级
  • PM2.5 PM10 SO2 CO NO2 O3_8h

数据读取部分

由于直接复制过来会有一些奇怪的问题,导致一组数据为三行,而且只有第三行是我们需要的数据,所以我们进行了每三行进行读取并存放在list里面。

def dataReader():
    with open("./work/data.txt") as f:
        lines=f.readlines()
        i = 0
        dataList=[]
        PM2_5s=[]
        for line in lines:
            if i % 3 ==2:
                sLine = line.split('\t')
                PM2_5 = float(sLine[0])
                PM10 = sLine[1]
                SO2 = sLine[2]
                CO = sLine[3]
                NO2 = sLine[4]
                O3_8H = sLine[5]
                dataList.append(sLine)
                PM2_5s.append(PM2_5)
                #print(sLine)
            i += 1
    return dataList,PM2_5s

数据划分

利用前25天的数据我们作为训练集,后面5天的数据我们作为测试集,进行划分,利用前面的日期对后面进行预测和处理。


Alldatas,PM2_5s = dataReader()
knowDatas=[]
PredictDatas=[]
knowPM2_5s=[]
Predict2_5s=[]

#分别划分成25个已知的和5个预测的
for n in range(len(Alldatas)):
    if n <= 24:
        knowDatas.append(Alldatas[n])
        knowPM2_5s.append(PM2_5s[n])
    else:
        PredictDatas.append(Alldatas[n])
        Predict2_5s.append(PM2_5s[n])

print(knowDatas)
print(PredictDatas)

梯度下降算法部分实现

整个逻辑分成三步

    1. 计算loss function的值,对于这里而言我们使用的则是非常常见的欧氏距离

l o s s = ( y 预 − y 真 ) 2 loss = (y_{预} - y_{真})^2 loss=(yy)2

y 预 = ∑ i = 0 n ( w i x i + b ) y_{预} = \sum_{i=0}^{n}(w_{i}x_{i} + b) y=i=0n(wixi+b)

    1. 计算对应wi的偏导梯度和b的梯度

g r a d w i = 2 ( y 预 − y 真 ) ∗ ( − x i ) gradw_{i} = 2(y_{预} - y_{真})*(-x_{i}) gradwi=2(yy)(xi)

g r a d b = − 2 ( y 预 − y 真 ) gradb = -2(y_{预} - y_{真}) gradb=2(yy)

  • 3.更新梯度以及重复2步骤

w i = w i − g r a d w i w_{i} = w_{i} - gradw_{i} wi=wigradwi

b = b − g r a d b b = b - gradb b=bgradb

实际上我发现,对于简单的梯度下降实现难度不大。在期间值得注意的一点就是,我们需要确保符号等正确,不要粗细。我在编写相对应的代码过程中由于求导后是-x,从而导致没有梯度下降,而是梯度上升hhhh。


import random
import numpy as np
import matplotlib.pyplot as plt

#初始数据
lr = 0.0000001  #学习率
epochs = 100000  #训练次数
y_predict=0  #预测值
y_true = 0  #真实值
#w和b参数初始化
w_grad = [.0,.0,.0,.0,.0]
w=[.0,.0,.0,.0,.0]
for n in range(0,5):
    w[n] = random.uniform(0,1)
b = random.uniform(0,1)
b_grad = 0   

losses=[]
for epoch in range(epochs):
    for data in knowDatas:

        y_true = float(data[0]) #真实的PM2.5数据

        #计算function计算的预测值
        y_sum = 0 #wx 的和每次清零    
        for n in range(0,5):  #5个变量乘x相加
            y_sum += w[n]*float(data[n+1])
        y_predict = y_sum+b  #预测值
        
        #计算梯度
        for n in range(0,5):
            w_grad[n] = -2*(y_true-y_predict)*float(data[n+1])
        b_grad = -2*(y_true-y_predict)*1.0
        #梯度下降
        for n in range(0,5):
            w[n] = w[n] - lr * w_grad[n]
        b = b - lr * b_grad
        
        loss =  (y_true-y_predict) ** 2
    losses.append(loss)
x = range(epochs)
plt.plot(x,losses)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,LSTM 模型可以用于预测 PM2.5 浓度的变化。PM2.5 是指大气中直径小于等于2.5微米的颗粒物,它对空气质量和人体健康有重要影响。由于 PM2.5 浓度具有一定的时间序列性质,可以采用 LSTM 模型来捕捉其时间依赖关系,从而进行预测。 建立 LSTM 模型用于 PM2.5 浓度预测的一般步骤如下: 1. 数据准备: - 收集历史的 PM2.5 浓度数据,包括时间和对应的浓度数。 - 将数据划分为训练集和测试集,通常按照时间顺序划分。 2. 特征工程: - 对输入数据进行特征提取,如前一天的 PM2.5 浓度、天气情况、季节等。 - 对特征进行归一化处理,确保数据在合适的范围内。 3. 模型定义: - 使用 LSTM 网络定义模型结构,包括输入层、隐藏层和输出层。 - 可以根据实际情况选择 LSTM 单元的数量和其他超参数。 4. 模型训练: - 使用训练集对 LSTM 模型进行训练。 - 定义损失函数,如均方误差(MSE)。 - 使用反向传播算法和优化器(如随机梯度下降法)来更新模型参数,使损失函数最小化。 5. 模型评估和调优: - 使用测试集对训练好的 LSTM 模型进行评估,计算预测结果与真实之间的误差。 - 根据评估结果进行模型调优,如调整模型超参数、增加正则化等方法来改善模型性能。 6. 模型预测: - 使用训练好的 LSTM 模型对未来的 PM2.5 浓度进行预测。 - 可以根据预测结果进行相应的控制和调整,以降低空气污染风险。 需要注意的是,PM2.5 浓度受多种因素影响,包括天气、交通、工业排放等。预测模型可能需要考虑这些因素,并结合其他数据源进行综合分析和建模。此外,模型的准确性还受到数据质量和样本量的影响,因此在实际应用中需要进行细致的数据处理和模型调优。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值