文章目录

一、前期工作

  1. 导入库包
  2. 导入数据
  3. 主成分分析(PCA)
  4. 聚类分析(K-means)

二、神经网络模型建立
三、检验模型

大家好,我是微学AI,今天给大家带来一个利用卷积神经网络(pytorch版)实现空气质量的识别分类与预测。
我们知道雾霾天气是一种大气污染状态,PM2.5被认为是造成雾霾天气的“元凶”,PM2.5日均值越小,空气质量越好.
空气质量评价的主要污染物为细颗粒物(PM2.5)、可吸入颗粒物(PM10)、二氧化硫(SO2)、二氧化氮(NO2)、臭氧(O3)、一氧化碳(CO)等六项。

现在我们收集了多个城市的天气指标数据,数据样例如下:

一、前期工作

1. 导入库包

import torch
import torch.nn as nn
import torch.utils.data as Data
import numpy as np
import pymysql
import datetime
import csv
import time
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.decomposition import PCA

2. 导入数据

data =pd.read_csv("weather.csv",encoding='gb18030')
print(data)

3. 主成分分析(PCA)

天气数据中变量有6个,这增加分析问题的难度与复杂性,而且数据中多个变量之间是具有一定的相关关系的。 因此,我们想到能否在相关分析的基础上,用较少的新变量代替原来较多的旧变量,这里就采用了主成分分析原理(PCA),PCA的基本思想就是降维。下面代码将原理6个变量通过变化映射成两个新变量。

pca = PCA(n_components=2)
new_pca = pd.DataFrame(pca.fit_transform(data))
X = new_pca.values
print(new_pca)

4. 聚类分析(K-means)

K-means是一种迭代求解的聚类分析算法,主要步骤是:我们将设定分组类K,系统随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象重新计算。这个过程将不断重复直到满足某个终止条件。聚类算法这边直接调用sklearn.cluster中的KMeans算法。当数据没有类别标注的时候,我们可以采用无监督学习聚类分析进行标注每条数据的簇类。

kms = KMeans(n_clusters=6)  # 6表示聚类的个数
#获取类别标签
Y= kms.fit_predict(data)
data['class'] = Y
data.to_csv("weather_new.csv",index=False) #保存文件#绘制聚类发布图
d = new_pca[Y == 0]
plt.plot(d[0], d[1], 'r.')
d = new_pca[Y == 1]
plt.plot(d[0], d[1], 'g.')
d = new_pca[Y == 2]
plt.plot(d[0], d[1], 'b.')
d = new_pca[Y == 3]
plt.plot(d[0], d[1], 'y.')
d = new_pca[Y == 4]
plt.plot(d[0], d[1],'c.')
d = new_pca[Y == 5]
plt.plot(d[0], d[1],'k.')
plt.show()


图中将数据用不同颜色分为6类,从图中可直观得看到数据位置相近的分为一类。

二、神经网络模型建立

