李宏毅机器学习笔记——新手感悟——PM2.5作业
python也不会,计算机也不会,啥都不会,只带了个脑子考了计算机研究生。研究生选了人工智能方向。看来注定是漫长的学习之旅。
PM2.5作业,我是一个字都看不懂。所以我采用了直接看答案的方案。把答案看懂也是一种本事。
把答案CV上来。
import sys
import pandas as pd
import numpy as np #环境,就不说了。ananconda真的难装。
#提取TEST数据集
data = pd.read_csv('work/hw1_data/train.csv', encoding = 'big5')#读取文件数据
print(data)
data = data.iloc[:, 3:] #iloc是对表格式数据使用的一个函数 loc用的是表格索引,iloc用的是表格行列号,
# 此处取的就是所有行和第三列之后的所有列。作用就是只留数据不留前面的杂项。
data[data == 'NR'] = 0 #将所有数据里的NR全部置换为0.NR肯定无法参与运算,换成0让他不起作用。
print(data)
raw_data = data.to_numpy()#表格转换为numpy矩阵
month_data = {} #创建存放每月数据的数组
for month in range(12):
sample = np.empty([18, 480]) #empty创建一个数组,但是元素不一定为0,可能为随机值。
for day in range(20):
sample[:, day * 24 : (day + 1) * 24] = raw_data[18 * (20 * month + day) : 18 * (20 * month + day + 1), :]
month_data[month] = sample####等于创建了12个二维数组。每个数组是平起来的整个月份每天的数据

###提取特征值,这里作业要求用前九天的数据来预测第十天数据,因此将每九天的数据变为一行,作为特征值。
x = np.empty([12 * 471, 18 * 9], dtype = float) #471是如何来的?这里是每九个小时一个数据,但并不是用过的就不用了。而是第一个数据0到8,第二个数据1到9,这个样子。最后9天因为找不到第十天的数据所以舍去,就是20*24-9=471.
y = np.empty([12 * 471, 1], dtype = float)
for month in range(12):
for day in range(20):
for hour in range(24):
if day == 19 and hour > 14: #舍去每月最后九小时。
continue
x[month * 471 + day * 24 + hour, :] = month_data[month][:,day * 24 + hour : day * 24 + hour + 9].reshape(1, -1) #vector dim:18*9 (9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9)
#reshape(1,-1)可以转换为一行.这里把9列(9个小时)的18维数据融为一行。
y[month * 471 + day * 24 + hour, 0] = month_data[month][9, day * 24 + hour + 9] #value 为啥是9小时后的PM2.5
#因为这里作业要求使用9个小时的PM2.5来预测第十个小时的PM2.5的值,因此数据集进行了这样的划分,Y即为target,记录了每九个小时后第十个小时的PM2.5值
·
print('x',x)
print(y)###
###归一化
mean_x = np.mean(x, axis = 0) #18 * 9
std_x = np.std(x, axis = 0) #18 * 9###计算总体标准偏差。
for i in range(len(x)): #12 * 471
for j in range(len(x[0])): #18 * 9
if std_x[j] != 0:
x[i][j] = (x[i][j] - mean_x[j]) / std_x[j]
##对于所有的数据,如果这一列的标准偏差不为0(实际上好像也不存在为0的,可能每一列都是NR的那个是0?),应该是为了严谨。对于每一个数据都要减去均值后除以标准差,完成归一化。
#这里是中心化和标准化处理,通过处理,得到了均值为0,标准差为1的服从正态分布的数据。可以使一些原来数据大小、量纲不同的数据,对结果的影响趋向一致。
x
import math
x_train_set = x[: math.floor(len(x) * 0.8), :]
y_train_set = y[: math.floor(len(y) * 0.8), :]
x_validation = x[math.floor(len(x) * 0.8): , :]
y_validation = y[math.floor(len(y) * 0.8): , :]
print(x_train_set)
print(y_train_set)
print(x_validation)
print(y_validation)
print(len(x_train_set))
print(len(y_train_set))
print(len(x_validation))
print(len(y_validation))
#好像保留了20%的数据,自己做测试用。虽然说有test数据集,但是自己还是需要自己的test数据集。
##深度学习
dim = 18 * 9 + 1
w = np.zeros([dim, 1])
x = np.concatenate((np.ones([12 * 471, 1]), x), axis = 1).astype(float)###axis=1 表示对应行拼接。
learning_rate = 100
iter_time = 1000
adagrad = np.zeros([dim, 1])
eps = 0.0000000001
for t in range(iter_time):
loss = np.sqrt(np.sum(np.power(np.dot(x, w) - y, 2))/471/12)#rmse
if(t%100==0):
print(str(t) + ":" + str(loss))
gradient = 2 * np.dot(x.transpose(), np.dot(x, w) - y) #dim*1
adagrad += gradient ** 2
w = w - learning_rate * gradient / np.sqrt(adagrad + eps)
np.save('work/weight.npy', w)#保存文件
print(w)
#这一步真的很难。dim加了1,起到的作用是Y=wX+b中b的作用。

