https://d2l.ai/chapter_linear-networks/linear-regression.html 对该篇文章进行代码实现
1.基本流程
首先需要有一个梯度下降算法 梯度下降算法可以参考https://www.zhihu.com/question/305638940/answer/1639782992
再就是损失函数的实现
那么整套的基本流程就是
- 设计基本模型,再本章中我们要实现预测房价的走向 (完全不准 损失值loss 过大 主要是设计思路)$ \epsilon $是损失值,b是偏差值,两个w为权重
- 读取房龄和面积的基本数据(广州房价数据) 点击下载
- 随机抽取部分样本进行梯度下降,如此往复一定次数,最后得出训练结果
2.提取数据
1 | data = pd.read_csv("data.csv") |
对样本进行随机抽样,每次返回batch_size个真实样本数据1
2
3
4
5
6
7
8
9def data_iter(batch_size, features, labels):
num_examples = len(features)
indices = list(range(num_examples))
# The examples are read at random, in no particular order
random.shuffle(indices)
for i in range(0, num_examples, batch_size):
batch_indices = np.array(
indices[i: min(i + batch_size, num_examples)])
yield features[batch_indices], labels[batch_indices]#已经完成去重操作了,用这种模式
3. 设计基本的函数
损失函数 (loss function)
预估值与实际值的差,式子求导后可以得到实际差值,代码实现如下1
2def squared_loss(y_hat, y):
return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2y_hat是预测值,y是实际房价
梯度下降 (gradient descent)
1
2
3def sgd(params, lr, batch_size):
for param in params:
param[:] = param - lr * param.grad / batch_sizelr是步长,一般都用较小值0.00001这样的
params就是前面公式的w,b线性回归(linear regression)
1
2def linreg(X, w, b):
return np.dot(X, w) + bw是一个矩阵,w=[w_area,w_age]
X是真实数据
他们点乘可得到预测值
4.最后算法
首先让步长等于0.0000000001,这种一般是猜出来的
循环次数为10
样本大小为101
2
3
4
5
6
7
8
9
10
11
12
13
14lr = 0.0000000001
num_epochs = 10
batch_size = 10
for epoch in range(num_epochs):
for X, y in data_iter(batch_size, features, labels):#X,y为抽样结果
with autograd.record():
y_hat = linreg(X, w, b)#得到预测值(初始w,b需设置多组,因为梯度下降法是在局部中找到极值,可能在其它地方也有极值点)
l = squared_loss(y_hat, y) #算出损失
l.backward()#求积分
sgd([w, b], lr, batch_size) #梯度下降
train_l = squared_loss(linreg(features, w, b), labels)
print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')
5.总结
这应该是最简单的模型了,最后运行偏差值过大,应该是因为这个本事影响参数(权重)太少了,只有房龄和面积,所以无法预测,如果用散点图plt去看,也会看到他太过分散。还需要继续去学习,看英语文章太痛苦了,但是也得习惯