李宏毅机器学习hw1预测PM2.5代码实现

在这里插入图片描述`#author by lixinyue
#分析数据:训练数据,给了12个月的数据,每个月记录前20天,每一天记录18种物质24个整点时的值;
#总共预测240笔数据,给出了18种物质某9个小时的值,求第10个小时的PM2.5
#model,根据预测要求,根据前9小时求第10小时的PM2.5,特征确定为某9个小时的18中物质的含量,共162维;从训练集、测试集中构造训练特征矩阵、测试特征矩阵
#构造权值向量(w和b拼接为w,样本多加一维的常数1),将w初始化为0

import csv;

#以物质为划分,形成18物质不同月日时的含量的list
def get_data(filename):
data=[]
for i in range(18):
data.append([])
rcount=0
with open(filename,‘r’,encoding=‘big5’) as file:
rows=csv.reader(file)
for r in rows:
if rcount!=0:
for i in range(3,27):
if r[i]==‘NR’:
data[(rcount-1)%18].append(float(0))
else:
data[(rcount-1)%18].append(float(r[i]))#老是在这里出错,list的索引值从0开始,但有效行数索引是1开始
rcount=rcount+1
return data

data=get_data(“E:\dome_set\ML\course_Li\homework1\train.csv” )

#分析数据,取18种物质的10个小时对应组合,以月为单位,一个月的数据是连续的,2024=480笔数据,但是最后一天从14点起就不足9个小时了,因此是471笔数据
import numpy as np;
def parse_data(data):
x =[]
y =[]
for i in range(12):
for j in range(471):
x.append([])
for k in range(18):
for t in range(9):
x[i
471+j].append(data[k][t+i480+j])
y.append(data[9][i
480+j])#有监督学习,一定是有label的,总是忘记构造label。。。
x=np.array(x)
y=np.array(y)
#为了表示wx+b,在训练样本中加入1,把b归入到w中
x=np.concatenate((np.ones((x.shape[0],1)),x),axis=1)
#print(x)
print(x.shape)
return x,y
x,y=parse_data(data)
w=np.zeros(x.shape[1],)
print(w.shape)

#定义损失函数,使用GD来找最优的参数模型
import math
def train(x,y,w,iteration,learing_rate):
x_t=np.transpose(x)
sum_grad=np.zeros(x.shape[1])
for i in range(iteration):
hopy=np.dot(x,w) #训练集中样本预测值
loss=hopy-y
cost_value=math.sqrt(np.sum(loss2)/len(x))
print(‘迭代次数%d,损失值 %f’%(i,cost_value))
grad=np.dot(x_t,loss)#所有样本
sum_grad+=grad
2#ada 对每个参数来说,根号内只用每次梯度更新时的这个参数对损失函数计算的梯度,
ada=np.sqrt(sum_grad)
w=w-learing_rate*grad/ada
#print(w)
return w

w=train(x,y,w,5000,10)
#测试数据直接将18种物质连接起来即可,注意把修改字符形式转化为整数类型
def parse_test(filename):
data=[]
rcount=0
with open(filename,‘r’,encoding=‘big5’) as file:
rows=csv.reader(file)
for r in rows:
if rcount%18==0:
data.append([])
for i in range(2,11):
data[rcount//18].append(float(r[i]))
else:
for i in range(2,11):
if r[i]
‘NR’:
data[rcount//18].append(float(0))
else:
data[rcount//18].append(float(r[i]))
rcount+=1
#print(data)
data=np.array(data)
data=np.concatenate((np.ones((data.shape[0],1)),data),axis=1)
return data

test_data=parse_test(“E:\dome_set\ML\course_Li\homework1\test.csv” )

def predict(test_data,w):
hypo=np.dot(test_data,w)#np中的常见错误:*和dot含义没有分清,*是矩阵中对应的元素做乘法,dot是矩阵乘法运算
print(hypo)
predict(test_data,w)

`

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_37937932/article/details/86545301