loss是最常见的均方根误差函数,除了一个478*12,应该是平均的。这个除不除感觉对结果影响不大的样子。
梯度下降用的是adagrad方法,就是要除以之前所有梯度的均方和。
eps是为了防止分母为0
这个学习速率和初始值如何设置,目前还不是很了解。可能还需要学习后面的课程。
#测试
testdata = pd.read_csv('work/hw1_data/test.csv', header = None, encoding = 'big5') #读文件。
test_data = testdata.iloc[:, 2:] #不要前两列的表项
test_data[test_data == 'NR'] = 0 #NR设为0
test_data = test_data.to_numpy()
test_x = np.empty([240, 18*9], dtype = float) #创建测试矩阵
for i in range(240):
test_x[i, :] = test_data[18 * i: 18* (i + 1), :].reshape(1, -1) #可以仿照训练集看变化
print('1',len(test_x))
print('2',len(test_x[0]))
for i in range(len(test_x)):
for j in range(len(test_x[0])):
if std_x[j] != 0:
test_x[i][j] = (test_x[i][j] - mean_x[j]) / std_x[j]
test_x = np.concatenate((np.ones([240, 1]), test_x), axis = 1).astype(float)#拼接与b相乘的常数项。
test_x
w = np.load('work/weight.npy')
ans_y = np.dot(test_x, w)
print('ans',ans_y)
import csv #将测试集结果写在excal表格中了。
with open('work/submit.csv', mode='w', newline='') as submit_file:
csv_writer = csv.writer(submit_file)
header = ['id', 'value']
print(header)
csv_writer.writerow(header)
for i in range(240):
row = ['id_' + str(i), ans_y[i][0]]
csv_writer.writerow(row)
print(row)
额 ,看懂答案对我来说已经很吃力了,但这确实是一种好的学习方法。碰到一个不认识的函数或者语法就去查,可能比去看PYTHON教学视频来的还要快。
这篇作业应该是最简单的,但是还是花了很久时间才看懂,甚至回去又看了一遍前几集视频。只能说,路还很长,再接再厉!
李宏毅机器学习笔记——新手感悟——PM2.5作业的更多相关文章
- 【ML入门】李宏毅机器学习笔记01-Learning Map
版权声明:小博主水平有限,希望大家多多指导.本文仅代表作者本人观点,转载请联系知乎原作者——BG大龍. 目录 1 什么是机器学习? 2 机器学习的3个步骤 3 李宏毅老师的机器学习课程 4 按“模型的 ...
- 李宏毅机器学习笔记6:Why deep、Semi-supervised
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- 李宏毅机器学习笔记5:CNN卷积神经网络
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- 李宏毅机器学习笔记4:Brief Introduction of Deep Learning、Backpropagation(后向传播算法)
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- 李宏毅机器学习笔记3:Classification、Logistic Regression
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- 李宏毅机器学习笔记2:Gradient Descent(附带详细的原理推导过程)
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- 李宏毅机器学习笔记1:Regression、Error
李宏毅老师的机器学习课程和吴恩达老师的机器学习课程都是都是ML和DL非常好的入门资料,在YouTube.网易云课堂.B站都能观看到相应的课程视频,接下来这一系列的博客我都将记录老师上课的笔记以及自己对 ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第三周编程作业
一. 逻辑回归 1.背景:使用逻辑回归预测学生是否会被大学录取. 2.首先对数据进行可视化,代码如下: pos = find(y==); %找到通过学生的序号向量 neg = find(y==); % ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第三周编程作业(逻辑回归)
一. 逻辑回归 1.背景:使用逻辑回归预测学生是否会被大学录取. 2.首先对数据进行可视化,代码如下: pos = find(y==); %找到通过学生的序号向量 neg = find(y==); % ...
随机推荐
- 《剑指offer》面试题64. 求1+2+…+n
问题描述 求 1+2+...+n ,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 示例 1: 输入: n = 3 输出: 6 示 ...
- 【vps】Centos 7安装python3.8.5
[vps]Centos 7安装python3.8.5 前言 由于服务器的搬迁,从香港搬到了大陆,原来的香港服务器即将到期,所以趁着大陆服务器在备案的时候,将新服务器的配置先配置一下.这篇文章就是分享C ...
- MVC框架---转
浅析MVC模式 摘要:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑.数据.界面 ...
- CMake语法—普通变量与包含、宏(Normal Variable And Include、Macro)
目录 CMake语法-普通变量与包含.宏(Normal Variable And Include.Macro) 1 CMake普通变量与包含.宏示例 1.1 代码目录结构 1.2 根目录CMakeLi ...
- 搭建服务器之www-向外提供视频服务by html5 video标签
搭建好www服务器,主要目的有两个一个是试验下,另一个是想给女朋友个惊喜,给她个带视频的网页,嘿嘿当前测试下相应功能. 1,采用html5的视频功能:bideo标签. 源码如下: <!docty ...
- docker中使用systemctl启动服务
解决 Failed to get D-Bus connection: Operation not permitted https://serverfault.com/questions/824975/ ...
- TCP长连接实践与挑战
点这里立即申请 本文介绍了tcp长连接在实际工程中的实践过程,并总结了tcp连接保活遇到的挑战以及对应的解决方案. 作者:字节跳动终端技术 --- 陈圣坤 概述 众所周知,作为传输层通信协议,TCP是 ...
- nohub命令简单介绍。
/* 来自对 https://www.cnblogs.com/kexianting/p/11628983.html 编辑. 一 什么是 nohub? 1 是 no hang up 的缩写,就是不挂断的 ...
- C++ 子函数参数传递过程
编译环境:Visual Studio 2015 参数传递与汇编语言有很大关系.子函数传递参数主要方式有三种(这三种参数传递方式都可用用于x86汇编语言甚至其它汇编语言): 寄存器方式传递参数 存储器方 ...
- 写程序时try,catch查看报错的行号
try { //////////////// 代码段 //////////////// }catch(Exception ex) { MessageBox.Show(ex.St ...