今天实现了梯度下降算法与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 是在数据集中给出了,那么我们就需要求出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)
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
最后总结一下这几天:
1、懒惰,大多数时间都消耗在娱乐与消遣上,三天打鱼两天晒网,虽然知道这不好但是却不知道要怎么改掉这毛病,尝试了许多办法但是见效甚微。
2、少部分时间学习了Markdown 和Latex ,正如这篇博客一样,不过这里不能像其他笔记一样使用Latex,太奇怪了。接下来的计划是pytorch 与神经网络的学习,加油吧!