class MyNet(nn.Module):def __init__(self):super(MyNet, self).__init__()self.con1 = nn.Sequential(nn.Conv1d(in_channels=1, out_channels=64, kernel_size=3, stride=1, padding=1),nn.MaxPool1d(kernel_size=1),nn.ReLU(),)self.con2 = nn.Sequential(nn.Conv1d(in_channels=64, out_channels=128, kernel_size=3, stride=1, padding=1),nn.MaxPool1d(kernel_size=1),nn.ReLU(),)self.fc = nn.Sequential(# 线性分类器nn.Linear(128*6*1, 128),  nn.ReLU(),nn.Linear(128, 6),# nn.Softmax(dim=1),)self.mls = nn.MSELoss()self.opt = torch.optim.Adam(params=self.parameters(), lr=1e-3)self.start = datetime.datetime.now()def forward(self, inputs):out = self.con1(inputs)out = self.con2(out)out = out.view(out.size(0), -1)  # 展开成一维out = self.fc(out)return outdef train(self, x, y):out = self.forward(x)loss = self.mls(out, y)self.opt.zero_grad()loss.backward()self.opt.step()return lossdef test(self, x):out = self.forward(x)return outdef get_data(self):with open('weather_new.csv', 'r') as f:results = csv.reader(f)results = [row for row in results]results = results[1:1500]inputs = []labels = []for result in results:# one-hot独热编码one_hot = [0 for i in range(6)]index = int(result[6])-1one_hot[index] = 1labels.append(one_hot)input = result[:6]input = [float(x) for x in input]inputs.append(input)time.sleep(10)inputs = np.array(inputs)labels = np.array(labels)inputs = torch.from_numpy(inputs).float()inputs = torch.unsqueeze(inputs, 1)labels = torch.from_numpy(labels).float()return inputs, labelsdef get_test_data(self):with open('weather_new.csv', 'r') as f:results = csv.reader(f)results = [row for row in results]results = results[1500: 1817]inputs = []labels = []for result in results:label = [result[6]]input = result[:6]input = [float(x) for x in input]label = [float(y) for y in label]inputs.append(input)labels.append(label)inputs = np.array(inputs)inputs = torch.from_numpy(inputs).float()inputs = torch.unsqueeze(inputs, 1)labels = np.array(labels)labels = torch.from_numpy(labels).float()return inputs, labels

三、训练模型

EPOCH = 100
BATCH_SIZE = 50net = MyNet()
x_data, y_data = net.get_data()
torch_dataset = Data.TensorDataset(x_data, y_data)
loader = Data.DataLoader(dataset=torch_dataset,batch_size=BATCH_SIZE,shuffle=True,num_workers=2,)
for epoch in range(EPOCH):for step, (batch_x, batch_y) in enumerate(loader):# print(step)# print(step,'batch_x={};  batch_y={}'.format(batch_x, batch_y))a = net.train(batch_x, batch_y)print('step:',step,a)# 保存模型
torch.save(net, 'net.pkl')

开始训练:

step: 0 tensor(3.6822, grad_fn=<MseLossBackward0>)
step: 1 tensor(61.2186, grad_fn=<MseLossBackward0>)
step: 2 tensor(18.2877, grad_fn=<MseLossBackward0>)
step: 3 tensor(4.3641, grad_fn=<MseLossBackward0>)
step: 4 tensor(6.7846, grad_fn=<MseLossBackward0>)
step: 5 tensor(9.4255, grad_fn=<MseLossBackward0>)
step: 6 tensor(5.4232, grad_fn=<MseLossBackward0>)
step: 7 tensor(4.1342, grad_fn=<MseLossBackward0>)
step: 8 tensor(2.0944, grad_fn=<MseLossBackward0>)
step: 9 tensor(1.4549, grad_fn=<MseLossBackward0>)
step: 10 tensor(0.9372, grad_fn=<MseLossBackward0>)
step: 11 tensor(1.0688, grad_fn=<MseLossBackward0>)
step: 12 tensor(0.6717, grad_fn=<MseLossBackward0>)
step: 13 tensor(0.6158, grad_fn=<MseLossBackward0>)
step: 14 tensor(0.6889, grad_fn=<MseLossBackward0>)
step: 15 tensor(0.5306, grad_fn=<MseLossBackward0>)
step: 16 tensor(0.5781, grad_fn=<MseLossBackward0>)
step: 17 tensor(0.3959, grad_fn=<MseLossBackward0>)
step: 18 tensor(0.4629, grad_fn=<MseLossBackward0>)
step: 19 tensor(0.3646, grad_fn=<MseLossBackward0>)

四、检验模型

# 加载模型
net = torch.load('net.pkl')
x_data, y_data = net.get_test_data()
torch_dataset = Data.TensorDataset(x_data, y_data)loader = Data.DataLoader(dataset=torch_dataset,batch_size=100,shuffle=False,num_workers=1,)
num_success = 0
num_sum = 317
for step, (batch_x, batch_y) in enumerate(loader):# print(step)output = net.test(batch_x)# output = output.detach().numpy()y = batch_y.detach().numpy()for index, i in enumerate(output):i = i.detach().numpy()i = i.tolist()j = i.index(max(i))print('输出为{}标签为{}'.format(j+1, y[index][0]))loss = j+1-y[index][0]if loss == 0.0:num_success += 1print('正确率为{}'.format(num_success/num_sum))

输出结果:

....
输出为3标签为3.0
输出为4标签为4.0
输出为5标签为5.0
输出为1标签为1.0
输出为3标签为3.0
输出为3标签为3.0
输出为3标签为3.0
输出为4标签为4.0
正确率为0.9495268138801262

模型预测结果为94.95%;
数据中字段“fcm”分类,表示数据的类别:
数字1表示:空气质量:优;
数字2表示:空气质量:良;
数字3表示:空气质量:轻度污染;
数字4表示:空气质量:中度污染,雾霾
数字5表示:空气质量:重度污染,雾霾
数字6表示:空气质量:严重污染,雾霾
数据集的获取私信我!后期有更精彩和更有深度的实战内容,敬请期待!

往期作品:

深度学习实战项目

1.深度学习实战1-(keras框架)企业数据分析与预测

2.深度学习实战2-(keras框架)企业信用评级与预测

3.深度学习实战3-文本卷积神经网络(TextCNN)新闻文本分类

4.深度学习实战4-卷积神经网络(DenseNet)数学图形识别+题目模式识别

5.深度学习实战5-卷积神经网络(CNN)中文OCR识别项目

6.深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测

7.深度学习实战7-电商产品评论的情感分析

8.深度学习实战8-生活照片转化漫画照片应用

9.深度学习实战9-文本生成图像-本地电脑实现text2img

10.深度学习实战10-数学公式识别-将图片转换为Latex(img2Latex)

11.深度学习实战11(进阶版)-BERT模型的微调应用-文本分类案例

12.深度学习实战12(进阶版)-利用Dewarp实现文本扭曲矫正

13.深度学习实战13(进阶版)-文本纠错功能,经常写错别字的小伙伴的福星

14.深度学习实战14(进阶版)-手写文字OCR识别,手写笔记也可以识别了

15.深度学习实战15(进阶版)-让机器进行阅读理解+你可以变成出题者提问

16.深度学习实战16(进阶版)-虚拟截图识别文字-可以做纸质合同和表格识别

17.深度学习实战17(进阶版)-智能辅助编辑平台系统的搭建与开发案例

18.深度学习实战18(进阶版)-NLP的15项任务大融合系统,可实现市面上你能想到的NLP任务

19.深度学习实战19(进阶版)-ChatGPT的本地实现部署测试,自己的平台就可以实现ChatGPT

…(待更新)

深度学习实战6-卷积神经网络(Pytorch)+聚类分析实现空气质量与天气预测相关推荐

  1. 深度学习实战——利用卷积神经网络对手写数字二值图像分类(附代码)

    系列文章目录 深度学习实战--利用卷积神经网络对手写数字二值图像分类(附代码) 目录 系列文章目录 前言 一.案例需求 二.MATLAB算法实现 三.MATLAB源代码 参考文献 前言 本案例利用MA ...

  2. PyTorch深度学习实战 | 典型卷积神经网络

    在深度学习的发展过程中,出现了很多经典的卷积神经网络,它们对深度学习的学术研究和工业生产都起到了巨大的促进作用,如VGG.ResNet.Inception和DenseNet等,很多投入实用的卷积神经都 ...

  3. 深度学习教程(10) | 卷积神经网络解读(吴恩达·完整版)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/35 本文地址:http://www.showmeai.tech/article-det ...

  4. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-04-基于Python的LeNet之MLP

    原文地址可以查看更多信息 本文主要参考于:Multilayer Perceptron  python源代码(github下载 CSDN免费下载) 本文主要介绍含有单隐层的MLP的建模及实现.建议在阅读 ...

  5. 深度学习(DL)与卷积神经网络(CNN)学习笔记随笔-03-基于Python的LeNet之LR

    原地址可以查看更多信息 本文主要参考于:Classifying MNIST digits using Logistic Regression  python源代码(GitHub下载 CSDN免费下载) ...

  6. 【深度学习系列】卷积神经网络CNN原理详解(一)——基本原理(1)

    上篇文章我们给出了用paddlepaddle来做手写数字识别的示例,并对网络结构进行到了调整,提高了识别的精度.有的同学表示不是很理解原理,为什么传统的机器学习算法,简单的神经网络(如多层感知机)都可 ...

  7. 深度学习21天——卷积神经网络(CNN):实现mnist手写数字识别(第1天)

    目录 一.前期准备 1.1 环境配置 1.2 CPU和GPU 1.2.1 CPU 1.2.2 GPU 1.2.3 CPU和GPU的区别 第一步:设置GPU 1.3 MNIST 手写数字数据集 第二步: ...

  8. 深度学习算法中卷积神经网络的应用

    下面一起来探讨一下关于深度学习算法中卷积神经网络的基本概念和应用: 1.卷积神经网络基本概念 卷积神经网络也是在传统人工神经网络的基础上发展起来的,它与 BP 神经网络有很大的相似之处,但也有很大的区 ...

  9. [人工智能-深度学习-33]:卷积神经网络CNN - 常见分类网络- LeNet网络结构分析与详解

    作者主页(文火冰糖的硅基工坊):文火冰糖(王文兵)的博客_文火冰糖的硅基工坊_CSDN博客 本文网址:https://blog.csdn.net/HiWangWenBing/article/detai ...

最新文章

  1. mysql 虚表_mysql虚拟表
  2. Asp.net 关于错误提示 类型“XXX1”在未被引用的程序集中定义,必须添加对程序集XXX2的引用...
  3. windows+php+mysql+apache(wamp)安装配置问题
  4. 并发下HashMap头插会造成死循环情况说明
  5. Ubuntu美化方案
  6. 随机抽取题目程序java_分析并实现一个简单的抽人程序
  7. IPLATUI--下拉列表
  8. 如何用JavaScript搭建神经网络?90分钟免费课程,上手可操作丨教程
  9. vista 改xp BIOS设置(ASUS,dell,hp,Acer,Lenovo)
  10. 解决远程桌面关闭后teamviewer不能连接的问题
  11. struts2 中 Actionsupport类的作用
  12. exosip2协议栈原理分析以及总结
  13. Solidworks常见问题一览
  14. 服务评价器连接计算机后无法启动,四键评价器服务端+客户端(附驱动)
  15. Android音视频开发;斗鱼直播实现
  16. python抓取网页表格数据
  17. linux 进程hang,GoldenGate Extract进程hang问题解决一例
  18. 计算机网络实践网线制作,网线怎么制作
  19. Python 下标异常
  20. Windows运行(快捷键Win+R)命令大全 及 快捷键

热门文章

  1. 《机器学习实战》第3章—隐形眼镜类型(Jupyter版决策树)
  2. Python爬虫基本知识:什么是爬虫?
  3. html src href 路径,src跟href,url的区别
  4. 使用python批量修改图片名称为发票号码.jpg
  5. GIS数据转换器无限转换
  6. C#:万能表单+ajax实现网站文章阅读次数限制,若达到限制次数,则需付费购买文章(单篇文章)
  7. DataCamp的intermediate python学习笔记(001)
  8. python 循环遍历0-9,a-z
  9. 1012: 求绝对值(C语言)
  10. 前特斯拉核心技术专家谷俊丽加入小鹏汽车