这里继续简化问题,用前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 值和最大迭代次数优化梯度下降。
