线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

这篇具有很好参考价值的文章主要介绍了线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于回归和拟合,从它们的求解过程以及结果来看,两者似乎没有太大差别,事实也的确如此。从本质上说,回归属于数理统计问题,研究解释变量与响应变量之间的关系以及相关性等问题。而拟合是把平面的一系列点,用一条光滑曲线连接起来,并且让更多的点在曲线上或曲线附近。更确切的说,拟合是回归用到的一种数学方法,而拟合与回归的应用场合不同。拟合常用的方法有最小二乘法梯度下降法高斯牛顿(即迭代最小二乘)列-马算法。其中最最常用的就是最小二乘法。并且拟合可以分为线性拟合非线性拟合,非线性拟合比较常用的是多项式拟合。根据自变量的个数,拟合也可以分为曲线拟合曲面拟合等。

而回归大多数采用最小二乘法。回归可以分为一元线性回归一元非线性回归多元线性回归多元非线性回归等

通常情况下,拟合通常所处理的是一元函数(即曲线拟合),求自变量与因变量之间的关系;对于多元回归问题,一般会涉及很多个解释变量。通常情况下,我们会把线性回归与线性拟合定义等同。本文对于回归问题,与拟合方法结合,讲解对于不同情况下拟合方程的求法,对相关系数等知识不做展开。

一:最小二乘法。

无论是在高等数学、线性代数,还是数理统计,我们都可以看到最小二乘法的身影。只不过每一部分侧重点不同,最终是殊途同归的。但是兔兔建议用矩阵的方法来做,这样很便于理解,计算起来也很方便。

最小二乘法的基本思路是:确定函数f(x),使得各个点x1,x2..xn处的函数值偏差f(x1)-y1、f(x2)-y2...f(xn)-yn的平方和或绝对值和最小。如果是一元线性拟合(回归),我们可以设方程为f(x)=ax+b。

这时我们求得函数值偏差平方和为线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)。为了求它的最小值,利用高数的方法,就可以使M分别对a和b的偏导为0,最终求解得方程组:

线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

把方程组解出来得a,b就得出拟合结果了。这个式子也就是我们在数理统计中一元回归方程中常用的式子之一,不过比较麻烦。当自变量(解释变量)的个数是多个时,我们设方程为线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一),或者是多项式拟合,设函数为线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)。这样逐个求偏导就麻烦很多。

这个时候矩阵的方法就使得拟合结果十分简洁。而且可以发现,如果用矩阵进行一元线性拟合,展开后和上面那个结果是一致的。

例如对于多元线性回归(二元时也可以看作是平面拟合),我们设每组数据有p个指标,一共有n组数据,在多元统计中,我们称:

为样本数据矩阵(观测阵)。如果我们设方程为线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一),把每一组数据带入,求偏导等于0 时各个a的值。这个推导过程比较麻烦。不过,如果我们对于这个式子,定义X、Y、a为:

线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

这样等式就是。之后就是

这样,我们就很容易得到a了,虽然不是严格的证明,但是推算和应用却十分的简便!严格的矩阵求导证明方法兔兔写在下面了,感兴趣的同学可以看一下。(关于矩阵求导可以看兔兔的另一篇《矩阵求导(本质、原理与推导)详解》)

线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

 

那么,一元多项式拟合也是如此。如果设方程为线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)。定义X,Y,a为:

线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

这样等式就是Xa=Y,解法与推导与以上过程一样,结果为:。

对于多元非线性回归(拟合),也可以设多元多项式形式,拟合出多元多项式函数。

算法实现:

(1)二元线性回归:

对表格的数据做二元线性回归。

指标x1 7 1 11 7 11 3 8 9 2
指标x2 26 29 56 31 52 55 71 31 54
y 93 91 190 108 177 172 231 111 167

代码实现:

import numpy as np
x1=[7,1,11,7,11,3,8,9,2]
x2=[26,29,56,31,52,55,71,31,54]
y=[93,91,190,108,177,172,231,111,167]
X=np.mat([[1 for i in range(len(x1))],x1,x2]).T #把样本转成X
Y=np.mat(y).T #把y转成Y
a=np.linalg.inv(X.T*X)*X.T*Y #求a的公式
a0=a[0,0];a1=a[1,0];a2=a[2,0]
ax=plt.axes(projection='3d')
xx=np.arange(2,12,0.1)
yy=np.arange(20,75,0.5)
XX,YY=np.meshgrid(xx,yy)
Z=a0+a1*XX+a2*YY #平面方程
ax.scatter(x1,x2,y,color="red") #画散点
ax.plot_surface(XX,YY,Z,cmap="winter") #画拟合平面
plt.show()

