Tensorflow2.x框架-线性回归

                                                              线性回归

博主微信公众号(左)、Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步!

一、连续值预测

    f_{\theta }: x \rightarrow y

    x: input \ data 

    f(x): prediction

    y: real \ data, ground-truth 

二、线线方程

    二元一次方程: y = w*x + b

    对于方程组\begin{Bmatrix} 1.567=w*1 + b\\ 3.043=w*2+b \end{Bmatrix}求解过程:

        w*2 + b -(w*1 + b) = 3.043 - 1.567 \\ \Rightarrow w = 1.476 \\ \Rightarrow 1.476*1+b = 1.567\\\Rightarrow b=0.091

    闭式解(closed form solution):也叫解析解(analytical solution),就是一些严格的公式,给出任意的自变量就可以求出其因变量,也就是问题的解,他人可以利用这些公式计算各自的问题。

三、噪声

        在现实生活中很难精确对 w 和 b 进行求解,因为:1、模型本身我们是未知的,所采集到的数据会有一定的偏差;2、观测的数据往往都是带有一定噪声的。

        噪声的表示:

            y=w*x+b+\epsilon

            \epsilon \sim N(0, 1)

            我们给出现有的模型,添加一个额外的因素 \epsilon,假设 \epsilon 符合高斯 N(0,1) 分布,如函数图所示:因此在大部分情况下,对于我们观测的影响是比较小的,在一个值附近左右变动,只有比较小的可能性会出现观测误差。

            当我们的拿到的样本值存在观测误差,如果我们只根据两个拿到的样本值去估计,估计到的 w 和 b 的值往往带有很大的随机性,可能会在一个很大的范围内波动。那么如何解决这个问题呢?往往是通过多观测几组数据样本。

                1.567=w*1 + b

                3.043=w*2+b

                4.519=w*2+b

                \cdots \cdots \cdots \cdots\cdots\cdots

四、示例

    假设已经知道模型的 ground-truth,y=1.476*x+0.091 + \epsilon,已经知道了真实的 w=1.476 和 b=0.091,并添加一个简单的高斯噪声 \epsilon。这时我们就可以通过这个分布去得到 (x,y) 的样本对,如下图所示,在 x 区间 [-5, 15] 间,我们很有理由相信该模式是符合某一个线性分布的。

    

    而在现实生活中模型的ground-truth往往是不可知的,我们需要自己去求解模型参数 w 和 b

五、求解 w^{'}, b^{'}

    如何去很好的求解 w^{'}, b^{'} 呢?为了求解这个问题,我们构造一个新的函数 loss 函数,当 loss 函数值越来越小的时候,说明了对于任意的样本 x,经过 w^{'}*x+b^{'} 计算之后,是很有可能接近真实的 y 值的,这时的 w^{'}, b^{'}  的值就是我们所要求解的线性模型的参数。

    所以,我们把模型参数估计的问题转换成了 Minimize \ loss 的问题,通过 Minimize \ loss 我们就可以求得 w^{'}, b^{'}  的值就是我们所要求解的线性模型的参数。

    (W*X+b-Y)^{2}

    loss = \sum_{i=1}(w*x_{i}+b-y_{i})^{2}

    Minimize \ loss

    w^{'}*x+b^{'}\rightarrow y

