当前位置: 首页 > 编程日记 > 正文

线性回归预测PM2.5值

文章目录

  • 一、问题描述
  • 二、设计简要描述
  • 三、程序清单
  • 四、结果分析
  • 五、调试报告
  • 六、实验总结

一、问题描述

希望用线性回归解决问题:
给定某个地区连续9小时包括PM2.5在内的18项污染物每小时的数据,预测第10个小时的PM2.5的值。

二、设计简要描述

机器学习的三个基本步骤——
在这里插入图片描述
程序设计思路——
在这里插入图片描述

三、程序清单

import pandas as pd
import numpy as np# 1 训练集处理
# 1.1 读取训练集数据,big5是针对于文档中存在繁体字的编码
train_data = pd.read_csv('./train.csv', usecols=range(2, 27), encoding='big5')  # 2~27,从测项到最后一小时数据
row = train_data['測項'].unique()  # 得到的row是一个list,存放了各个污染物的名字# 1.2训练数据规整化
# 定义18维空列表,每一个维度处理一种污染物
# DataFrame是一个二维表格,让它有18行,24*240列(240=12个月x每个月前20天)
new_train_data = pd.DataFrame(np.zeros([18, 24 * 240]))
# 计算维度?
n = 0
# 遍历18类污染物,将数据处理为 [18, 24*240]
for i in row:# 依照污染物名取出相同的行train_data1 = train_data[train_data['測項'] == i]  # 得到的train_data1是一个二维表格,每一行是一天24小时某项污染物的值,共240天# 删去多出的“测项”那一列(存放污染物的名字)train_data1.drop(['測項'], axis=1, inplace=True)# 格式处理,赋值到 new_train_datatrain_data1 = np.array(train_data1)  # 刚刚的二维表格依然是二维表格,只不过可以处理了train_data1[train_data1 == 'NR'] = '0'  # 将降雨量NR替换为0train_data1 = train_data1.astype('float')# 24*240=5760# 二维列表原先包含240个含24个元素的一维列表,现在包含5760个含1个元素的一维列表train_data1 = train_data1.reshape(5760, 1)# 进行转置,二维列表现在包含1个含5760个元素的一维列表train_data1 = train_data1.T# 将刚刚在一起的5760个相同污染物的量存放进预先设定好的DataFrame的一行new_train_data.loc[n] = train_data1# 下一类污染物处理n += 1# 可以将现在的new_train_data和train_array看成是包含18个含5760个元素的二维表格
train_array = np.array(new_train_data).astype(float)# 1.3 处理训练集
# 训练样本features集合
X_train = []
# 训练样本目标PM2.5集合
y_train = []
for i in range(new_train_data.shape[1] - 9):# 每次取9个小时的数据作训练集# 每次数据遍历每行前9个数据,全部加入到训练集中,18 X 9X_temp = np.ones(18 * 9)# 记录count = 0  # count的取值是0~161(18*9=162)for j in range(18):x = train_array[j, i:i + 9]for k in range(9):X_temp[count] = x[k]count += 1# 将样本分别存入X_train中X_train.append(X_temp)# 取本次第10个小时的 PM2.5 的值作为训练的真实值y = int(train_array[9, i + 9])  # 第一个9是PM2.5,第二个+9是找到第十个小时# 将样本分别存入X_train、y_train中y_train.append(y)
X_train = np.array(X_train)  # X_train里面是由5751个含有172个元素的一维列表组成的二维列表
y_train = np.array(y_train)  # X_train里面是由5751个含有1个元素的一维列表组成的二维列表# 2.训练模型
# 训练轮数
epoch = 1000(第一次)
epoch = 2000(第二次)
# 开始训练
# 更新参数,训练模型
# 偏置值初始化
bias = 0
# 权重初始化
weights = np.ones(18 * 9)
# 初始学习率
learning_rate = 1
# 用于存放偏置值的梯度平方和
bg2_sum = 0
# 用于存放权重的梯度平方和
wg2_sum = np.zeros(18 * 9)for i in range(epoch):b_g = 0w_g = np.zeros(18 * 9)# 在所有数据上计算Loss_label的梯度for j in range(len(X_train)):# weights.dot(X_train[j])是172个权重和对应的输入x相乘(dot的本意是点乘)b_g += (y_train[j] - weights.dot(X_train[j]) - bias) * (-1)for k in range(18 * 9):w_g[k] += (y_train[j] - weights.dot(X_train[j]) - bias) * (-X_train[j, k])# 求平均b_g /= len(X_train)  # 这个数字是5751w_g /= len(X_train)# adagradbg2_sum += b_g ** 2wg2_sum += w_g ** 2# 更新权重和偏置bias -= learning_rate / bg2_sum ** 0.5 * b_gweights -= learning_rate / wg2_sum ** 0.5 * w_g# 每训练10轮,输出一次在训练集上的损失if i % 10 == 0:loss = 0for j in range(len(X_train)):loss += (y_train[j] - weights.dot(X_train[j]) - bias) ** 2print('经过{}轮训练,训练集上的损失值为:'.format(i), loss / len(X_train))# 测试机处理
# 3.1读取测试数据
test_data = pd.read_csv('./train2.csv', usecols=range(2, 27), encoding='big5')  # 用train的最后三个月作为test 3242-4321
row2 = test_data['測項'].unique()
# 3.2 测试数据规整化
new_test_data = pd.DataFrame(np.zeros([18, 24 * 60]))
# 计算维度
m = 0
# 遍历18类污染物,将数据处理为[18,24*60]
for i in row2:# 依照污染物名字取出相同的行test_data1 = test_data[test_data['測項'] == i]# 删去多出的“测项”那一列test_data1.drop(["測項"], axis=1, inplace=True)# 格式处理,赋值到new_train_datatest_data1 = np.array(test_data1)test_data1[test_data1 == "NR"] = "0"test_data1 = test_data1.astype("float")# 24*60=1440# 二维列表原先包含60个含24个元素的一维列表,现在包含1440个含1个元素的二维列表test_data1 = test_data1.reshape(1440, 1)# 转置test_data1 = test_data1.T# 将刚刚在一起的1440个相同污染物的量存放进预先设定好的new_test_data的一行new_test_data.loc[m] = test_data1# 下一类污染物处理m += 1
# 现在可以将new_test_data和test_array看成史包含18个含有1440个元素的二维表格
test_array = np.array(new_test_data).astype(float)
# 3.3 处理测试集
# 测试样本features集合
X_test = []  # 二维列表
# 测试样本PM2.5集合
y_test = []  # 一维列表
for i in range(new_test_data.shape[1] - 9):# 每次取9个小时的数据做测试集的输入# 每次数据遍历每行前9个数据,全部加入到测试集中,18x9X_temp = np.ones(18 * 9)# 记录count = 0for j in range(18):x = test_array[j, i:i + 9]for k in range(9):X_temp[count] = x[k]count += 1# 将样本分别存入X_test中X_test.append(X_temp)# 取本次第十个小时的PM2.5值作为测试的真实值y = int(test_array[9, i + 9])# 将样本存入y_test中y_test.append(y)
X_test = np.array(X_test)
y_test = np.array(y_test)# 4.测试训练好的模型
loss = 0
for i in range(len(X_test)):loss += (y_test[i] - weights.dot(X_test[i]) - bias) ** 2
print('测试集上的损失值为:', loss / len(X_test))

