深度学习04-梯度下降、多元回归

今天实现了梯度下降算法与sklearn 实现的多元线性回归。首先说说梯度下降算法。

梯度下降

梯度是对于可微的数量场 f(x, y, z),以 \((\frac{\partial f}{\partial x} ,\frac{\partial f}{\partial y} ,\frac{\partial f}{\partial z} )\) 为分量的向量场,又称为f 的梯度或斜量。

在假设了一种函数模型:$f = w*x $ 并使用损失函数:\(loss=\frac{1}{n}\sum{\left(y^\prime-y\right)^2=}\sum\left(wx-y\right)^2\) 之后,我们需要使用梯度下降来优化我们的模型,但需要注意的是,在这里我们需要优化的是哪个变量?

是w,因为x 与 y 是在数据集中给出了,是已知量,剩下的w 才是未知量,才是我们需要的,那么我们就需要求出loss 对w 的(偏)导数(由于这里只有一个未知数,所以是导数)。

那么loss 对w 求导:\(\frac{dloss}{dw}=\frac{1}{n}\sum2(wx-y)*x\) 所得对结果就是这里所说对梯度,设为g,得到梯度之后更新w 即可完成对w 的优化:$w=w-a*g $

重复这个求导-更新的过程即为梯度下降算法。

具体对代码如下:

import pandas as pd

# 从文件读取数据
df = pd.read_csv(filepath_or_buffer='archive/train.csv')


def forward(x):
    return w * x


def loss(x, y):
    y_pred = forward(x)
    return (y_pred - y) ** 2


def gradient(x, y):
    grad = 2 * (x * w - y) * x
    return grad


# 训练
w = 0.3
grad_val = 0
for epoch in range(100):
    for x, y in zip(df['x'], df['y']):
        grad_val = gradient(x, y)
        w -= 0.01 * grad_val / len(df)
print('w = ', w)

# 测试
df = pd.read_csv(filepath_or_buffer='archive/test.csv')
loss_val = 0
for x, y in zip(df['x'], df['y']):
    loss_val += loss(x, y) / len(df)
print('test loss = ', loss_val)

输出:

w = 1.0006914456963327
test loss = 9.369400275863603

sklearn 实现多元回归

话不多说,直接上代码,这次使用的也是kaggle 上的数据集,不过只提供了一个文件,所以我懒得去拆分为两个数据集,只需要知道如何实现就行了。
附上kaggle 的链接:https://www.kaggle.com/quantbruce/real-estate-price-prediction

代码如下:

import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

# 从文件读取数据
df = pd.read_csv(filepath_or_buffer='Real estate.csv')

x_data = df.iloc[:, 1:7]
y_data = df.iloc[:, 7:]

# LinearRegression 使用普通最小二乘法做线性回归
# 1、实例化对象
lin_reg = LinearRegression()
# 2、拟合模型
model = lin_reg.fit(x_data, y_data)
# 3、预测y_hat 值
y_hat = model.predict(x_data)
# 4、计算模型质量
quality = r2_score(y_data, y_hat)
print("训练集可决系数 = ", quality)

# 输出w和b
w = model.coef_[0]
b = model.intercept_  # 得到bias值
print(len(w))  # 输出参数数目
print([round(i, 5) for i in w])  # 输出w列表,保留5位小数
print(b)  # 输出bias

输出:

训练集可决系数 = 0.582370447272307
6
[5.14623, -0.2697, -0.00449, 1.13328, 225.47298, -12.4236]
[-14437.10080228]

最后总结一下这几天:
1、懒惰,大多数时间都消耗在娱乐与消遣上,三天打鱼两天晒网,虽然知道这不好但是却不知道要怎么改掉这毛病,尝试了许多办法但是见效甚微。
2、少部分时间学习了Markdown 和Latex ,正如这篇博客一样,不过这里不能像其他笔记一样使用Latex,而是需要使用$ 将公式括起来。
3、接下来的计划是pytorch 与神经网络的学习,加油吧!

posted @ 2021-05-06 19:44  RabbitKeeper  阅读(215)  评论(0编辑  收藏  举报