六、梯度下降

    

    w^{'}=w-lr*\frac{dy}{dw}

    x^{'}=x-0.005*\frac{dy}{dx}

    可以看出,函数的导数的方向是沿着函数值变大的方向,当我们在求解极小值时,x 值的变化应该是向着导数值变化的反方向行进。

    由于将导数的长度作为步长前进的话 x 的跨度会比较大,所以我们乘以一个固定的衰减因子 0.005。

    梯度下降可能没法找到一个全局的最小解,但是可以找到一个合适的范围,这个范围里面当我们发现 performance(性能) 足够好的话,我们将这个解作为一个实际可行的解。

    故而求解 w^{'}, b^{'} 的过程为:

        loss=\sum_{i=1}(w*x_{i}+b-y_{i})^{2}

        w^{'}=w-lr\frac{\partial loss}{\partial w}

        b^{'}=b-lr*\frac{\partial loss}{\partial b}

        w^{'}*x + b^{'}\rightarrow y

        w^{'}*x + b^{'} 的结果总是好于 w*x + b,因为 w^{'}, b^{'} 是由 w, b 不停的更新得到的值。

七、计算 loss

         loss=\sum_{i=1}(w*x_{i}+b-y_{i})^{2}

        w^{'}=w-lr\frac{\partial loss}{\partial w}

        b^{'}=b-lr*\frac{\partial loss}{\partial b}

        w^{'}*x + b^{'}\rightarrow y

    我们拿到100个数据点,每个数据点有两个数值([100,2]),结构为 [(x_{0},y_{0}), (x_{1}, y_{1}), (x_{2}, y_{2}),\cdots ,(x_{99},y_{99})],随机初始化 w_{0}=b_{0}=0,所以 loss 的计算公式为:

        loss\\=(w_{0}x_{0}+b_{o}-y_{0})^{2} \\ + (w_{0}x_{1}+b_{o}-y_{1})^{2}\\+(w_{0}x_{2}+b_{o}-y_{2})^{2}\\+\cdots\\+ (w_{0}x_{99}+b_{o}-y_{99})^{2}

        w^{'}=w-lr\frac{\partial loss}{\partial w} \\=w-lr(2((wx_{0}+b-y_{0})x_{0}+(wx_{1}+b-y_{1})x_{1}(wx_{2}+b-y_{2})x_{2}+\cdots +(wx_{99}+b-y_{99})x_{99})) \\=w-lr(2\sum_{i=1}(wx_{i}+b-y_{i})x_{i})

            b^{'}=b-lr\frac{\partial loss}{\partial b} \\=w-lr(2((wx_{0}+b-y_{0})+(wx_{1}+b-y_{1})(wx_{2}+b-y_{2})+\cdots +(wx_{99}+b-y_{99}))) \\=w-lr(2\sum_{i=1}(wx_{i}+b-y_{i}))

    在实际计算过程中,loss 会有一个累加的过程,计算结果将变得非常大,在计算 loss 的时候,我们通常除以一个 N(数据点个数100),得到一个平均 loss

        loss=\frac{1}{N}\sum_{i=1}(w*x_{i}+b-y_{i})^{2}

        loss=\frac{1}{N}*((w_{0}x_{0}+b_{o}-y_{0})^{2} + (w_{0}x_{1}+b_{o}-y_{1})^{2}+(w_{0}x_{2}+b_{o}-y_{2})^{2}+\cdots+ (w_{0}x_{99}+b_{o}-y_{99})^{2})

        w^{'}=w-lr\frac{\partial loss}{\partial w} \\=w-lr(2((wx_{0}+b-y_{0})x_{0}+(wx_{1}+b-y_{1})x_{1}(wx_{2}+b-y_{2})x_{2}+\cdots +(wx_{99}+b-y_{99})x_{99})) \\=w-lr(2\sum_{i=1}(wx_{i}+b-y_{i})x_{i})

        b^{'}=b-lr\frac{\partial loss}{\partial b} \\=w-lr(2((wx_{0}+b-y_{0})+(wx_{1}+b-y_{1})(wx_{2}+b-y_{2})+\cdots +(wx_{99}+b-y_{99}))) \\=w-lr(2\sum_{i=1}(wx_{i}+b-y_{i}))

    1、Numpy 版本

        (1) 计算 loss

            loss=\sum_{i=1}(w*x_{i}+b-y_{i})^{2}\\=\frac{1}{N}*((w_{0}x_{0}+b_{o}-y_{0})^{2} + (w_{0}x_{1}+b_{o}-y_{1})^{2}+(w_{0}x_{2}+b_{o}-y_{2})^{2}+\cdots+ (w_{0}x_{99}+b_{o}-y_{99})^{2})

            

        (2) 计算梯度 w^{'}b^{'}

            w^{'}=w-lr\frac{\partial loss}{\partial w} \\=w-lr(2((wx_{0}+b-y_{0})x_{0}+(wx_{1}+b-y_{1})x_{1}(wx_{2}+b-y_{2})x_{2}+\cdots +(wx_{99}+b-y_{99})x_{99})) \\=w-lr(2\sum_{i=1}(wx_{i}+b-y_{i})x_{i})

            b^{'}=b-lr\frac{\partial loss}{\partial b} \\=w-lr(2((wx_{0}+b-y_{0})+(wx_{1}+b-y_{1})(wx_{2}+b-y_{2})+\cdots +(wx_{99}+b-y_{99}))) \\=w-lr(2\sum_{i=1}(wx_{i}+b-y_{i}))

            

        (3) 更新梯度

             w\leftarrow w^{'}

              b\leftarrow b^{'}

            

        (4) 函数调用

            

            

        (5) 计算结果:

            

 

    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值