四、结果分析

  1. 训练轮数为1000时,在测试集上的损失函数结果为7.208519807515013
    在这里插入图片描述
  2. 训练轮数为2000时,在测试集上的损失函数结果为测试集上的损失值为: 6.622474294012304
    在这里插入图片描述
    分析 :从训练集和测试集上的损失值相近可知过程无误,但结果不是特别理想,可能原因有:处理训练集时把每一天的数据连在一起,增大了利用率,但未考虑到train.csv的数据是截取的每个月前20天的,也就是连接的过程把上个月的第二十天跟下个月第一天连在一起了,这是不合理的。
    weights是一个18*9=162维的向量,参数太多,可能过拟合了。

五、调试报告

  1. 数据集的编码方式一定要注意,如果pycharm一开始显示不出数据集编码方式,可以先用notepad++打开数据集,查看其编码方式。
  2. 阅读实验指导书上的代码时难以理解,可以通过确定数字的最大值来解决,例如这一段
count = 0  
for j in range(18):
x = train_array[j, i:i + 9]for k in range(9):X_temp[count] = x[k]count += 1

起初无法理解X_temp是什么形状,但看到count经过两轮循环,数值变化范围是0~18*9。可知X_temp是把18项数据在9个小时里的连续值进行了首尾拼接,便于后续与权重72维向量相乘。
3. 打桩调试
训练轮数太多,想确定程序执行到哪一步了,可以对在一些数值处进行输出。例如

