本周学习内容主要由三部分,一是文献阅读,了解了文章的研究内容以及所用到的研究方法;二是大数据相关知识点的学习,了解到什么是Hadoop,及Hadoop的组成,对HDFS、Yarn、MapReduce进行介绍;三是pytorch学习,学习dataset和dataloader的应用。
题目:Long-term time-series pollution forecast using statistical and deep learning methods
作者:Pritthijit Nath, Pratik Saha, Asif Iqbal Middya & Sarbani Roy
abstract:
自过去几十年以来,解决空气污染问题已成为至关重要的问题。到目前为止,已经提出了不同的统计和深度学习方法,但很少用于预测未来的长期污染趋势。预测未来的长期污染趋势对全球政府机构来说非常重要,因为它们有助于制定有效的环境政策。本文对各种统计和深度学习方法进行了比较研究,以预测PM2.5和PM10这两类最重要的颗粒物(PM)的长期污染趋势。该研究使用政府建立的监测站收集的历史污染数据用于在各种时间序列分析技术的帮助下分析潜在的模式,然后使用不同的统计和深度学习方法对未来两年进行预测。研究结果表明,自回归(AR),季节性自回归综合移动平均线(SARIMA)和Holt-Winters等统计方法优于深度学习方法,如基于可用数据有限的堆叠,双向,自动编码器和卷积长短期记忆网络。
研究目标:
methods:
1)Missing value imputation(缺失值插补)
这里讨论了两种广泛使用的缺失值插补方法,即前均值后插补和多元插补。
1.Mean before after:将时间 i 处的缺失值替换为某个时间瞬间的值的均值i+1在未来和一次性的价值瞬间i−1在过去。
x i = x i − 1 + x i + 1 2 xi=\frac{xi-1+xi+1}{2} xi=2xi−1+xi+1
2.Multivariate imputation:如果 n 行中的 m 个具有所有特征的完整 k 个观测值集,我们可以考虑一个包含所有 n 行的矩阵 X,在第一个时具有这些 m 行。从矩阵X中,我们可以得到k个方程的形式。
2)HP 滤波 (Hodrick Prescott Filter)
Hodrick-Prescott (HP) 过滤器是指数据平滑技术。HP 过滤器通常在分析过程中应用,以消除与商业周期相关的短期波动。消除这些短期波动揭示了长期趋势。这有助于进行与商业周期相关的经济或其他预测。Hodrick-Prescott (HP)是时间序列中最常用的算法。
数学表达式:
3)simple moving average (SMA) :
简单移动平均线(SMA)又称“算术移动平均线”,是指对特定期间的收盘价进行简单平均化的意思。
4)Auto-regressive (AR)自回归
利用前期若干时刻的随机变量的线性组合来描述以后某时刻随机变量的线性回归模型。
其中: c是常数项;ɛt被假设为平均数等于0,标准差等于 σ 的随机误差值; σ被假设为对于任何的t都不变。
Seasonal auto-regressive integrated moving average (SARIMA)
表达式:
5)Stacked LSTM
长短期记忆(LSTM)网络是一种特殊的递归神经网络(RNN),旨在用于长时间记住信息。它们被明确地设计用于解决梯度消失和爆炸的问题,这与受其影响很大的RNN不同。LSTM 在其重复模块中有四个交互层,而 RNN 中有一个交互层。
it= σ (wixt+Uiht-1+bi)
ot= σ (woxt+Uoht-1+bo)
c’t= σ (wcxt+Ucht-1+bc)
ct= ft * Ct-1+ it*C’t
ht=ot*tanh(Ct)
Proposed approach:
本研究中所采用的方法是对原始数据进行缺失值插补,以便为进一步处理做好准备。然后对插补数据执行时间序列分析,以了解和提取数据的基本模式。然后使用各种统计和深度学习方法对数据进行建模,然后,创建模型用于对整个数据集进行训练,以生成下一个两年预测,进行讨论。
Conclusion:
本研究采用定量方法,根据从各种来源提取的历史污染数据,了解PM2.5和PM10的未来趋势。对使用最广泛的时间序列建模方法进行了测试,以进行我们的长期预测,并相互比较了它们的效率。基于有限的可用数据,统计方法,特别是Holt–Winters,能够胜过深度学习方法。如果可用的数据量更高,或者如果建议使用每周重采样的数据来预测未来几个月,那么深度学习模型的性能可能会相对更好。
1.Hadoop介绍
Hadoop是一个分布式系统基础架构。(分布式系统:多台服务器共同完成某一项任务)
主要解决海量数据的存储和海量数据的分析计算问题。
2.Hadoop的组成
HDFS介绍:HDFS是一个分布式文件系统
1)NameNode(nn):存储文件的元数据,如文件名、文件目录结构、文件属性(生成时间、副本数、文件权限),以及每个文件的块列表和块所在的DataNode等。
2)DataNode(dn):在本地文件系统存储文件块数据,以及块数据的校验和。
3)Secondary NameNode(2nn):每隔一段时间对NameNode元数据备份。
YARN介绍:
Yet Another Resource Negotiator ,另一种资源协调者,是Hadoop的资源管理器。有两大主键:Resource Manager 和 NodeManager 。
client客户端提交了一个作业,在节点上会产生一个AM,任务在容器中运行,容器中的资源用完释放。任务可以跨节点执行,绿色的任务在第一个上不够执行还可以分配第二个节点,
MapReduce介绍:
MapReduce将计算过程分为两个阶段:Map和Reduce
1)Map阶段并行处理输入数据
2)Reduce阶段对Map结果进行汇总
HDFS 、YARN、MapReduce 三者关系:
HDFS有三个角色,DN\NN\2NN, DN负责数据的存储,NN负责告诉别人数据存贮在那个节点,存储了什么信息,2NN备份nn;YARN负责资源的管理;客户向集群提交任务,想要查询视频,RM会找一个节点开启容器,把任务放进容器中叫APP MSTR,APP MSTR向RM申请要多少资源,开启map task。就是MapReduce中的Map,每个map task独立工作,负责检索自己的节点,返回结果reduce task,将最终的结果写道磁盘上。
6.大数据生态体系
数据来源有三个:数据库(结构化数据)、文件日志(半结构化数据)、视频 PPT(非结构化数据)
处理结构化数据用sqoop框架同步MySQL数据,文件日志用Flume日志收集,视频用kafka;sqoop,Flume,kafka这三个是数据传输层,HDFS、Hbase、kafka进行存储数据,YARN资源管理,数据计算。
练习:从fashion-MNIST的数据库中导入数据集
下载训练数据集
training_data = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor()
)
下载测试数据集
# 下载测试数据集
test_data = datasets.FashionMNIST(
root="data",
train=False,
download=True,
transform=ToTensor()
)
对数据库进行可视化
labels_map = {
0: "T-Shirt",
1: "Trouser",
2: "Pullover",
3: "Dress",
4: "Coat",
5: "Sandal",
6: "Shirt",
7: "Sneaker",
8: "Bag",
9: "Ankle Boot",
}
figure = plt.figure(figsize=(8, 8))
cols, rows = 3, 3
for i in range(1, cols * rows + 1):
sample_idx = torch.randint(len(training_data), size=(1,)).item()
img, label = training_data[sample_idx]
figure.add_subplot(rows, cols, i)
plt.title(labels_map[label])
plt.axis("off")
plt.imshow(img.squeeze(), cmap="gray")
plt.show()
定义dataset类
class CustomImageDataset(Dataset):
# 需要传入原始的数据库的路径以及可能有一些变化函数,如transform(对特征做后处理的变化函数)和target_transform(对标签做后处理的变换函数)
def __init__(self, annotations_file, img_dir, transform=None, target_transform=None):
self.img_labels = pd.read_csv(annotations_file)
self.img_dir = img_dir
self.transform = transform
self.target_transform = target_transform
# 返回整个数据库的大小
def __len__(self):
return len(self.img_labels)
# 根据索引返回对应的特征和label
def __getitem__(self, idx):
img_path = os.path.join(self.img_dir, self.img_labels.iloc[idx, 0])
image = read_image(img_path)
label = self.img_labels.iloc[idx, 1]
if self.transform:
image = self.transform(image)
if self.target_transform:
label = self.target_transform(label)
return image, label
dataset传入dataloader
train_dataloader = DataLoader(training_data, batch_size=64, shuffle=True)
test_dataloader = DataLoader(test_data, batch_size=64, shuffle=True)
对dataloader进行枚举
# Display image and label.
train_features, train_labels = next(iter(train_dataloader))
# 调用iter方法得到迭代器,通过next依次取得每个minibatch
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img = train_features[0].squeeze()
label = train_labels[0]
plt.imshow(img, cmap="gray")
plt.show()
print(f"Label: {label}")
transforms作用:
学习transforms,有时从磁盘中读取的特征和标签无法直接运用到神经网络中,可能需要对图片的大小进行约束或图片的通道和像素值,通常读取照片后会用transform函数对图片进行变换以满足要求。一般transform函数会在dataset中定义,在getitem中去应用。
target_transform:对标签的后处理,比如分类问题,从磁盘中读取的标签是整型,但是神经网络的输出是one-hot的形式,需要对整型标签进行变换。
本周阅读文献只是大概了解了在研究什么,下周会深入了解具体做了什么;对大数据项目的基础知识进行学习,下周进行Hadoop数据部分的部署。