线性回归,最小二乘法

来源:互联网 发布:闺蜜 礼物 知乎 编辑:程序博客网 时间:2024/05/29 18:11
  1. 回归的定义:
    对于一个点集, 使用一个函数去拟合该点集,使点集与拟合函数间的误差最小,如果这个函数曲线是一条直线,则是线性回归,如果曲线是二次曲线,则是二次回归。
  2. 广义线性回归:
    广义线性模型是线性模型的扩展,其特点是不强行改变数据的自然度量,数据可以具有非线性和非恒定方差结构[59],主要是通过联结函数g()(link function),建立响应变量Y的数学期望值 与线性组合的预测变量P之间的关系:。与线性模型相比,GLM模型中Y的分布可以是任何形式的指数分布(如高斯分布、泊松分布、二项式分布),联结函数可以是任何单调可微函数(如对数函数logarithm 或逻辑函数logit)。Y的方差通过方程函数 依赖于其数学期望值 ,这里 ,为比例(或者称为离差)参数[57-58,60]。这些优点使得GLM模型可以处理非正态分布的响应变量,同时可包含定性、半定量的预测变量;Y通过连接函数g(E(Y))与线性预测因子P建立联系,不仅确保线性关系,且可保证预测值落在响应变量的变幅内,并可解决数据过度离散的问题,从而使GLM逐渐成为植被-环境关系研究的重要模型,并得到越来越多的关注。
      之前已经写了线性回归和logistic回归,基本的形式都是先设定hθ(x),然后求最最大似然估计L(θ),然后求出l(θ)=logL(θ),然后用梯度上升法或其它方法求出θ,二种回归如此想你的原因就是在于它都都是广义线性模型里的一员。

      如果一个概念分布可以表示成p(y;η)=b(y)exp(ηTT(y)-a(η))时,那么这个概率分布可以称之为指数分布

      贝努力分布转换为指数分布:p(y;ø)=øy(1-ø)1-y

                       =exp(log(øy(1-ø)1-y))

                       =exp(ylogø+(1-y)log(1-ø))

                       =exp((log(ø/(1-ø)))y+log(1-ø))

      根据上面指数分布的公式可得出:

                    b(y)=1

                    η=logø/(1-ø);ø=1/(1+e-η)

                    T(y) = y

                    a(η)=-log(1-ø)

      高斯分布转换为指数(因为σ的取值对最后的结果没影响,所以设σ2=1):p(y;μ)=(1/2π)exp(-1/2(y-μ)2);2π上有根号

                                      =(1/2π)exp(-1/2y2).exp(μy-1/2μ2)

      根据上面指数分布的公式可得出:

                    b(y)=(1/2π)exp(-1/2y2);2π上有根号

                                       η=μ                                   T(y) = y                                   a(η)=1/2μ2

      广义线性模型的三步是:
            1.将y|x;θ变换成以η为参数的指数分布的形式

            2.因为h(x)=E[y|x],所以能过第1步的变换可以得到E[y|x]与η的对应关系(对于logistic回归,期望值是ø,ø与η的关系是ø=1/(1+e-η);对于线性回归,期望值是μ,μ与η的关系是η=μ)

            3.设定η=θTx(如果η是一个向量值的话,那么ηi=θiTx)

  3. 线性回归求解:
    假设有连续型值标签(标签值分布为Y)的样本,有X={X1,X2,X3…Xn}个特征,回归就是求解回归系数θ=θ0, θ1,…,θn。在回归方程中,求得特征对应的最佳回归系数的方法是最小化误差的平方和。这里误差是指预测y值与真值之间的差值,使用该误差的简单累加将使得正差值和负差值相互抵消,采用平方误差。
    平方误差:
    求解方法有:梯度下降法、最小二乘法、局部加权线性回归、岭回归(ridge regression)和缩减方法、回归模型性能度量
    1). 最小二乘法(least square method):
    一元一次相性回归y=kx+b

# -*- coding: utf-8 -*-"""Created on Fri Jul 07 11:48:48 2017@author: gc125128"""import numpy as npfrom scipy.optimize import leastsq#sampleXi = np.array([8.19,2.72,6.39,8.71,4.7,2.66,3.78])Yi = np.array([7.01,2.78,6.47,6.71,4.1,4.23,4.05])#需要拟合的函数def func(p,x):    k,b = p    return k*x+b    pass#误差errordef error(p,x,y,s):    print s    return func(p,x)-y    pass#test p0 = [100,2]#print error(p0,Xi, Yi)#主函数s = "Test the number of iteration" #实验最小二乘法函数leastsq的调用几次error函数才能找到使得均方差误差之和最小的k,bPara = leastsq(error,p0,args=(Xi,Yi,s))k,b = Para[0]print "k=", k, "\n", "b=", bimport matplotlib.pyplot as pltplt.figure(figsize = (8,6))plt.scatter(Xi, Yi,color = "red",label = "Sample Point", linewidth = 3)x=np.linspace(0,10,1000)y = k*x + bplt.plot(x,y,color = "Orange", label ="Fitting Line", linewidth =2)plt.legend()plt.show()

一元二次线性回归y= ax^2+bx+c

###最小二乘法试验###import numpy as npfrom scipy.optimize import leastsq###采样点(Xi,Yi)###Xi=np.array([0,1,2,3,-1,-2,-3])Yi=np.array([-1.21,1.9,3.2,10.3,2.2,3.71,8.7])###需要拟合的函数func及误差error###def func(p,x):    a,b,c=p    return a*x**2+b*x+cdef error(p,x,y,s):    print s    return func(p,x)-y #x、y都是列表,故返回值也是个列表#TESTp0=[5,2,10]#print( error(p0,Xi,Yi) )###主函数从此开始###s="Test the number of iteration" #试验最小二乘法函数leastsq得调用几次error函数才能找到使得均方误差之和最小的a~cPara=leastsq(error,p0,args=(Xi,Yi,s)) #把error函数中除了p以外的参数打包到args中a,b,c=Para[0]print"a=",a,'\n',"b=",b,"c=",c###绘图,看拟合效果###import matplotlib.pyplot as pltplt.figure(figsize=(8,6))plt.scatter(Xi,Yi,color="red",label="Sample Point",linewidth=3) #画样本点x=np.linspace(-5,5,1000)y=a*x**2+b*x+cplt.plot(x,y,color="orange",label="Fitting Curve",linewidth=2) #画拟合曲线plt.legend()plt.show()
原创粉丝点击