散点图如下:

线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

 拟合平面图:

线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

 我们发现,大部分点都落在平面附近。

(2)一元多项式回归

可以对表格的数据做三次多项式拟合。

x 1 2 4 5 6 7 10 11 13
y 18 20 0 -10 -12 0 180 308 702
import numpy as np
x=[1,2,4,5,6,7,10,11,13]
y=[18,20,0,-10,-12,0,180,308,702]
def to_X(x,n):
    '''把数据X转成矩阵X,n是拟合多项式的次数'''
    l=[]
    for i in x:
        s=[]
        for j in range(n+1):
            s.append(i**j)
        l.append(s)
    return np.mat(l)
Y=np.mat(y).T
X=to_X(x=x,n=3) #做三次多项式拟合
a=np.linalg.inv(X.T*X)*X.T*Y
xx=np.arange(0,14,0.1)
yy=a[0,0]+a[1,0]*xx+a[2,0]*xx**2+a[3,0]*xx**3
plt.scatter(x,y,color="red") #画散点图
plt.plot(xx,yy) #拟合曲线
plt.show()

散点图与拟合曲线图如下所示:

线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

 我们发现,用三次多项式拟合,效果比较好。至于其它的多项式同学们也可以尝试以下,但需要注意的是:有时不一定多项式次数越多,拟合效果越好

(3)二元多项式拟合(曲面拟合)

对于曲面拟合情况,我们可以和曲线拟合,分为n次多项式拟合。如果假设是二次曲面,就是线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)。三次曲面:线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

计算方法仍是把数据转换成矩阵X,代入公式。我们对下面数据做二次曲面拟合。

x1 1 -2 6 3 4 -4 -2 3 10
x2 2 9 -4 3 6 -3 2 2 -4
y 9 49 4 80 101 50 0 25 6
import numpy as np
x1=[1,-2,6,3,4,-4,-2,3,10]
x2=[2,9,-4,3,6,-3,2,2,-4]
y=[9,49,4,80,101,50,0,25,6]
def to_X(x1,x2):
    n=len(x1)
    X=[[1 for i in range(n)],
       [i**2 for i in x1],
       [j**2 for j in x2],
       [i*j for i,j in zip(x1,x2)]]
    return np.mat(X).T
X=to_X(x1,x2)
Y=np.mat(y).T
a=np.linalg.inv(X.T*X)*X.T*Y
a0=a[0,0];a1=a[1,0];a2=a[2,0];a3=a[3,0]
ax=plt.axes(projection='3d') #画散点图
ax.scatter(x1,x2,y,color='red')
xt=np.arange(-5,10)
yt=np.arange(-5,10)
Xt,Yt=np.meshgrid(xt,yt)
Z=a0+a1*Xt**2+a2*Yt**2+a3*Xt*Yt
ax.plot_surface(Xt,Yt,Z) #画拟合曲面
plt.show()

运行结果如下图所示。

线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

 二:梯度下降法

关于梯度下降法,兔兔在《梯度下降法(Gradient descant)算法详解》一文已经讲过。在这里,我们先设函数f(x),然后求损失函数取最小值时的a的值(这里用二分之一是为了方便,求导后乘以2后化为1)。如果用矩阵表示,可以是。为了使损失函数最小,可以用梯度下降的方法并求得a值。关于矩阵的导数兔兔在上面的矩阵求导过程中已经写过,这里就不再重复了。

算法实现

x 1 3 5 7 9
y 3 5 7 8 12
import numpy as np
x=[1,3,5,7,9]
y=[3,5,7,8,12]
X=np.mat([[1 for i in range(5)],x]).T
Y=np.mat(y).T
def Grand_descend(x,y,circle=100,alpha=0.001):
    '''梯度下降'''
    a=np.random.normal(size=(2,1)) #初始化a
    for i in range(circle): #迭代次数
        a-= alpha*(X.T*X*a-X.T*Y) #批量梯度下降
    return a
a=Grand_descend(x=X,y=Y)
xt=np.arange(0,10)
yt=a[0,0]+a[1,0]*xt
plt.scatter(x,y,color='red')
plt.plot(xt,yt,color='green')
plt.show()

结果如下:

线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)

 这里学习率需要小一些,否则容易出现梯度爆炸。迭代次数也需要适当。对于前面最小二乘法的三个例子,同样可以用梯度下降这种方法来进行拟合计算。

三:总结