# 每训练10轮,输出一次在训练集上的损失
if i % 10 == 0:loss = 0for j in range(len(X_train)):loss += (y_train[j] - weights.dot(X_train[j]) - bias) ** 2
print('经过{}轮训练,训练集上的损失值为:'.format(i), loss / len(X_train))

六、实验总结

  1. 学到了一些数据处理知识
    ① .astype(‘float’)将数据转化为浮点型
    ② 对数据进行转置 train_data1 = train_data1.T
    ③ 根据列名得到表格中的某一项数据
    row = train_data[‘測項’].unique()
    ④ 删除某一列数据train_data1.drop([‘測項’], axis=1, inplace=True)
  2. 需要改进的地方
    ① 对测试集和验证集(后三个月)的处理出现大量的重复代码,应该编写函数,但是对于Python掌握还不够,遂放弃
    ② 把每天的数据连在一起增加了数据的利用率,但是每个月的应该分开
    ③ 采用前9个小时18项数据,权重作为一个72维的向量,参数过多,增加了训练成本,并且容易过拟合

相关文章:

Sharding-eth

原文:https://github.com/ethereum/wiki/wiki/Sharding-FAQ 作者:vbuterin 简介 目前,在所有的区块链协议中每个节点存储所有的状态(账户余额,合约代码和存储等等)并且处理所有的交易。这提供了大量的安全性…

用CSS3制作很特别的波浪形菜单

用CSS3制作很特别的波浪形菜单 原文:用CSS3制作很特别的波浪形菜单网页菜单我们见过很多,各种炫酷的、实用的菜单比比皆是。昨天我看到一款很特别的CSS3菜单,它的外形是波浪形的,弯弯曲曲,结合背景,看上去还挺不错的&a…

二分类任务:确定一个人是否年收入超过5万美元

文章目录一、 问题描述二、 设计简要描述三、 程序清单四、 结果分析五、 调试报告六、 实验总结一、 问题描述 学会使用学习到的概率生成模型相关的知识,找出各类别最佳的高斯分布,从而达到通过输入测试,完成二分类任务,成功预测…

Android Splash界面支持用户点击 直接进入主界面

转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/23613403 现在大部分APP都有Splash界面,下面列一下Splash页面的几个作用: 1、展示logo,提高公司形象 2、初始化数据 (拷贝数据到SD) 3、提高用户体验 4、连接服务器是否有…

Python爬一下抖音上小姐姐的视频~

image.png在简书也码了1W多字了,发现还是爬虫类的文章看的人多。 算法工程师现在都啥价位了,你们还在看爬虫→_→ 介绍 这次爬的是当下大火的APP--抖音,批量下载一个用户发布的所有视频。 各位也应该知道,抖音只有移动端&#xff…

哈哈,我的博客开通啦,欢迎光临~~~~~~~~~~~~

毕业快一年了,参加工作一年多了,几多苦闷,几多快乐。用某某人的话说就是“痛苦并快乐着!”。工作了,才发现现实和理想真的有差距啊!但我将直面“惨淡”的程序人生。希望与同龄人,不同龄人共勉。…

逻辑回归:确定一个人是否年收入超过5万美元

