1. 模型构建
1.1 读入数据
import numpy as np
data = np.fromfile(datafile, sep=' ')
datafile为数据所在的地址,sep为数据的分隔符号,用这条语句可以方便地将数据以一维数组的方式取出。
1.2 数据格式转换
data = data.reshape(row_num, column_num) # row_num为行数,column_num为列数
在波士顿房价预测模型中,每一个样本有13个特征,1个目标值,即每一个样本都有14个值,所以很快可以确定列数为14,行数就是 data中数据总数/14。
1.3 数据集划分
offset = int(data.shape[0] * ratio)
training_data = data[:offset]
ratio就是我们需要划分的比例,data.shape[0]
就是样本的总数。
1.4 归一化处理
for i in range(feature_num):
data[:, i] = (data[:, i] - avgs[i]) / (maximums[i] - minimums[i])
将数据放缩到0~1之间,起到统一量纲的作用。
1.5 构建模型
np.random.seed(0)
# seed( ) 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed( )值,则每次生成的随即数都相同,如果不设置这个值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
numpy.random.rand(d0,d1,…,dn)
# rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1
# dn表格每个维度
# 返回值为指定维度的array
np.dot(x, y)
# 将x与y矩阵中的元素做点乘
np.mean(x, axis= )
# 对矩阵x中的元素求平均,返回一个实数
# axis表示对矩阵x的哪一维求平均。
2. 模型训练
2.1 使用Numpy进行梯度计算
def gradient(self, x, y):
z = self.forward(x)
gradient_w = (z-y)*x
gradient_w = np.mean(gradient_w, axis=0)
gradient_w = gradient_w[:, np.newaxis]
gradient_b = (z - y)
gradient_b = np.mean(gradient_b)
return gradient_w, gradient_b
2.2 梯度更新
def update(self, gradient_w, gradient_b, eta = 0.01):
self.w = self.w - eta * gradient_w
self.b = self.b - eta * gradient_b
2.3 训练过程封装
def train(self, x, y, iterations=1000, eta=0.01):
losses = []
for i in range(iterations):
z = self.forward(x) # 前向计算
L = self.loss(z, y) # 损失函数
gradient_w, gradient_b = self.gradient(x, y) # 计算梯度
self.update(gradient_w, gradient_b, eta) # 更新梯度
losses.append(L)
if (i+1) % 10 == 0:
print('iter {}, loss {}'.format(i, L))
return losses
2.4 随机梯度下降法SGD
核心概念:
- mini-batch:每次迭代时抽取出来的一批数据被称为一个mini-batch。
- batch_size:一个mini-batch所包含的样本数目称为batch_size。
- epoch:当程序迭代的时候,按mini-batch逐渐抽取出样本,当把整个数据集都遍历到了的时候,则完成了一轮训练,也叫一个epoch。启动训练时,可以将训练的轮数num_epochs和batch_size作为参数传入。