梳理步骤
1、获取数据集
2、选用线性回归模型
f
(
x
)
=
w
x
+
b
f(x)=wx+b
f(x)=wx+b
3、损失函数
‘
l
o
s
s
=
(
f
(
x
)
−
y
)
2
=
(
w
x
−
y
)
2
‘
`loss=(f(x)-y)^2=(wx-y)^2`
‘loss=(f(x)−y)2=(wx−y)2‘
4、梯度下降求导更新参数
5、设置训练轮次
6、更新完参数的模型预测
开始
创建文件夹右键打开方式用pychorm打开,并且使用之前配置好的环境
现场配置下环境
打开anaconda prompt
keras环境
conda create -n keras python==3.8
输入y同意
看看是否创建了环境
(base) C:\Users\RD70>conda env list
# conda environments:
#
base * D:\anaconda
keras D:\anaconda\envs\keras
进入该环境
(base) C:\Users\RD70>activate keras
(keras) C:\Users\RD70>
安装tensorflow
这里用了阿里云的源
pip install tensorflow==2.4.0 -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
安装keras
pip install keras==2.4.3 -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
安装接下来的东西,同上
numpy=1.19.5
pandas=1.3.5
matplotlib=3.4.2
sklearn=0.0
再验证下是否安装好了
conda list
pychorm里加载该环境
等待它加载完
代码解析
# 定义数据集
# 定义数据集特征
x_data = [1,2,3]
# 定义数据集标签
y_data = [2,4,6]
# 初始化参数w
w = 1
# 定义线性回归模型
def forword(x):
return x*w
# 定义损失函数
# 两个传参
def cost(xs,ys):
costvalue = 0
# for循环依次去取每组数据特征和它对应的标签,这里的zip函数是将每个x与之对应的y打包为成一个个元组,zip(xs, ys) 会将这两个列表中的元素一一对应起来
for x,y in zip(xs,ys):
y_pred = forword(x)
costvalue +=(y_pred-y)**2
#print("costvalue=",costvalue,"y_pred=",y_pred,"x=",x,"y=",y,"w=",w)
## 返回损失平均值,len函数是获取xs列表的数据长度
return costvalue /len(xs)
# 定义梯度计算公式
def gradient(xs,ys):
grad = 0
for x, y in zip(xs, ys):
# 求损失函数loss=(f(x)-y)^2=(wx-y)^2关于参数w的导数,并且将它用于梯度下降
grad += 2 * x * (w * x - y)
#print("grad",grad)
return grad / len(xs)
for epoch in range(10):
# 计算误差损失
cost_val = cost(x_data,y_data)
grad_val = gradient(x_data,y_data)
# 这里学习率也很重要,太低了会导致一百轮跑不到损失最小
w = w - 0.01 * grad_val
#print("训练轮次",epoch,"w=",w,"loss",cost_val)
# 调用训练好的模型去推理y
print("100轮后w已经训练好了,此时我们用训练好的w进行推理,学习时间为4个小时的时候最终的得分为:", forword(4))
好,那代码流程是这样的,首先给了一个初w的值(这个w的值不一定能代表最好的匹配当前的数据集的参数),然后把数据集放进去,发现这个参数w放进去会有较大的代价损失,所以我们定义一个损失函数cost,也就是当前线性模型代入数据集特征后预测的标签与真实标签做差的平方,再将损失函数梯度下降来调整w,再把调整后的w放到模型函数代入数据集,计算损失函数
换句话说,通过梯度下降的方式,得到不断调整到代价函数无限趋近于0时的模型参数w