精华内容
下载资源
问答
  • Python最小二乘法矩阵

    2020-09-19 18:45:05
    今天小编就为大家分享一篇关于Python最小二乘法矩阵,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 基于jupyter notebook的python编程—–利用梯度下降算法求解多元线性回归方程,并与最小二乘法求解进行精度对比目录一、梯度下降算法的基本原理1、梯度下降算法的基本原理二、题目、表格数据、以及python环境搭建1、...
  • 最小二乘法及其python实现

    万次阅读 多人点赞 2019-07-25 08:15:25
    所谓最小二乘法,即通过对数据进行拟合,使得拟合值与样本值的方差最小。

    所谓最小二乘法,即通过对数据进行拟合,使得拟合值与样本值的方差最小。

    线性拟合

    假设样本为 { x n } = x 1 , x 2 . . . x n , { y n } = y 1 , y 2 . . . y n \{x_n\}={x_1,x_2...x_n},\{y_n\}={y_1,y_2...y_n} {xn}=x1,x2...xn,{yn}=y1,y2...yn,其拟合之后的方程为 y = a x + b y=ax+b y=ax+b。则拟合值与样本值之差即为误差,误差的平方和可以衡量总误差:
    J ( a , b ) = ∑ i = 1 n ( y i − a x i − b ) 2 J(a,b)=\sum_{i=1}^{n}{(y_i-ax_i-b)^2} J(a,b)=i=1n(yiaxib)2
    对于误差函数,当其导数为0时有极值,故对误差函数求偏导数并使之为0:

    ∂ J ∂ a = ∑ i = 1 n − 2 x i ( y i − a x i − b ) = 0 ∂ J ∂ b = ∑ i = 1 n − 2 ( y i − a x i − b ) = 0 \begin{aligned} \frac{\partial J}{\partial a}&=\sum_{i=1}^{n}-2x_i{(y_i-ax_i-b)}&=0\\ \frac{\partial J}{\partial b}&=\sum_{i=1}^{n}-2{(y_i-ax_i-b)}&=0 \end{aligned} aJbJ=i=1n2xi(yiaxib)=i=1n2(yiaxib)=0=0可得

    ∑ i = 1 n x i ( y i − a x i − b ) = 0 ∑ i = 1 n ( y i − a x i − b ) = 0 \begin{aligned} \sum_{i=1}^{n}x_i{(y_i-ax_i-b)}&=0\\ \sum_{i=1}^{n}{(y_i-ax_i-b)}&=0 \end{aligned} i=1nxi(yiaxib)i=1n(yiaxib)=0=0

    约定记号 S ( x y ) = ∑ x i y i S(xy)=\sum{x_iy_i} S(xy)=xiyi, S ( x 2 ) = ∑ x i 2 S(x^2)=\sum{x_i^2} S(x2)=xi2, S ( x ) = ∑ x i S(x)=\sum{x_i} S(x)=xi, E ( x ) = 1 n ∑ x i E(x)=\frac{1}{n}\sum{x_i} E(x)=n1xi, E ( y ) = 1 n ∑ y i E(y)=\frac{1}{n}\sum{y_i} E(y)=n1yi,则上式化为

    S ( x y ) − a S ( x 2 ) − b S ( x ) = 0 E ( y ) − a E ( x ) − b = 0 \begin{aligned} S(xy)-aS(x^2)-bS(x)&=0\\ E(y)-aE(x)-b&=0 \end{aligned} S(xy)aS(x2)bS(x)E(y)aE(x)b=0=0
    易得
    a = S ( x y ) − E ( y ) S ( x ) S ( x 2 ) − E ( x ) S ( x ) b = E ( y ) S ( x 2 ) − S ( x y ) E ( x ) S ( x 2 ) − E ( x ) S ( x ) \begin{aligned} a &= \frac{S(xy)-E(y)S(x)}{S(x^2)-E(x)S(x)}\\ b &= \frac{E(y)S(x^2)-S(xy)E(x)}{S(x^2)-E(x)S(x)} \end{aligned} ab=S(x2)E(x)S(x)S(xy)E(y)S(x)=S(x2)E(x)S(x)E(y)S(x2)S(xy)E(x)
    这个表达式还是非常简单的。

    对于有些情况,我们往往选取自然序列作为自变量,这个时候在求自变量的取值时可以用到一些初等数学的推论,对于 x ∈ [ m , n ] x\in [m,n] x[m,n]的自然序列来说,有
    S ( x ) = ( m + n ) ( n − m + 1 ) 2 S ( x 2 ) = n ( n + 1 ) ( 2 n + 1 ) − m ( n − 1 ) ( 2 m − 1 ) 6 \begin{aligned} S(x) &= \frac{(m+n)(n-m+1)}{2}\\ S(x^2)&= \frac{n(n+1)(2n+1)-m(n-1)(2m-1)}{6} \end{aligned} S(x)S(x2)=2(m+n)(nm+1)=6n(n+1)(2n+1)m(n1)(2m1)代码为:

    #文件名core.py
    import numpy as np
    def leastSquare(x,y):
        if len(x)==2:
        #此时x为自然序列
            sx = 0.5*(x[1]-x[0]+1)*(x[1]+x[0])
            ex = sx/(x[1]-x[0]+1)
            sx2 = ((x[1]*(x[1]+1)*(2*x[1]+1))
                  -(x[0]*(x[0]-1)*(2*x[0]-1)))/6
            x = np.array(range(x[0],x[1]+1))
        else:
            sx = sum(x)
            ex = sx/len(x)
            sx2 = sum(x**2)
        
        sxy = sum(x*y)
        ey = np.mean(y)
    
        a = (sxy-ey*sx)/(sx2-ex*sx)
        b = (ey*sx2-sxy*ex)/(sx2-ex*sx)
        return a,b
    

    测试一下

    >>> x = np.arange(25)
    >>> y = x*15+20+np.random.randn(len(x))*5	#randn生成正态分布噪声
    >>> a,b = core.leastSquare(x,y)				
    >>> plt.scatter(x,y)						#原始数据散点图
    <matplotlib.collections.PathCollection object at 0x00000218DEBBEDC8>
    >>> plt.plot(x,a*x+b)						#拟合直线
    [<matplotlib.lines.Line2D object at 0x00000218E0314FC8>]
    >>> plt.show()
    

    得到
    在这里插入图片描述

    高阶多项式

    对于高阶的多项式拟合,其思路与线性拟合是如出一辙的。对于样本 { x n } = x 1 , x 2 . . . x n , { y n } = y 1 , y 2 . . . y n \{x_n\}={x_1,x_2...x_n},\{y_n\}={y_1,y_2...y_n} {xn}=x1,x2...xn,{yn}=y1,y2...yn,假设其拟合之后的方程为 y = ∑ j = 0 m a j x j y=\sum_{j=0}^{m}{a_jx^j} y=j=0majxj则相应地其误差方程组可表示为

    J ( a j ) = ∑ i = 0 n ( y i − ∑ j = 0 m a j x i j ) 2 J(a_j)=\sum^n_{i=0}{(y_i-\sum_{j=0}^{m}{a_jx_i^j})^2} J(aj)=i=0n(yij=0majxij)2则其每个参数的偏导数可表示为

    ∂ J ∂ a k = ∑ i = 0 n 2 ⋅ x i k ( y i − ∑ j = 0 m a j x i j ) = 0 \frac{\partial J}{\partial a_k}=\sum^n_{i=0}{ 2\cdot x_i^k(y_i-\sum_{j=0}^{m}{a_jx_i^j})}=0 akJ=i=0n2xik(yij=0majxij)=0

    ∑ i = 0 n x i k y i − ∑ i = 0 n ∑ j = 0 m a j x i j + k = 0 \sum^n_{i=0}{ x_i^{k}y_i}-\sum^n_{i=0}{\sum_{j=0}^{m}{a_j x_i^{j+k}}}=0 i=0nxikyii=0nj=0majxij+k=0

    和前面一样,约定

    S k = ∑ i = 0 n x i k y i , S k j = ∑ j = 0 m x i j + k S_k=\sum^n_{i=0}{ x_i^{k}y_i},S_{kj}=\sum_{j=0}^{m}{x_i^{j+k}} Sk=i=0nxikyi,Skj=j=0mxij+k,则对于任意 i i i值,上式可变为
    S k − ⋅ ∑ j = 0 m a j S k j = 0 S_k-\cdot \sum_{j=0}^{m}a_jS{kj}=0 Skj=0majSkj=0

    写成矩阵的形式即为
    [ S 00 S 01 . . . S 0 m S 10 S 11 . . . S 1 m . . . . . . . . . . . . S m 0 S m 1 . . . S m m ] ⋅ [ a 0 a 1 . . . a m ] = [ S 0 S 1 . . . S m ] \left[\begin{matrix} S_{00}&amp;S_{01}&amp;...&amp;S_{0m}\\ S_{10}&amp;S_{11}&amp;...&amp;S_{1m}\\ ...&amp;...&amp;...&amp;...\\ S_{m0}&amp;S_{m1}&amp;...&amp;S_{mm} \end{matrix}\right]\cdot \left[\begin{matrix}a_0\\a_1\\...\\a_m \end{matrix}\right] =\left[\begin{matrix}S_0\\S_1\\...\\S_m \end{matrix}\right] S00S10...Sm0S01S11...Sm1............S0mS1m...Smma0a1...am=S0S1...Sm
    代码如下

    #传入参数格式为np.array,n为阶数
    def leastSquareMulti(x,y,n):
        X = [np.sum(x**i) for i in range(2*n+1)]
        Y = np.array([[np.sum(y*x**i)] for i in range(n+1)])
        S = np.array([X[i:i+n+1] for i in range(n+1)])
        return np.linalg.solve(S,Y)		#
    

    经测试结果如下:

    >>> x = np.arange(25)
    >>> y = x**3+3*x**2+2*x+12
    >>> import core
    >>> core.leastSquareMulti(x,y,3)
    array([[12.],		#此为常数项
           [ 2.],
           [ 3.],
           [ 1.]])
    

    多自变量

    对于样本 { x 1 n } = x 11 , x 12 . . . x 1 n , { x 2 n } = x 21 , x 22 . . . x 2 n , . . . . . . . { x m n } = x m 1 , x m 2 . . . x m n , { y n } = y 1 , y 2 . . . y n \begin{aligned} \{x_{1n}\}&amp;=x_{11},x_{12}&amp;...&amp;x_{1n},\\ \{x_{2n}\}&amp;=x_{21},x_{22}&amp;...&amp;x_{2n},\\ &amp;....&amp;...&amp;\\ \{x_{mn}\}&amp;=x_{m1},x_{m2}&amp;...&amp;x_{mn},\\ \{y_n\}&amp;=y_1,y_2&amp;...&amp;y_n \end{aligned} {x1n}{x2n}{xmn}{yn}=x11,x12=x21,x22....=xm1,xm2=y1,y2...............x1n,x2n,xmn,yn
    假设其拟合之后的方程为 y = ∑ j = 1 m a j x j y=\sum_{j=1}^{m}{a_jx_j} y=j=1majxj则相应地其误差方程组可表示为

    J ( a j ) = ∑ i = 1 n ( y i − ∑ j = 1 m a j x j i ) 2 J(a_j)=\sum^n_{i=1}{(y_i-\sum_{j=1}^{m}{a_jx_{ji}})^2} J(aj)=i=1n(yij=1majxji)2则其每个参数的偏导数可表示为

    ∂ J ∂ a k = ∑ i = 1 n 2 ⋅ x k i ( y i − ∑ j = 1 m a j x j i ) = 0 \frac{\partial J}{\partial a_k}=\sum^n_{i=1}{ 2\cdot x_{ki}(y_i-\sum_{j=1}^{m}{a_jx_{ji}})}=0 akJ=i=1n2xki(yij=1majxji)=0

    ∑ i = 1 n x k i y i − ∑ i = 1 n ∑ j = 1 m a j x j i x k i = 0 \sum^n_{i=1}{ x_{ki}y_i}-\sum^n_{i=1}{\sum_{j=1}^{m}{a_j x_{ji}x_{ki}}}=0 i=1nxkiyii=1nj=1majxjixki=0

    约定 Y k = ∑ i = 1 n x k i y i Y_k=\sum^n_{i=1}{ x_{ki}y_i} Yk=i=1nxkiyi, X j k = ∑ i = 1 n x j i x k i X_{jk}=\sum^n_{i=1}{x_{ji}x_{ki}} Xjk=i=1nxjixki,其矩阵形式为
    [ X 11 X 12 . . . X 1 m X 21 X 22 . . . X 2 m . . . . . . . . . . . . X m 1 X m 2 . . . X m m ] ⋅ [ a 1 a 2 . . . a m ] = [ Y 1 Y 2 . . . Y m ] \left[\begin{matrix} X_{11}&amp;X_{12}&amp;...&amp;X_{1m}\\ X_{21}&amp;X_{22}&amp;...&amp;X_{2m}\\ ...&amp;...&amp;...&amp;...\\ X_{m1}&amp;X_{m2}&amp;...&amp;X_{mm} \end{matrix}\right]\cdot \left[\begin{matrix}a_1\\a_2\\...\\a_m \end{matrix}\right] =\left[\begin{matrix}Y_1\\Y_2\\...\\Y_m \end{matrix}\right] X11X21...Xm1X12X22...Xm2............X1mX2m...Xmma1a2...am=Y1Y2...Ym

    如果最终的拟合方程需要常数项,则只需对 x x x增添一组值为1的样本即可,其对应的 a m + 1 a_{m+1} am+1即为常数项。

    在具体的编程中,假设其输入的自变量为一个矩阵 X X X,每行代表某一自变量的不同取值,列表示每一组取值的不同自变量。那么上式左侧的系数矩阵可以表示为 X ⋅ X T X\cdot X^T XXT

    指数函数

    一般来说,对于形如 y = a e b x y=ae^{bx} y=aebx这样的函数来说,只需左右取对数,便可得到形如 l n y = b x + l n a lny=bx+lna lny=bx+lna这样的线性形式,通过简单的坐标变换,即可得到 b b b l n a lna lna的值。

    然而,对于形如 y = a 1 e b 1 x + a 2 e b 2 x y=a_1e^{b_1x}+a_2e^{b_2x} y=a1eb1x+a2eb2x的函数,便无能为力了。

    这时,如果 x x x是一个自然序列,或者间距恒定,那么我们可以通过上述表达式构建一个线性关系。设 x x x的间距为 δ \delta δ,约定 y 0 = a 1 e b 1 x + a 2 e b 2 x = y y 1 = a 1 e b 1 ( x + δ ) + a 2 e b 2 ( x + δ ) y 2 = a 1 e b 1 ( x + 2 δ ) + a 2 e b 2 ( x + 2 δ ) \begin{aligned} y_0&amp;=a_1e^{b_1x}+a_2e^{b_2x}=y\\ y_1&amp;=a_1e^{b_1(x+\delta)}+a_2e^{b_2(x+\delta)}\\ y_2&amp;=a_1e^{b_1(x+2\delta)}+a_2e^{b_2(x+2\delta)} \end{aligned} y0y1y2=a1eb1x+a2eb2x=y=a1eb1(x+δ)+a2eb2(x+δ)=a1eb1(x+2δ)+a2eb2(x+2δ)

    对于上式,可以得到关系 y 2 = y 1 ⋅ ( e b 1 δ + e b 2 δ ) − y 0 ⋅ e b 1 δ ⋅ e b 2 δ y_2=y_1\cdot(e^{b_1\delta}+e^{b_2\delta})-y_0\cdot e^{b_1\delta}\cdot e^{b_2\delta} y2=y1(eb1δ+eb2δ)y0eb1δeb2δ,即可通过最小二乘法求出 ( e b 1 δ + e b 2 δ ) (e^{b_1\delta}+e^{b_2\delta}) (eb1δ+eb2δ) e b 1 δ ⋅ e b 2 δ e^{b_1\delta}\cdot e^{b_2\delta} eb1δeb2δ

    则由 y 2 / y 1 , y 2 / y 0 y_2/y_1,y_2/y_0 y2/y1,y2/y0得到的 a , b a,b a,b可组成一元二次方程 x 2 − a ⋅ x − b = 0 x^2-a\cdot x-b=0 x2axb=0的解即为 e b 1 δ e^{b_1\delta} eb1δ e b 2 δ e^{b_2\delta} eb2δ。由于 δ \delta δ是定值,故可得到 b 1 、 b 2 b_1、b_2 b1b2的值。

    这时,我们可以选取两种不同的技术方案,其一是将其转化为多元最小二乘拟合,令 x 1 = e b 1 x , x 2 = e b 2 x x_1=e^{b_1x},x_2=e^{b_2x} x1=eb1x,x2=eb2x。另一种则是令 X = e ( b 1 − b 2 ) x , Y = y e b 2 x X = e^{(b_1-b_2)x},Y=\frac{y}{e^{b_2x}} X=e(b1b2)x,Y=eb2xy,则拟合方程变为 Y = a 1 X + a 2 Y=a_1X+a_2 Y=a1X+a2

    δ \delta δ为1,则其代码为

    def expFit(x,y):
        y0 = y[0:-3]
        y1 = y[1:-2]
        y2 = y[2:-1]
    
        B,C = leastSquare(y2/y0,y1/y0)
        b1 = np.log((B-np.sqrt(B**2+4*C))/2)
        b2 = np.log((B+np.sqrt(B**2+4*C))/2)
    
        X = np.exp(b1-b2)*x
        Y = y/np.exp(b2*x)
    
        a1,a2 = leastSquare(X,Y)
        return a1,a2,b1,b2
    
    展开全文
  • 最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些...

    最小二乘法Least Square Method,做为分类回归算法的基础,有着悠久的历史(由马里·勒让德于1806年提出)。它通过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便地求得未知的数据,并使得这些求得的数据与实际数据之间误差的平方和为最小。最小二乘法还可用于曲线拟合。其他一些优化问题也可通过最小化能量或最大化熵用最小二乘法来表达。

    那什么是最小二乘法呢?别着急,我们先从几个简单的概念说起。

    假设我们现在有一系列的数据点

    ,那么由我们给出的拟合函数h(x)得到的估计量就是

    ,那么怎么评估我们给出的拟合函数与实际待求解的函数的拟合程度比较高呢?这里我们先定义一个概念:残差

    , 我们估计拟合程度都是在残差的基础上进行的。下面再介绍三种范数:

    • ∞-范数:残差绝对值的最大值

    ,即所有数据点中残差距离的最大值

    • 1-范数:绝对残差和

    ,即所有数据点残差距离之和

    • 2-范数:残差平方和

    前两种范数是最容易想到,最自然的,但是不利于进行微分运算,在数据量很大的情况下计算量太大,不具有可操作性。因此一般使用的是2-范数。

    说了这么多,那范数和拟合有什么关系呢?拟合程度,用通俗的话来讲,就是我们的拟合函数h(x)与待求解的函数y之间的相似性。那么2-范数越小,自然相似性就比较高了。

    由此,我们可以写出最小二乘法的定义了:

    对于给定的数据

    ,在取定的假设空间H中,求解h(x)∈H,使得残差

    的2-范数最小,即

    从几何上讲,就是寻找与给定点

    距离平方和最小的曲线y=h(x)。h(x)称为拟合函数或者最小二乘解,求解拟合函数h(x)的方法称为曲线拟合的最小二乘法。

    那么这里的h(x)到底应该长什么样呢?一般情况下,这是一条多项式曲线:

    这里h(x,w)是一个n次多项式,w是其参数。

    也就是说,最小二乘法就是要找到这样一组

    ,使得

    最小。

    那么如何找到这样的w,使得其拟合函数h(x)与目标函数y具有最高拟合程度呢?即最小二乘法如何求解呢,这才是关键啊。

    假设我们的拟合函数是一个线性函数,即:

    (当然,也可以是二次函数,或者更高维的函数,这里仅仅是作为求解范例,所以采用了最简单的线性函数)那么我们的目标就是找到这样的w,

    这里令

    为样本

    的平方损失函数

    这里的Q(w)即为我们要进行最优化的风险函数。

    学过微积分的同学应该比较清楚,这是一个典型的求解极值的问题,只需要分别对 18 求偏导数,然后令偏导数为0,即可求解出极值点,即:

    接下来只需要求解这个方程组即可解出w_i 的值

    ============ 分割分割 =============

    上面我们讲解了什么是最小二乘法,以及如何求解最小二乘解,下面我们将通过Python来实现最小二乘法。

    这里我们把目标函数选为y=sin(2πx),叠加上一个正态分布作为噪音干扰,然后使用多项式分布去拟合它。

    代码:

    # _*_ coding: utf-8 _*_

    # 作者: yhao

    # 博客: http://blog.csdn.net/yhao2014

    # 邮箱: yanhao07@sina.com

    import numpy as np # 引入numpy

    import scipy as sp

    import pylab as pl

    from scipy.optimize import leastsq # 引入最小二乘函数

    n = 9 # 多项式次数

    # 目标函数

    def real_func(x):

    return np.sin(2 * np.pi * x)

    # 多项式函数

    def fit_func(p, x):

    f = np.poly1d(p)

    return f(x)

    # 残差函数

    def residuals_func(p, y, x):

    ret = fit_func(p, x) - y

    return ret

    x = np.linspace(0, 1, 9) # 随机选择9个点作为x

    x_points = np.linspace(0, 1, 1000) # 画图时需要的连续点

    y0 = real_func(x) # 目标函数

    y1 = [np.random.normal(0, 0.1) + y for y in y0] # 添加正太分布噪声后的函数

    p_init = np.random.randn(n) # 随机初始化多项式参数

    plsq = leastsq(residuals_func, p_init, args=(y1, x))

    print 'Fitting Parameters: ', plsq[0] # 输出拟合参数

    pl.plot(x_points, real_func(x_points), label='real')

    pl.plot(x_points, fit_func(plsq[0], x_points), label='fitted curve')

    pl.plot(x, y1, 'bo', label='with noise')

    pl.legend()

    pl.show()

    输出拟合参数:

    图像如下:

    从图像上看,很明显我们的拟合函数过拟合了,下面我们尝试在风险函数的基础上加上正则化项,来降低过拟合的现象:

    为此,我们只需要在残差函数中将lambda^(1/2)p加在了返回的array的后面

    regularization = 0.1 # 正则化系数lambda

    # 残差函数

    def residuals_func(p, y, x):

    ret = fit_func(p, x) - y

    ret = np.append(ret, np.sqrt(regularization) * p) # 将lambda^(1/2)p加在了返回的array的后面

    return ret

    输出拟合参数:

    图像如下:

    很明显,在适当的正则化约束下,可以比较好的拟合目标函数。

    注意,如果正则化项的系数太大,会导致欠拟合现象(此时的惩罚项权重特别高)

    如,设置regularization=0.1时,图像如下:

    此时明显欠拟合。所以要慎重进行正则化参数的选择。

    以上这篇最小二乘法及其python实现详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

    本文标题: 最小二乘法及其python实现详解

    本文地址: http://www.cppcns.com/jiaoben/python/301349.html

    展开全文
  • Python 最小二乘法求解线性回归模型 机器学习线性回归模型 线性回归(linear regression)是一种线性模型,它假设输入变量 x 和单个输出变量 y 之间存在线性关系 具体来说,利用线性回归模型,可以从一组输入变量...

    Python 最小二乘法求解线性回归模型

    机器学习线性回归模型

    线性回归(linear regression)是一种线性模型,它假设输入变量 x 和单个输出变量 y 之间存在线性关系

    具体来说,利用线性回归模型,可以从一组输入变量 x 的线性组合中,计算输出变量 y:y=ax+b

    图片

    给定有d个属性(特征)描述的示例 x =(x1; x2; …; xd),其中xi是x在第i个属性(特征)上的取值,线性模型(linear model)试图学得一个通过属性(特征)的线性组合来进行预测的函数,即:

    一般用向量形式写成:

    图片

    其中 w = {w1,w2,w3,,,,,,}。

     

    许多功能更为强大的非线性模型可在线性模型的基础上通过引入层级结构或高维映射而得。

    最小二乘法求解

    基于均方误差最小化来进行模型求解的方法称为“最小二乘法”(least square method)

    它的主要思想就是选择未知参数,使得理论值与观测值之差的平方和达到最小。

    图片

     

    我们假设输入属性(特征)的数目只有一个:

    图片

    在线性回归中,最小二乘法就是试图找到一条直线,使所有样本到直线上的欧式距离之和最小。

    图片

    求解线性回归

    求解w和b,使得图片最小化的过程,称为线性回归模型的“最小二乘参数估计”。

    将E(w,b)分别对w和b求导,可以得到

    图片

    图片

    令偏导数都为0,可以得到

    图片

    图片

    —— 其中

    图片

    代码实现

    
    ### 0.引入依赖
    import numpy as np
    import matplotlib.pyplot as plt
    ### 1.导入数据
    points = np.genfromtxt('data.csv',delimiter=',')
    # 提取points中的两列数据,分别作为x,y
    x = points[:, 0]
    y = points[:, 1]
    # 用plt画出散点图
    plt.scatter(x, y)
    plt.show()
    
    
    ###  2.定义损失函数
    # 损失函数是系数的函数,另外还要传入数据的x,y
    def compute_cost(w, b, points):
        total_cost = 0
        M = len(points)
        
        #逐点计算平方损失,然后计算平均值
        for i in range(M):
            x = points[i, 0]
            y = points[i, 1]
            total_cost += (y - w*x -b) ** 2
        return total_cost/M
        
        
    ### 3.定义算法拟合函数
    # 先定义一个求均值的函数
    def average(data):
        sum = 0
        num = len(data)
        for i in range(num):
            sum += data[i]
            
        return sum/num
     
    # 定义核心拟合函数
    def fit(points):
        M = len(points)
        x_bar = average(points[:,0])
        
        sum_yx = 0
        sum_x2 = 0
        sum_delta = 0
        
        for i in range(M):
            x = points[i, 0]
            y = points[i, 1]
            sum_yx += y * (x - x_bar)
            sum_x2 += x ** 2
        # 根据公式计算w
        w = sum_yx / (sum_x2 - M * (x_bar ** 2))
        
        for i in range(M):
            x = points[i, 0]
            y = points[i, 1]
            sum_delta += (y - w * x)
        b = sum_delta / M
        
        return w, b
    
    
    ### 4. 测试
    w ,b = fit(points)
    print("w is: ", w)
    print("b is: ", b)
    cost = compute_cost(w, b, points)
    print("cost is : ",cost)
    ### 5.画出拟合曲线
    plt.scatter(x,y)
    #针对每一个x,计算得出预测的y值
    pred_y = w * x + b
    plt.plot(x, pred_y, c='r')
    plt.show()

    Matlab版本感兴趣的读者可以自己试一下求解,图片

    展开全文
  • 最小二乘法系数与常数的求解公式 例子 #最小二乘法 X = [0.698132, 0.959931, 1.134464, 1.570796, 1.919862] Y = [0.188224, 0.209138, 0.230052, 0.250965, 0.313707] n = len(X) xy, x, y, x2, = 0, 0, 0, 0 ...

    线性最小二乘法系数与常数的求解公式

    在这里插入图片描述

    例子

    在这里插入图片描述

    #线性最小二乘法
    X = [0.698132, 0.959931, 1.134464, 1.570796, 1.919862]
    Y = [0.188224, 0.209138, 0.230052, 0.250965, 0.313707]
    
    n = len(X)
    xy, x, y, x2,  = 0, 0, 0, 0
    
    for i in range(n):
        xy += X[i]*Y[i]  #xy的和
        x += X[i]  #x的和
        y += Y[i]  #y的和
        x2 += X[i]**2  #x的平方的和
    
    a1 = (n*xy - x*y) / (n*x2 - x**2)  #系数K
    a0 = (x2*y - x*xy) / (n*x2 - x**2)  #常数b
    print('a1 =',a1)
    print('a0 =',a0)
    

    结果:

    a1 = 0.09609143373278023 
    a0 = 0.11766514898834005
    

    因此线性最小二乘拟合为
    T = 0.09609143373278023 * θ + 0.11766514898834005

    特殊点的线性最小二乘法,即截距为0

    如果曲线过(0,0)点,线性最小二乘法的拟合曲线的截距应为0,那么其斜率的计算又是另一种公式了。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    代码:

    #线性最小二乘法
    X = [0, 0.183, 0.36, 0.5324, 0.702, 0.867, 1.0244, 1.1774, 1.329, 1.479, 1.5, 1.56]
    Y = [0, 306, 612, 917, 1223, 1529, 1835, 2140, 2446, 2752, 2767, 2896]
    
    n = len(X)
    xy, x, y, x2,  = 0, 0, 0, 0
    
    if X.index(0) == Y.index(0):
        a0 = 0  #常数b为0,即截距为0
        for i in range(n):
            xy += X[i]*Y[i]  #xy的和
            x2 += X[i]**2  #x的平方的和
        a1 = xy / x2  #系数K
        print('a1 =',a1)
        print('a0 =',a0)
    else:
        for i in range(n):
            xy += X[i]*Y[i]  #xy的和
            x += X[i]  #x的和
            y += Y[i]  #y的和
            x2 += X[i]**2  #x的平方的和
    
        a1 = (n*xy - x*y) / (n*x2 - x**2)  #系数K
        a0 = (x2*y - x*xy) / (n*x2 - x**2)  #常数b
        print('a1 =',a1)
        print('a0 =',a0)
    

    结果:

    a1 = 1828.3740666629756 
    a0 = 0
    

    上面的程序只能在有(0,0)的情况下正常运行,如果还存在(0,y)和(x,0)就不能正常运行。
    所以进行了改进:

    #线性最小二乘法
    X = [0, 0.183, 0.36, 0.5324, 0.702, 0.867, 1.0244, 1.1774, 1.329, 1.479, 1.5, 1.56]
    Y = [0, 306, 612, 917, 1223, 1529, 1835, 2140, 2446, 2752, 2767, 2896]
    
    n = len(X)
    xy, x, y, x2,  = 0, 0, 0, 0
    flag = 1
    #判断趋势线过不过(0,0)点
    for i,j in zip(X,Y):
        if i ==0 and j == 0:
            flag = 0
    #求解系数
    if flag == 0:
        a0 = 0  #常数b为0,即截距为0
        for i in range(n):
            xy += X[i]*Y[i]  #xy的和
            x2 += X[i]**2  #x的平方的和
        a1 = xy / x2  #系数K
        print('a1 =',a1)
        print('a0 =',a0)
    else:
        for i in range(n):
            xy += X[i]*Y[i]  #xy的和
            x += X[i]  #x的和
            y += Y[i]  #y的和
            x2 += X[i]**2  #x的平方的和
    
        a1 = (n*xy - x*y) / (n*x2 - x**2)  #系数K
        a0 = (x2*y - x*xy) / (n*x2 - x**2)  #常数b
        print('a1 =',a1)
        print('a0 =',a0)
    

    结果:

    a1 = 1828.3740666629756
    a0 = 0
    
    展开全文
  • 最小二乘法求解矛盾方程组

    千次阅读 2021-11-16 13:31:04
    最小二乘法求解矛盾方程组 参考:最小二乘法求解矛盾方程组 - 知乎 由线性代数理论可知,在求解线性方程组时,当方程式得个数多于未知数的个数时,方程组往往无解,此类方程组称为矛盾方程组(也叫超定方程组) ...
  • 最小二乘法的原理及python实现

    千次阅读 2019-11-07 17:03:53
    在看RVFL神经网络的时候,在权值更新求解时,从隐含层到输出层的权重,是根据最小二乘法的原理更新求解的。 最小二乘法Least Square Method: 假设有一系列数据值,D = {(x1,y2),(x2,y2),.....................,...
  • 最小二乘法Python实现

    万次阅读 2018-12-23 17:20:43
    最小二乘法 数学和统计上面一个基本方法是,根据最小二衬发拟合平面上的点集。其拟合的图形通常是基本类型函数,如:线性函数、多项式、三角多项式等。由于数据有测量误差或者试验误差,我们不要求数据通过所有数据...
  • 以影像数据为例: 像素坐标(pixelX,pixelY)与实际地理坐标(geoX,geoY)之间的仿射变换函数为: geoX=a*pixelX+b*pixelY+c...如果知道一组像素坐标和实际地理坐标,可以通过最小二乘法,计算出abcdef六个参数。 最小..
  • python最小二乘法详细讲解

    千次阅读 2021-03-06 19:20:55
    其实最小二乘法为分类回归算法的基础,从求解线性透视图中的消失点,m元n次函数的拟合,包括后来学到的神经网络,其思想归根结底全都是最小二乘法。本文向大家介绍python中的最小二乘法。一、最小二乘法是什么最小...
  • 前面分析了 线性最小二乘 的解法YcoFlegs:[数值计算] 数据拟合——线性最小二乘法​zhuanlan.zhihu.com现在来看另一个问题:非线性最小二乘法1. 定义首先是如何定义这里这个“非线性”。为什么前面用多项式拟合就是...
  • 最小二乘法求解 基于均方误差最小化来进行模型求解的方法称为“最小二乘法”(least square method) 它的主要思想就是选择未知参数,使得理论值与观测值之差的平方和达到最小。 我们假设输入属性(特征)的数目...
  • BY:Yang Liu代码和解析:import numpy as np ——载入numpy库,相当于增加矩阵数组容器import scipy as sp ——载入scipy库,为科学计算算法库import matplotlib.pyplot ...此时Python可实现MATLAB的功能from scipy...
  • 最小二乘法 python实现

    万次阅读 多人点赞 2018-01-14 15:29:55
    最小二乘法适用于对处理的一堆数据,不必精确的经过每一点,而是根据图像到每个数据点的距离和最小确定函数。 最小二乘法逼近的最简单的例子是根据一组观测值对(x1,y1),(x2,y2)…(xn,yn)来拟合一条直线。直线的数学...
  • 本文python代码实现的是最小二乘法...最小二乘法基本思想是使得样本方差最小。代码中self_func()函数为自定义拟合函数,skl_func()为调用scikit-learn中线性模块的函数。import numpy as npimport matplotlib.pypl...
  • python实现线性回归之最小二乘法最小二乘法详解

    万次阅读 多人点赞 2019-06-02 14:42:54
    线性回归是确定两种及两种以上变量的相互依赖关系。在数据分析中,线性回归是最简单且最有效的分析方法。...上述便为线性回归的最小二乘法求解方式,关于线性回归的另一种求解方式—梯度下降法可见笔者相关文章。
  • 最小二乘法python版本

    2018-05-03 15:38:43
    最小二乘法是机器学习求解最优化问题的最常见的方法之一,掌握并熟知是对求解最优解问题更深刻的认知。
  • 2019/3/30二元线性回归——矩阵公式法又名:对于python科学库的糟心尝试二元线性回归严格意义上其实不过是换汤不换药,我对公式进行推导,其实也就是跟以前一样的求偏导并使之为零,并且最终公式的严格推导我大概也...
  • 线性回归 1、基本概念线性回归假设因变量与自变量之间存在线性关系,因...最小二乘法:最佳拟合线下,将已知样本的自变量代入拟合直线,得到的观测值与实际值之间的误差平方和最小。2、一元线性回归为了好理解,先从...
  • 之所以说”使用”而不是”...言归正传,什么是”最小二乘法”呢?定义:最小二乘法(又称最小平方法)是一种数学优化技术,它通过最小化误差的平方和寻找数据的最佳函数匹配。作用:利用最小二乘法可以简便地求得未知...
  • 最小二乘法解决的问题:Ax=C 无解下的最优解例子1:一条过原点的直线OA,C是直线外一点,求C在OA上的投影点P例子1例子2:已知三个不在一条直线上的点A,B,C,求一条直线,使A,B,C到直线的距离和最小例子2例子3:已知...
  • Python实现最小二乘法的详细步骤

    千次阅读 2020-04-07 22:23:31
    用一个例子很详细的说明了如何使用python对一组数据进行最小二乘估计。
  • import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split ...
  • Python MATLAB MATLAB和Python数值和科学计算 数学背景 本节介绍矢量范数的概念以及矢量空间Rn\mathbb{R}^nRn中序列的收敛性。 收敛序列与Cauchi收敛 设a为R\mathbb{R}^{}R中的任意点,而ε∈R+\varepsilon \in \...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,995
精华内容 1,598
关键字:

最小二乘法求解python

python 订阅