关于回归(拟合)问题,本文先介绍了最小二乘法与梯度下降法,二者在公式推导上有很多相似的地方,目的都是在确定函数形式后,求损失函数的最小值时的参数。关于线性拟合问题,相对容易一些,而对于非线性的问题,往往还要因具体情况而分析,选特定的方法,兔兔之后会单独讲解。关于高斯牛顿与列-马算法,二者也有许多相似之处,兔兔将会在第二部分进行讲解。文章来源地址https://www.toymoban.com/news/detail-412718.html

到了这里,关于线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 时序预测 | MATLAB实现NARX非线性自回归外生模型房价预测

    效果一览 基本介绍 时序预测 | MATLAB实现NARX非线性自回归外生模型房价预测 研究内容 NARX(Nonlinear AutoRegressive with eXogenous inputs)是一种非线性自回归外生模型,可以用于时间序列预测,其中外生变量可以帮助提高预测的准确性。在房价预测中,NARX模型可以使用历史房价数据

    2024年02月16日
    浏览(37)
  • Matlab多元非线性函数拟合

    看了多篇文章,觉得没有一篇比较全,且可以参照的多元非线性函数拟合,看了多篇文章后总结以下内容,主要以示例给出,希望能帮助到大家快速上手。 beta = nlinfit(X, Y, modelfun, beta0) X为你的自变量,Y是因变量,modelfun是你用inline定义的函数名字,beta0是模型参数的初始值。

    2024年02月07日
    浏览(34)
  • 三种用python进行线性/非线性拟合的方法

    使用回归分析绘制拟合曲线是一种常见的方法,简单线性回归就是其中的一种。简单线性回归可以通过 最小二乘法 来计算回归系数。以下是一个使用简单线性回归来拟合数据的代码示例: 在该代码中,np.polyfit函数可以用来计算简单线性回归的回归系数。plot函数用来绘制拟

    2024年02月11日
    浏览(32)
  • Open3D 非线性最小二乘拟合二维多项式曲线

      多项式曲线表示为: p ( x ) = p 1 x n + p 2 x

    2024年02月07日
    浏览(33)
  • R语言lasso惩罚稀疏加法(相加)模型SPAM拟合非线性数据和可视化

    本文将关注R语言中的LASSO(Least Absolute Shrinkage and Selection Operator)惩罚稀疏加法模型(Sparse Additive Model,简称SPAM)。SPAM是一种用于拟合非线性数据的强大工具,它可以通过估计非线性函数的加法组件来捕捉输入变量与响应变量之间的复杂关系 ( 点击文末“阅读原文”获取完

    2024年02月11日
    浏览(28)
  • 每天五分钟机器学习:多项式非线性回归模型

    在前面的课程中,我们学习了线性回归模型和非线性回归模型的区别和联系。多项式非线性回归模型是一种用于拟合非线性数据的回归模型。与线性回归模型不同,多项式非线性回归模型可以通过增加多项式的次数来适应更复杂的数据模式。在本文中,我们将介绍多项式非线

    2024年02月16日
    浏览(33)
  • pytorch的卷积层池化层和非线性变化 和机器学习线性回归

    卷积层:   两个输出的情况 就会有两个通道 可以改变通道数的 最简单的神经网络结构: nn.Mudule就是继承父类 super执行的是 先执行父类函数里面的 forward执行的就是前向网络,就是往前推进的,当然也有反向转播,那就是用来就gradient dicent了,求导计算了。 卷积后的结果展

    2024年02月07日
    浏览(28)
  • Matlab数据处理:用离散数据根据自定义多变量非线性方程拟合解析方程求取参数

    问题:已知xlsx表格[X,Y,Z]的离散取值,希望用  来拟合,用matlab求得[C1,C2,C3,C5,C6]的值 解答: 运行结果:  备注: 1.rsquare=0.8668认为接近1,拟合效果不错 2.fill函数的startpoint如何设置[C1,...C6]得到一个收敛点?(我找了没找到什么设置startpoint好方法,摸索用如下方法找到了一个

    2024年02月11日
    浏览(36)
  • 数学建模:线性与非线性优化算法

    🔆 文章首发于我的个人博客:欢迎大佬们来逛逛 优化算法 是指在满足一定条件下,在众多方案中或者参数中最优方案,或者参数值,以使得某个或者多个功能指标达到最优,或使得系统的某些性能指标达到最大值或者最小值 优化的两个关键点: 1.明确优化的目标函数 2.明确优化

    2024年02月07日
    浏览(29)
  • 算法 数据结构分类 数据结构类型介绍 数据结构线性非线性结构 算法合集 (一)

     数据结构分为:                            a.线性结构                            b.非线性结构  a.线性结构:                       数据与结构存在一对一的线性关系; a . 线性结构 存储 分为:                                   顺序存储

    2024年02月10日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包