【352】线性回归损失函数求导举例

参考:【351】实数对向量求导公式

参考:【352】矩阵转置性质

其他方法可参考 回归算法之线性回归



线性回归的损失函数如下:
$$E_b = {(X b - y)^T (X b - y)}$$

将转置打开,像是开平方一样,运用到上面的性质:
$$
\begin{equation*}
\begin{split}
E_b &= (X b - y)^T (X b - y)\\\\
&=((Xb)^T - y^T)(Xb-y)\\\\
&=(b^T X^T - y^T)(Xb-y)\\\\
&=b^T X^T Xb - b^T X^T y - y^T Xb + y^T y
\end{split}
\end{equation*}
$$

根据实数对向量求导的公式,对上面的实数分别对向量 $b$ 求导。

$$
\begin{equation*}
\begin{split}
\nabla_b E_b &= \nabla_b (b^T X^T Xb - b^T X^T y - y^T Xb + y^T y)\\\\
&= \nabla_b (b^T X^T Xb) - \nabla_b (b^T X^T y) - \nabla_b (y^T Xb) + \nabla_b (y^T y)\\\\
&= \nabla_b (b^T (X^T X)b) - \nabla_b (b^T (X^T y)) - \nabla_b ((y^T X)b) + 0\\\\
&= (X^T X + (X^T X)^T)b - X^T y - (y^T X)^T\\\\
&= 2 X^T X b - 2 X^T y\\\\
&= 2 X^T (Xb-y)
\end{split}
\end{equation*}
$$



Python 实现算法

通过 sklearn 实现

from sklearn import linear_model

x = [
    [100.0, 4.0],
    [50.0, 3.0],
    [100.0, 4.0],
    [100.0, 2.0],
    [50.0, 2.0],
    [80.0, 2.0],
    [75.0, 3.0],
    [65.0, 4.0],
    [90.0, 3.0],
    [90.0, 2.0]
]

y = [9.3, 4.8, 8.9, 6.5, 4.2, 6.2, 7.4, 6.0, 7.6, 6.1]

test_row = [50, 3]
sk = linear_model.LinearRegression()
sk.fit(x, y)
print(sk.coef_)
print(sk.intercept_)
print(sk.predict([test_row]))

[0.0611346 0.92342537]
-0.868701466781709
[4.95830457]

x1, x2 = sk.coef_
print(x1)
print(x2)

0.06113459879206212
0.9234253666954272

得到的模型为:$y = -0.87 + 0.06 \cdot x_1 + 0.92 \cdot x_2 $

参考:Python:类属性,实例属性,私有属性与静态方法,类方法,实例方法

通过矩阵计算实现

参考:回归算法之线性回归

得到正规方程组:

说明:"$$" - 表示独占一行。
参考:在Jupyter Notebook里面写Python代码和数学公式

$$
mb_0 + \sum_{i=1}^{m} x_{i1}b_1 + ... + \sum_{i=1}^{m} x_{in}b_n = \sum_{i=1}^{m} y_i
$$

$$
\sum_{i=1}^{m} x_{i1} b_0 + \sum_{i=1}^{m} x_{i1} x_{i1} b_1 + ... + \sum_{i=1}^{m} x_{i1} x_{in}b_n = \sum_{i=1}^{m} x_{i1} y_i
$$

$$...$$

$$
\sum_{i=1}^{m} x_{in} b_0 + \sum_{i=1}^{m} x_{in} x_{i1} b_1 + ... + \sum_{i=1}^{m} x_{in} x_{in}b_n = \sum_{i=1}^{m} x_{in} y_i
$$

写成矩阵表示为:

$$
\mathbf{X}^T \mathbf{X}\mathbf{B}=\mathbf{X}^T \mathbf{Y}
$$

解得:

$$
\mathbf{B}=(\mathbf{X}^T \mathbf{X})^{-1} \mathbf{X}^T \mathbf{Y}
$$

这一步的结果,与上面通过求偏导得到的结果一致,只需让导数为 0 即可。

import numpy as np
class MyLinearRegression(object):
    def __init__(self):
        # 添加属性,并且初始化,b 为列表
        self.b = []
        self.intercept_ = 0.0
        self.coef_ = []

    def fit(self, x:list, y:list):
        # 为每条训练数据前都添加 1,作为 b0 的系数
        point_num, future_num = np.shape(x)
        # 在原来 x 的维度基础上增加一列
        tmpx = np.ones(shape=(point_num, future_num + 1))
        # 将索引为 1 的列往后的部分赋值与 x 相同
        tmpx[:, 1:] = x

        # 矩阵 X
        x_mat = np.mat(tmpx)
        # 矩阵 y
        y_mat = np.mat(y).T
        # 获取矩阵 X 的转置矩阵 xT
        xT = x_mat.T
        # 直接按照公式计算
        self.b = (xT * x_mat).I * xT * y_mat

        # 从 b 中截取相应部分
        self.intercept_ = self.b[0]
        self.coef_ = self.b[1:]

    def predict(self, x):
        # [1] + x 表示将两个列表合并成一个连续的列表
        return np.mat([1] + x) * self.b
linear = MyLinearRegression()
linear.fit(x,y)
print(linear.intercept_)
print(linear.coef_)
print(linear.predict(test_row))

