监督学习凑字
监督学习
linear regression model 线性回归模型
线性回归模型是一种通过线性方程描述自变量与因变量之间关系的统计分析方法,用于预测或解释变量间的定量依赖关系。
分类: 一元线性回归模型、多元线性回归模型。
训练集:假设呢,我这边就是一个一元的回归模型。(x,y) x表示的是输入的一个特征,y表示预测的一个结果。
y
−
=
f
(
x
)
\overset{-}{y} = f(x)
y−=f(x)
y
−
表示的是预测出来的一个结果值
\overset{-}y \text{表示的是预测出来的一个结果值}
y−表示的是预测出来的一个结果值
f
w
,
b
(
x
)
=
w
x
+
b
f_{w, b}(x) = wx + b
fw,b(x)=wx+b
w表示的是权重,b表示一个偏置。偏置允许神经元学到更灵活的映射关系
避免过拟合的问题。增强模型的一个鲁棒性。
线性回归模型的代价函数
m个测试集
J
w
,
b
=
1
2
m
∑
i
=
1
m
(
y
−
(
i
)
−
y
(
i
)
)
2
J_{w,b} = \frac{1}{2m} \sum_{i=1}^{m} (\overset{-}y^{(i)} - y^{(i)})^2
Jw,b=2m1i=1∑m(y−(i)−y(i))2
y
−
表示的是预测出来的一个结果值
y
表示的是实际的值
\overset{-}y \text{表示的是预测出来的一个结果值}y \text{表示的是实际的值}
y−表示的是预测出来的一个结果值y表示的是实际的值
思考:
为什么是
1
2
m
呢?
\text{为什么是}\frac{1}{2m}\text{呢?}
为什么是2m1呢?
为了在求导的时候方便计算。
为什么要有(代价函数)这个的存在?
后期可以通过梯度下降的方法,更新权重w 和偏置b,进而求得最优解。这个章节会有代码。
梯度下降
梯度下降是一种用于优化算法的迭代方法,广泛应用于机器学习和深度学习中,用于最小化(或最大化)一个目标函数(通常是损失函数或成本函数)。通过逐步调整模型参数,梯度下降能够找到函数的最优解,通常用于寻找神经网络或其他模型中的最优参数。
核心思想:
通过计算目标函数(如损失函数)的梯度,沿着梯度的反方向调整参数,从而逐步减小目标函数的值,直到收敛到一个最小值(或最大值)。
具体来说:
梯度(Gradient):是目标函数相对于参数(如权重、偏置等)的偏导数,表示函数在某一点上变化的最快方向。
下降(Descent):沿着梯度的反方向调整参数,从而使目标函数的值变小。
学习率概念
学习率(Learning Rate,简称 α)是梯度下降算法中的一个重要超参数,它决定了每次更新参数时步长的大小。简单来说,学习率控制着在每次参数更新时,模型如何快速或缓慢地调整其参数。
初始学习率通常设置在
0.01
0.01,
0.001
0.001,
0.0001
0.0001 等
尽量选取不要太大也不要太小的,太大的会导致来回波动,太小最终会得到一个结果,但是呢,收敛太慢了。
一般从0.001 开始。
如何自动选取呢?
Adam 或 RMSprop 优化器。 具体可以自行查看,这边不赘述,后面可能会写。
梯度下降的步骤(附代码)
目的:
min
J
w
,
b
=
1
2
m
∑
i
=
1
m
(
y
−
(
i
)
−
y
(
i
)
)
2
情况下求的w和b?
\min{J_{w,b}} = \frac{1}{2m} \sum_{i=1}^{m} (\overset{-}y^{(i)} - y^{(i)})^2\text{情况下求的w和b?}
minJw,b=2m1i=1∑m(y−(i)−y(i))2情况下求的w和b?
步骤呢?从逻辑上我们应该这么做
step1: 设置初始w、b 为0
step2:改变参数w,b,用以尝试最小化代价的目的。(repeat 的一个阶段,直到 达到我们的目的或者这次更新的w值等于上一次更新的w值的时候,stop)
如何改变w和b呢?
w
=
w
−
α
d
d
w
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
(
y
−
−
y
)
x
注: α是学习率
w= w - α\frac{d}{dw}J_{(w,b)} = \frac{1}{m}\sum_{i=1}^{m}(\overset{-}y - y) x\text{ 注: α是学习率}
w=w−αdwdJ(w,b)=m1i=1∑m(y−−y)x 注: α是学习率
w
=
w
−
α
d
d
b
J
(
w
,
b
)
=
1
m
∑
i
=
1
m
(
y
−
−
y
)
注: α是学习率
w= w - α\frac{d}{db}J_{(w,b)}= \frac{1}{m}\sum_{i=1}^{m}(\overset{-}y - y)\text{ 注: α是学习率}
w=w−αdbdJ(w,b)=m1i=1∑m(y−−y) 注: α是学习率
场景:
我们有一个列表x 和y,x 表示输入值,y表示的是输出值。如何求取w和b?
import numpy as np
#初始化我们的一个学习率
alpha = 0.001
x = np.array([1, 2, 3, 4, 5])
y = np.array([1, 2, 1.3, 3.75, 2.25])
#初始化参数w 和b
w = 0
b = 0
#设置我们的一个训练次数,假设是1000次
iterations = 1000
decay_rate = 0.9 # 学习率衰减
m = len(x)
for _ in range(iterations):
y_pred = w * x + b #表示预测
dw = (1 / m) * np.sum((y_pred - y) * x)
db = (1 / m) * np.sum(y_pred - y)
w = w - alpha * dw
b = b - alpha * db
#alpha = alpha * decay_rate if _ % 100 == 0 else alpha
if _ % 100 == 0:
cost = (1 / 2 * m) * (np.sum(y_pred - y) ** 2)
print(f"interations:{_} cost: {cost} w: {w} b : {b}")
print(f"after {iterations} loop ,get w :{w} b : {b}")
多元的一个线性回归
跟上面比起来的话,多元的定义就是x 是一个矢量,而非一个标量,其中w也是一个矢量
f
w
,
b
=
w
∗
x
+
b
f_{\mathbf{w},b} = \mathbf{w} * \mathbf{x} + b
fw,b=w∗x+b
什么叫矢量呢?
就是x 不是一个简单的数值,而是由很多个种类组成的一组输入,比如房价跟面积大小,房间数量以及地段有关,这几个数据加起来构成x ,也就是一个矢量。
拓展: 如何在python中做快速的矢量化运算
w = np.array([0.8,1.5,2.3])
x = np.array([100,2,3])
我们如何计算w*x 一个一个算吗?
在numpy中有个dot 函数,其可以并行的执行多个,函数原型
res = np.dot(w,x) + b