文章目录1. 问题描述2. 设计简要描述3. 程序清单4. 结果分析5. 调试报告6. 实验小结1. 问题描述 学会使用学习到的逻辑回归的知识,手动使用梯度下降方法,通过给定的相关数据来完成年薪是否高于50k的二分类预测任务。 2. 设计简要描述 机器学习的三个基…

【特征匹配】ORB原理与源码解析

相关 : Fast原理与源码解析 Brief描述子原理与源码解析 Harris原理与源码解析 http://blog.csdn.net/luoshixian099/article/details/48523267 ORB特征提取详解 ORB特征点检测 为了满足实时性的要求,前面文章中介绍过快速提取特征点算法Fast,以及特征描述子Brief。…

C# 的三种序列化方法

序列化是将一个对象转换成字节流以达到将其长期保存在内存、数据库或文件中的处理过程。它的主要目的是保存对象的状态以便以后需要的时候使用。与其相反的过程叫做反序列化。 序列化一个对象 为了序列化一个对象,我们需要一个被序列化的对象,一个容纳被…

DotNetNuke(DNN)网站发布、部署、迁移和重建

DotNetNuke(DNN)网站本质上是一个ASP.NET网站,由网站文件(也就是website目录)和数据库组成的,所以,“发布、部署、迁移和重建”实际上也就是把网站文件和数据库文件拷贝到服务器上并修改相应设置的过程。对于"发布…

PyTorch基础与简单应用:构建卷积神经网络实现MNIST手写数字分类

文章目录(一) 问题描述(二) 设计简要描述(三) 程序清单(四) 结果分析(五) 调试报告(六) 实验小结(七) 参考资料(一) 问题描述 构建卷积神经网络实现MNIST手写数字分类。 (二) 设计简要描述 机器学习的三个基本步骤—— 程序设计思路——(此图放大可看清) (三) 程序清单 …

from selenium.webdriver.support.ui import Select

from selenium.webdriver.support.ui import SelectSelect(d.find_element_by_id(ukey_开户行)).first_selected_option.text转载于:https://www.cnblogs.com/paisen/p/3669272.html

rocketmq-flink

https://github.com/apache/rocketmq-externals/tree/master/rocketmq-flink https://issues.apache.org/jira/browse/ROCKETMQ-82

基于Numpy构建全连接前馈神经网络进行手写数字识别

文章目录(一) 问题描述(二) 设计简要描述(三) 程序清单(四) 结果分析(五) 调试报告(六) 实验小结(一) 问题描述 不使用任何机器学习框架,仅仅通过Numpy库构建一个最简单的全连接前馈神经网络,并用该网络识别mnist提供的手写数字体。 (二) 设计简要描述…

sqlserver 三种恢复模式

sql server数据库提供了三种恢复模式:完整,简单和大容量日志,这些模式决定了sql server如何使用事务日志,如何选择它要记录的操作,以及是否截断日志。截断事务日志是删除己执行事务并把该日志空间让给新事务的过程&…

Confluence 6 配置日志

我们推荐你根据你的需求来配置你自己的 Confluence 日志。你可以有下面 2 种方法来修改你的日志:通过 Confluence 管理员控制台进行配置 – 你的修改仅在本次修改有效,下次重启后将会把所有修改重置。编辑属性文件 – 你的修改将会在下次重启后生效同时针…

最近最近在微软的Mobile Soft factory

最近公司在做PDA项目的开发, 我主要负责Mobile的框架设计和开发。以前都是在做winform程序,对Mobile 的开发 知之甚少,现在突然开始做mobile的项目,压力有点大! 不知该从何处下手,幸好发现微软提供的Mobile…

神经网络训练技巧

文章目录一、问题描述二、 设计简要描述三、程序清单四、结果分析五、调试报告六、实验小结一、问题描述 基于二元函数f(x,y)z1/20 x2y2掌握梯度下降和权重初始化的技巧,基于手写体识别掌握正规化和两种防止过拟合的技巧。 二、 设计简要描述 梯度下降方法 1.1.1 …

