线性函数:在数学里,线性函数是指那些线性的函数,但也常用作一次函数的别称,尽管一次函数不一定是线性的(那些不经过原点的)。
非线性函数:非线性函数包括指数函数、幂函数、对数函数、多项式函数等等基本初等函数以及他们组成的复合函数。
下面对线性函数与非线性函数作对比:
1、线性linear,指量与量之间按比例、成直线的关系,在数学上可以理解为一阶导数为常数的函数。
非线性non-linear则指不按比例、不成直线的关系,一阶导数不为常数。
2、线性的可以认为是1次曲线,比如y=ax+b ,即成一条直线。
非线性的可以认为是2次以上的曲线,比如y=ax^2+bx+c,(x^2是x的2次方),即不为直线的即可。
3、两个变量之间的关系是一次函数关系的——图象是直线,这样的两个变量之间的关系就是“线性关系”。
如果不是一次函数关系的——图象不是直线,就是“非线性关系“。
4、“线性”与“非线性”,常用于区别函数y = f (x)对自变量x的依赖关系。线性函数即一次函数,其图像为一条直线。
其它函数则为非线性函数,其图像不是直线。
5、线性,指量与量之间按比例、成直线的关系,在空间和时间上代表规则和光滑的运动。而非线性则指不按比例、不成直线的关系,代表不规则的运动和突变。
比如,普通的电阻是线性元件,电阻R两端的电压U,与流过的电流I,呈线性关系,即R=U/I,R是一个定数。二极管的正向特性,就是一个典型的非线性关系,二极管两端的电压u,与流过的电流i不是一个固定的比值,即二极管的正向电阻值,是随不同的工作点(u、i)而不同的。
5、在数学上,线性关系是指自变量x与因变量yo之间可以表示成y=ax+b ,(a,b为常数),即说x与y之间成线性关系。
不能表示成y=ax+b ,(a,b为常数),即非线性关系,非线性关系可以是二次,三次等函数关系,也可能是没有关系。
线性关系:
两个变量之间存在一次函数关系,就称它们之间存在线性关系。
正比例关系是线性关系中的特例,反比例关系不是线性关系。
更通俗一点讲,如果把这两个变量分别作为点的横坐标与纵坐标,其图象是平面上的一条直线,则这两个变量之间的关系就是线性关系。
在高等数学里,线性函数是一个线性映射,是在两个向量空间之间,维持向量加法与标量乘法的映射。
例如,假若,我们用坐标向量(coordinate vector来表示
x与f(x)。那么,线性函数可以表达为f(x)=Mx。其中M是矩阵。
参考链接 线性函数
概率论
线性回归(线性拟合)与非线性回归(非线性拟合)原理、推导与算法实现(一)
关于回归和拟合,从它们的求解过程以及结果来看,两者似乎没有太大差别,事实也的确如此。从本质上说,回归属于数理统计问题,研究解释变量与响应变量之间的关系以及相关性等问题。而拟合是把平面的一系列点,用一条光滑曲线连接起来,并且让更多的点在曲线上或曲线附近。更确切的说,拟合是回归用到的一种数学方法,而拟合与回归的应用场合不同。拟合常用的方法有最小二乘法、梯度下降法、高斯牛顿(即迭代最小二乘)、列-马算法。其中最最常用的就是最小二乘法。并且拟合可以分为线性拟合与非线性拟合,非线性拟合比较常用的是多项式拟合。根据自变量的个数,拟合也可以分为曲线拟合与曲面拟合等。
而回归大多数采用最小二乘法。回归可以分为一元线性回归、一元非线性回归、多元线性回归、多元非线性回归等。
通常情况下,拟合通常所处理的是一元函数(即曲线拟合),求自变量与因变量之间的关系;对于多元回归问题,一般会涉及很多个解释变量。通常情况下,我们会把线性回归与线性拟合定义等同。本文对于回归问题,与拟合方法结合,讲解对于不同情况下拟合方程的求法,对相关系数等知识不做展开。
一:最小二乘法。
无论是在高等数学、线性代数,还是数理统计,我们都可以看到最小二乘法的身影。只不过每一部分侧重点不同,最终是殊途同归的。但是兔兔建议用矩阵的方法来做,这样很便于理解,计算起来也很方便。
最小二乘法的基本思路是:确定函数f(x),使得各个点x1,x2xn处的函数值偏差f(x1)-y1、f(x2)-y2f(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=npmat([[1 for i in range(len(x1))],x1,x2])T #把样本转成X
Y=npmat(y)T #把y转成Y
a=nplinalginv(XTX)XTY #求a的公式
a0=a[0,0];a1=a[1,0];a2=a[2,0]
ax=pltaxes(projection='3d')
xx=nparange(2,12,01)
yy=nparange(20,75,05)
XX,YY=npmeshgrid(xx,yy)
Z=a0+a1XX+a2YY #平面方程
axscatter(x1,x2,y,color="red") #画散点
axplot_surface(XX,YY,Z,cmap="winter") #画拟合平面
pltshow()
登录后复制
散点图如下:
拟合平面图:
我们发现,大部分点都落在平面附近。
(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):
sappend(ij)
lappend(s)
return npmat(l)
Y=npmat(y)T
X=to_X(x=x,n=3) #做三次多项式拟合
a=nplinalginv(XTX)XTY
xx=nparange(0,14,01)
yy=a[0,0]+a[1,0]xx+a[2,0]xx2+a[3,0]xx3
pltscatter(x,y,color="red") #画散点图
pltplot(xx,yy) #拟合曲线
pltshow()
登录后复制
散点图与拟合曲线图如下所示:
我们发现,用三次多项式拟合,效果比较好。至于其它的多项式同学们也可以尝试以下,但需要注意的是:有时不一定多项式次数越多,拟合效果越好。
(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)],
[i2 for i in x1],
[j2 for j in x2],
[ij for i,j in zip(x1,x2)]]
return npmat(X)T
X=to_X(x1,x2)
Y=npmat(y)T
a=nplinalginv(XTX)XTY
a0=a[0,0];a1=a[1,0];a2=a[2,0];a3=a[3,0]
ax=pltaxes(projection='3d') #画散点图
axscatter(x1,x2,y,color='red')
xt=nparange(-5,10)
yt=nparange(-5,10)
Xt,Yt=npmeshgrid(xt,yt)
Z=a0+a1Xt2+a2Yt2+a3XtYt
axplot_surface(Xt,Yt,Z) #画拟合曲面
pltshow()
登录后复制
运行结果如下图所示。
二:梯度下降法
关于梯度下降法,兔兔在《梯度下降法(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=npmat([[1 for i in range(5)],x])T
Y=npmat(y)T
def Grand_descend(x,y,circle=100,alpha=0001):
'''梯度下降'''
a=nprandomnormal(size=(2,1)) #初始化a
for i in range(circle): #迭代次数
a-= alpha(XTXa-XTY) #批量梯度下降
return a
a=Grand_descend(x=X,y=Y)
xt=nparange(0,10)
yt=a[0,0]+a[1,0]xt
pltscatter(x,y,color='red')
pltplot(xt,yt,color='green')
pltshow()
登录后复制
结果如下:
这里学习率需要小一些,否则容易出现梯度爆炸。迭代次数也需要适当。对于前面最小二乘法的三个例子,同样可以用梯度下降这种方法来进行拟合计算。
三:总结
关于回归(拟合)问题,本文先介绍了最小二乘法与梯度下降法,二者在公式推导上有很多相似的地方,目的都是在确定函数形式后,求损失函数的最小值时的参数。关于线性拟合问题,相对容易一些,而对于非线性的问题,往往还要因具体情况而分析,选特定的方法,兔兔之后会单独讲解。关于高斯牛顿与列-马算法,二者也有许多相似之处,兔兔将会在第二部分进行讲解。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)