0%

Easy Linear Regression

https://d2l.ai/chapter_linear-networks/linear-regression.html 对该篇文章进行代码实现

1.基本流程

首先需要有一个梯度下降算法 梯度下降算法可以参考https://www.zhihu.com/question/305638940/answer/1639782992
再就是损失函数的实现

那么整套的基本流程就是

  • 设计基本模型,再本章中我们要实现预测房价的走向 (完全不准 损失值loss 过大 主要是设计思路)$ \epsilon $是损失值,b是偏差值,两个w为权重
  • 读取房龄和面积的基本数据(广州房价数据) 点击下载
  • 随机抽取部分样本进行梯度下降,如此往复一定次数,最后得出训练结果

2.提取数据

1
2
3
4
5
data = pd.read_csv("data.csv")
data = np.array(data)
features = data[:,1:3] #获取房子面积和房子建造日期
features[:,0] = 2022 - features[:,0] #获取房龄
labels = data[:,0] #获取房价

对样本进行随机抽样,每次返回batch_size个真实样本数据

1
2
3
4
5
6
7
8
9
def 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
    2
    def squared_loss(y_hat, y):
    return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2

    y_hat是预测值,y是实际房价

  • 梯度下降 (gradient descent)

    1
    2
    3
    def sgd(params, lr, batch_size):
    for param in params:
    param[:] = param - lr * param.grad / batch_size

    lr是步长,一般都用较小值0.00001这样的
    params就是前面公式的w,b

  • 线性回归(linear regression)

    1
    2
    def linreg(X, w, b):
    return np.dot(X, w) + b

    w是一个矩阵,w=[w_area,w_age]
    X是真实数据
    他们点乘可得到预测值

4.最后算法

首先让步长等于0.0000000001,这种一般是猜出来的
循环次数为10
样本大小为10

1
2
3
4
5
6
7
8
9
10
11
12
13
14
lr = 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去看,也会看到他太过分散。还需要继续去学习,看英语文章太痛苦了,但是也得习惯