李宏毅机器学习-2
用梯度下降手写线性回归(只用numpy 、pandas)
- 用梯度下降方法预测PM2.5的值
李宏毅机器学习中的作业1 ,这里为了简化流程,突出方法,只用了train.csv数据。
简单说一下要干嘛:就是有很多条观测数据,每一条数据包含了24小时的观测数据,通过这些数据,预测未来PM2.5的值。
这里继续简化问题,用前9小时的数据预测第10个小时的值:
import pandas as pd
import numpy as np
train_data = pd.read_csv('train.csv',encoding='utf-8') #utf-8编码
train_data.insert(3, 'b', 1) # 插入一列都为1的数, bias * 1 所有参数统一看成 w
a1 = train_data[train_data['observation']=='PM2.5'].iloc[:-50,3:13] #用来训练参数 w
a2 = train_data[train_data['observation']=='PM2.5'].iloc[-50:,3:13] # 后50行用来算下某参数下的error
a1_x = a1.values[:,:-1] #前9个小时数据
a1_x_array = a_x.astype(np.float)
a1_y = a1.values[:,-1] #第10个小时数据
a1_y_array = a_y.astype(np.float)
a2_x = a2.values[:,:-1]
a2_x_array=a2_x.astype(np.float)
a2_y = a2.values[:,-1]
a2_y_array=a2_y.astype(np.float)
梯度下降实现,直接撸:
# 线性回归 梯度下降
def update_w(dataMatin,label):
dataMatrix = np.mat(dataMatin) # m 样本量 ,n 特征数量 (m , n)
labelMatrix = np.mat(label).transpose() # (m , 1)
m, n = np.shape(dataMatrix)
alpha = 0.0000001 # 学习率
max_cycle = 100000000 #迭代次数
w = np.ones((n,1)) # w 初始值为1
for i in range(max_cycle):
h = dataMatrix*w # (m ,n) × (n ,1) = (m , 1) x*w
err = (labelMatrix - h) #(m ,1)
w = w + alpha * dataMatrix.transpose()*err # (n,m)×(m,1) = (n , 1)
return w
# 平方差的和 作为 error
def Error(y_label, y_fitting):
return np.sum(np.square(y_label,y_fitting))
# 测试集数据代入 训练好参数w的线性函数中的误差
def model_error(dataMatIn, label, w):
dataMatrix = np.mat(dataMatIn)
labelMatrix = np.mat(label).transpose()
h = (dataMatrix*w)
error = Error(labelMatrix, h) #(m , 1)
return error
最后,可调整 alpha 值和最大迭代次数优化梯度下降。