[[-0.86870147]]
[[0.0611346 ]
[0.92342537]]
[[4.95830457]]

原文地址:https://www.cnblogs.com/alex-bn-lee/p/10297893.html

时间: 2024-11-08 07:58:31

【352】线性回归损失函数求导举例的相关文章

softmax交叉熵损失函数求导

来源:https://www.jianshu.com/p/c02a1fbffad6 简单易懂的softmax交叉熵损失函数求导 来写一个softmax求导的推导过程,不仅可以给自己理清思路,还可以造福大众,岂不美哉~ softmax经常被添加在分类任务的神经网络中的输出层,神经网络的反向传播中关键的步骤就是求导,从这个过程也可以更深刻地理解反向传播的过程,还可以对梯度传播的问题有更多的思考. softmax 函数 softmax(柔性最大值)函数,一般在神经网络中, softmax可以作为分类任

高等数学——复杂函数的求导方法

本文始发于个人公众号:TechFlow,原创不易,求个关注 上一篇文章我们复习了函数求导的定义和一些常见函数的导数,今天这篇文章我们回顾一下复杂函数的求导方法.先强调一下,今天的文章很重要,想要看懂机器学习各种公式推导,想要能够自己推一推各种公式,函数求导是基础中的基础,在算法这个领域,它比积分要重要得多. 我们先来看第一种情况:多个函数进行四则运算的导数. 函数四则运算求导法则 我们假设\(u=u(x)\)和\(v=v(x)\)都在x点有导数,那么它们进行加减乘除四则运算之后的结果的导数有如下

矩阵求导记录

矩阵求导 在看多元线性回归的闭式解的时候遇到矩阵求导问题,总体来讲矩阵求导与函数求导有极大的相似性,查看wiki后记录下矩阵求导的一些性质,方面日后查看. 用到比较多的公式如下(分母布局): \[ \frac{\partial \boldsymbol A\boldsymbol x}{\partial \boldsymbol x}=A^T \] \[ \frac{\partial \boldsymbol x^T\boldsymbol A}{\partial \boldsymbol x}=A \]

L2 正则详解及反向求导

1.欧氏距离  2.L2范数 3.l2正则化 1).作用 L2的作用是防止参数太大. 2).求导过程 Wij是参数矩阵 假设神经网络表达式如下 使用绝对值损失,对应的y'是true label 加入L2损失,损失函数变为如下 按照链式求导法则,损失L对W的导数如下: 新参数的更新如下: 同理可以对bias有L2损失. 原文地址:https://www.cnblogs.com/AntonioSu/p/12097906.html

matlab求导

在matlab中求导要进行符号运算. >>syms x; >>y = x^cos(x); >>ydot = diff(y, x, 1);%对x求一阶导数 ydot =   x^(cos(x) - 1)*cos(x) - x^cos(x)*log(x)*sin(x) >> y2dot = diff(y, x, 2)%求二阶导数,求n阶导数同理. y2dot =   cos(x)*(x^(cos(x) - 2)*(cos(x) - 1) - x^(cos(x)

[转载]机器学习中常用的矩阵求导公式

原文地址:机器学习中常用的矩阵求导公式作者:MachineLearner 矩阵求导好像读书的时候都没学过,因为讲矩阵的课程上不讲求导,讲求导的课又不提矩阵.如果从事机器学习方面的工作,那就一定会遇到矩阵求导的东西.维基百科上:http://en.wikipedia.org/wiki/Matrix_calculus , 根据Y与X的不同类型(实值,向量,矩阵),给出了具体的求导公式,以及一堆相关的公式,查起来都费劲. 其实在实际的机器学习工作中,最常用到的就是实值函数y对向量X的求导,定义如下(其

矩阵求导

Y = A * X --> DY/DX = A'Y = X * A --> DY/DX = AY = A' * X * B --> DY/DX = A * B'Y = A' * X' * B --> DY/DX = B * A' 于是把以前学过的矩阵求导部分整理一下: 1. 矩阵Y对标量x求导: 相当于每个元素求导数后转置一下,注意M×N矩阵求导后变成N×M了 Y = [y(ij)] --> dY/dx = [dy(ji)/dx] 2. 标量y对列向量X求导: 注意与上面不同

对任意函数求导的sas模拟

*模拟求导 步长一定要比阈值小,才能得出准确的结果; data Derivation (keep=interval slope); * function y = 1/x only concern about x>0; deltaX = 1e-6; *割线变为切线时x1减小的步长; x0 = 2; y0 = 0; %function(y0,x0);*需要求导的点; put y0; slope = 0; *需要求得的斜率,即倒数; interval = 5; *x0与x1的在x轴的间距,也是判定停止

一元多项式求导

/* 一元多项式求导 (25) 设计函数求一元多项式的导数. 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过1000的整数). 数字间以空格分隔. 输出格式: 以与输入相同的格式输出导数多项式非零项的系数和指数. 数字间以空格分隔,但结尾不能有多余空格. 注意"零多项式"的指数和系数都是0,但是表示为"0 0". 输入样例: 3 4 -5 2 6 1 -2 0 即 3X^4 - 5X^2 + 6X - 2 输出样例: 12 3 -10 1 6