Unix的轻巧“约取而实得”(上篇)

在经过上机操作实践以及掌握Unix系统相关的基础知识之后,可以说已跨进了迈向成功的门槛。接着要登堂入室,继续专进,就必须更加深入的了解Unix基本命令的功能、使用并掌握一些必备的技巧。这一轮学习会有一定难度,需要强烈的求知欲…

操作系统2--操作系统结构

操作系统结构 操作系统的结构需要从这几个方面来考虑:他为用户提供了哪些服务和界面,系统各个组成部分及其相互关系 操作系统的操作 大致可分为:进程管理,主存管理,文件管理,辅存管理和IO管理 进程管理 进程的创建和结束进程的挂起和恢复进程锁\进程交互\进程死锁的规则内存管理…

Windows环境下启动Mysql服务提示“1067 进程意外终止”的解决方案

2019独角兽企业重金招聘Python工程师标准>>> 在Windows服务里启动Mysql服务时提示“1067 进程意外终止”。 此时我们打开计算机管理查看Windows日志,如下图所示: 完整错误提示如下: The server option lower_case_table_names is …

不使用任何框架实现CNN网络

文章目录一、 问题描述二、 设计简要描述三、程序清单四、结果分析五、调试报告六、实验小结一、 问题描述 基于Numpy和函数im2col与col2im来实现一个简单的卷积神经网络,将其用于手写体识别。 二、 设计简要描述 机器学习的三个基本步骤—— 程序设计思路——(…

关于刘冬大侠Spring.NET系列学习笔记3的一点勘正

诚如他第22楼“只因渴求等待”提出的疑问一样,他的下面那一段代码是存在一点点问题的, XElement root XElement.Load(fileName);var objects from obj in root.Elements("object") select obj; 如果照搬照抄刘冬大侠的这段代码那是不会成功读…

什么叫做KDJ指标

什么叫做KDJ指标 KDJ指标的中文名称是随机指数,最早起源于期货市场。 KDJ指标的应用法则KDJ指标是三条曲线,在应用时主要从五个方面进行考虑:KD的取值的绝对数字;KD曲线的形态;KD指标的交叉;KD指标的背离&a…

vim常用命令总结 (转)

在命令状态下对当前行用 (连按两次), 或对多行用n(n是自然数)表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n排版,相当于一般IDE里的code format。使用ggG可对整篇代码进行排版。 vim 选择文本&…

敏捷过程、极限编程和SCRUM的关系

极限编程是最知名的敏捷开发过程,SCRUM是最经典的极限编程。 层次关系从大到小是:敏捷过程>极限编程>SCRUM

C#双面打印解决方法(打印word\excel\图片)

最近需要按顺序打印word、excel、图片,其中有的需要单面打印,有的双面。网上查了很多方法。主要集中在几个方式解决 1、word的print和excel的printout里设置单双面 2、printdocument里的printsettings的duplex设置单双面 试过之后效果都不好,…

【leetcode】589. N-ary Tree Preorder Traversal

题目如下: 解题思路:凑数题1,话说我这个也是凑数博? 代码如下: class Solution(object):def preorder(self, root):""":type root: Node:rtype: List[int]"""if root None:return []re…

MSDN Visual系列:创建Feature扩展SharePoint列表项或文档的操作菜单项

原文:http://msdn2.microsoft.com/en-us/library/bb418731.aspx在SharePoint中我们可以通过创建一个包含CustomAction元素定义的Feature来为列表项或文档添加一个自定义操作菜单项(Entry Control Block Item)。我们可以添加自定义命令到默认的SharePoint用户界面中。…

评审过程中,A小组发现了5个缺陷,B小组发现了9个缺陷,他们发现的缺陷中有3个是相同的。请问:还有多少个潜在的缺陷没有发现?

分析:这一个“捉-放-捉”问题 背景: 求解: 可以将A看成是第一次捕捉,发现了5个缺陷,全部打上标记 B看成是第二次捕捉,发现了9个缺陷,其中有3个有标记 那么可以算出系统中一共存在的缺陷数量为…