精华内容
下载资源
问答
  • #非线性回归模型 setwd("I:/研一课程/2.2回归分析/R/data")#设定当前的工作目录,重要! a a.nls a.sum a.sum #(1)采用龚珀兹模型形式,建立非线性模型 SST Rsquare Rsquare #多项式回归 setwd("I:/...
    #非线性回归模型
    setwd("I:/研一课程/2.2回归分析/R/data")#设定当前的工作目录,重要!
    a<-read.table("2.txt",header=T)
    a.nls<-nls(y~k*a^(b^t),data=a,start=list(k=149,a=0.01,b=0.8))
    a.sum<-summary(a.nls)
    a.sum  #(1)采用龚珀兹模型形式,建立非线性模型
    SST<-sum((a$y-mean(a$y))**2) #计算Rsquare
    Rsquare<-1-a.sum$sigma^2*df.residual(a.nls)/SST
    Rsquare


    #多项式回归
    setwd("I:/研一课程/2.2回归分析/R/data")#设定当前的工作目录,重要!
    a<-read.table("2.txt",header=T)
    income.plm<-lm(y~t+I(t^2),data=a)
    summary(income.plm)


    #-----------------------------------------------------------#局部回归
    #核回归光滑模型1
    setwd("I:/研一课程/2.2回归分析/R/data")#设定当前的工作目录,重要!
    d<-read.table("2.txt",header=T)
    par(mfrow=c(2,1));X=d[,1];Y=d[,2];
    bw=list(" (a) normal", " (b) box")
    plot(X,Y,main=bw[[1]]);lines(ksmooth(X,Y, "normal", bandwidth=5))
    plot(X,Y,main=bw[[2]]);lines(ksmooth(X,Y, "box", bandwidth=5))


    #核回归光滑模型2
    par(mfrow=c(2,2))
    bw=list(" (a) h=1", " (b) h=2", " (c) h=3", " (d) h=5")
    plot(X,Y,main=bw[[1]]);lines(ksmooth(X,Y, "normal", bandwidth=1))
    plot(X,Y,main=bw[[2]]);lines(ksmooth(X,Y, "normal", bandwidth=2))
    plot(X,Y,main=bw[[3]]);lines(ksmooth(X,Y, "normal", bandwidth=3))
    plot(X,Y,main=bw[[4]]);lines(ksmooth(X,Y, "normal", bandwidth=5))


    #求最优的带宽h
    source("gcvbandNW.R")
    gcvbandNW(X,Y)


    #k近邻回归1
    #install.packages("kknn")
    library(kknn)
    kknnest1<-kknn(formula=Y~X,d,d,k=5,kernel="rectangular")
    kknnest2<-kknn(formula=Y~X,d,d,k=11,kernel="rectangular")
    #kknnest<-kknn(formula=Y~X,d,d,k=11,kernel="gaussian")
    par(mfrow=c(2,1));
    bw=list(" (a) k=5", " (b) k=11")
    plot(X,Y,main=bw[[1]]);lines(X,kknnest1$fitted.values)
    plot(X,Y,main=bw[[2]]);lines(X,kknnest2$fitted.values)
    source("gcvbandKN.R")
    gcvbandKN(X,Y)


    #k近邻回归2
    kknnest1<-kknn(formula=Y~X,d,d,k=11,kernel="rectangular")
    kknnest2<-kknn(formula=Y~X,d,d,k=11,kernel="gaussian")
    par(mfrow=c(2,1));
    bw=list(" (a) unweighted,k=11", " (b) Gaussian,k=11")
    plot(X,Y,main=bw[[1]]);lines(X,kknnest1$fitted.values)
    plot(X,Y,main=bw[[2]]);lines(X,kknnest2$fitted.values)


    #k近邻回归3
    kknnest1<-kknn(formula=Y~X,d,d,k=11,kernel="rectangular")
    kknnest2<-kknn(formula=Y~X,d,d,k=11,kernel="gaussian")
    par(mfrow=c(2,2));
    bw=list(" (a) knn: unweighted,k=11", " (b) knn: Gaussian,k=11", "
     (c) NW:box,h=2.5", " (d) NW:normal,h=2.5")
    plot(X,Y,main=bw[[1]]);lines(X,kknnest1$fitted.values)
    plot(X,Y,main=bw[[2]]);lines(X,kknnest2$fitted.values)
    plot(X,Y,main=bw[[3]]);lines(ksmooth(X,Y, "box", bandwidth=2.5))
    plot(X,Y,main=bw[[4]]);lines(ksmooth(X,Y, "normal", bandwidth=2.5))


    #局部多项式回归1
    #install.packages("KernSmooth")
    library(KernSmooth); 
    par(mfrow=c(2,2));
    bw=list(" (a) h=0.25", " (b) h=0.50", " (c) h=0.75", " (d) h=1")
    plot(X,Y, main=bw[[1]])
    fit1 <- locpoly(X, Y, bandwidth =0.25)
    lines(fit1)
    plot(X,Y, main=bw[[2]])
    fit2 <- locpoly(X, Y, bandwidth =0.5)
    lines(fit2)
    plot(X,Y, main=bw[[3]])
    fit3 <- locpoly(X, Y, bandwidth =0.75)
    lines(fit3)
    plot(X,Y, main=bw[[4]])
    fit4 <- locpoly(X, Y, bandwidth =1)
    lines(fit4)



    展开全文
  • 多项式回归 扩展可能是假设某些多项式函数, 同样,在标准线性模型方法(使用GLM的条件正态分布)中,参数可以使用最小二乘法获得,其中在。 即使此多项式模型不是真正的多项式模型,也可能仍然是一个很好的...

    原文链接:http://tecdat.cn/?p=20531

    原文出处:拓端数据部落公众号

    在标准线性模型中,我们假设 。当线性假设无法满足时,可以考虑使用其他方法。

    • 多项式回归

    扩展可能是假设某些多项式函数,

    同样,在标准线性模型方法(使用GLM的条件正态分布)中,参数  可以使用最小二乘法获得,其中  在  。

    即使此多项式模型不是真正的多项式模型,也可能仍然是一个很好的近似值 。实际上,根据 Stone-Weierstrass定理,如果  在某个区间上是连续的,则有一个统一的近似值  ,通过多项式函数。

    仅作说明,请考虑以下数据集

    
    db = data.frame(x=xr,y=yr)
    plot(db)

    与标准回归线

    reg = lm(y ~ x,data=db)
    abline(reg,col="red")

    考虑一些多项式回归。如果多项式函数的次数足够大,则可以获得任何一种模型,

    reg=lm(y~poly(x,5),data=db)

    但是,如果次数太大,那么会获得太多的“波动”,

    reg=lm(y~poly(x,25),data=db)

    并且估计值可能不可靠:如果我们更改一个点,则可能会发生(局部)更改

    
    yrm=yr;yrm[31]=yr[31]-2 
    lines(xr,predict(regm),col="red")
    

    • 局部回归

    实际上,如果我们的兴趣是局部有一个很好的近似值  ,为什么不使用局部回归?

    使用加权回归可以很容易地做到这一点,在最小二乘公式中,我们考虑

    • 在这里,我考虑了线性模型,但是可以考虑任何多项式模型。在这种情况下,优化问题是

    可以解决,因为

    例如,如果我们想在某个时候进行预测 , 考虑 。使用此模型,我们可以删除太远的观测值,

    更一般的想法是考虑一些核函数  给出权重函数,以及给出邻域长度的一些带宽(通常表示为h),

    这实际上就是所谓的 Nadaraya-Watson 函数估计器 
    在前面的案例中,我们考虑了统一核 

    但是使用这种权重函数具有很强的不连续性不是最好的选择,尝试高斯核,

    这可以使用

    
    w=dnorm((xr-x0))
    reg=lm(y~1,data=db,weights=w)
    

    在我们的数据集上,我们可以绘制

     
    w=dnorm((xr-x0))
    plot(db,cex=abs(w)*4)
    lines(ul,vl0,col="red")
    axis(3)
    axis(2)
    reg=lm(y~1,data=db,weights=w)
    u=seq(0,10,by=.02)
    v=predict(reg,newdata=data.frame(x=u))
    lines(u,v,col="red",lwd=2)
     

    在这里,我们需要在点2进行局部回归。下面的水平线是回归(点的大小与宽度成比例)。红色曲线是局部回归的演变

    让我们使用动画来可视化曲线。

    但是由于某些原因,我无法在Linux上轻松安装该软件包。我们可以使用循环来生成一些图形

     
    name=paste("local-reg-",100+i,".png",sep="")
    png(name,600,400)
     
    
    for(i in 1:length(vx0)) graph (i)

    然后,我使用

    当然,可以考虑局部线性模型,

     
    return(predict(reg,newdata=data.frame(x=x0)))}

    甚至是二次(局部)回归,

     
     lm(y~poly(x,degree=2), weights=w)
     

    当然,我们可以更改带宽

    请注意,实际上,我们必须选择权重函数(所谓的核)​​。但是,有(简单)方法来选择“最佳”带宽h。交叉验证的想法是考虑

      是使用局部回归获得的预测。  

    我们可以尝试一些真实的数据。

    library(XML)
     
    data = readHTMLTable(html)
     

    整理数据集,

     
    plot(data$no,data$mu,ylim=c(6,10))
    segments(data$no,data$mu-1.96*data$se,
     

    我们计算标准误差,反映不确定性。

     
    for(s in 1:8){reg=lm(mu~no,data=db, 
    lines((s predict(reg)[1:12] 

    所有季节都应该被认为是完全独立的,这不是一个很好的假设。

     smooth(db$no,db$mu,kernel = "normal",band=5)
     

    我们可以尝试查看带宽较大的曲线。

    db$mu[95]=7
      
    plot(data$no,data$mu
    
    lines(NW,col="red")

    样条平滑

    接下来,讨论回归中的平滑方法。假设 ,  是一些未知函数,但假定足够平滑。例如,假设  是连续的,  存在,并且是连续的,   存在并且也是连续的等等。如果  足够平滑,  可以使用泰勒展开式。 因此,对于 

    也可以写成

    第一部分只是一个多项式。

    使用 黎曼积分,观察到

    因此,

    我们有线性回归模型。一个自然的想法是考虑回归 https://latex.codecogs.com/gif.latex?Y,对于 https://latex.codecogs.com/gif.latex?\boldsymbol{X} 

    给一些节点 https://latex.codecogs.com/gif.latex?\ {x_1,\ cdots,x_k \}

    plot(db)

    如果我们考虑一个节点,并扩展阶数1,

    
    
    B=bs(xr,knots=c(3),Boundary.knots=c(0,10),degre=1)
     
    lines(xr[xr<=3],predict(reg)[xr<=3],col="red")
    lines(xr[xr>=3],predict(reg)[xr>=3],col="blue")

    可以将用该样条获得的预测与子集(虚线)上的回归进行比较。

    
    
    lines(xr[xr<=3],predict(reg)[xr<=3
    
    
    lm(yr~xr,subset=xr>=3)
    
    

    这是不同的,因为这里我们有三个参数(关于两个子集的回归)。当要求连续模型时,失去了一个自由度。观察到可以等效地写

    
    lm(yr~bs(xr,knots=c(3),Boundary.knots=c(0,10)
    

    回归中出现的函数如下

    现在,如果我们对这两个分量进行回归,我们得到

    
    matplot(xr,B
    
    abline(v=c(0,2,5,10),lty=2)

    如果加一个节点,我们得到

    预测是

    
    
    lines(xr,predict(reg),col="red")

    http://freakonometrics.hypotheses.org/files/2013/10/Selection_147.png

    我们可以选择更多的节点

    
    
    lines(xr,predict(reg),col="red")

    我们可以得到一个置信区间

    
    
    polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3]))
    
    points(db)
    
    

    如果我们保持先前选择的两个节点,但考虑泰勒的2阶的展开,我们得到

    
    
    matplot(xr,B,type="l")
    abline(v=c(0,2,5,10),lty=2)

    如果我们考虑常数和基于样条的第一部分,我们得到

    
    
    B=cbind(1,B)
    lines(xr,B[,1:k]%*%coefficients(reg)[1:k],col=k-1,lty=k-1)

    如果我们将常数项,第一项和第二项相加,则我们得到的部分在第一个节点之前位于左侧,

    k=3
    lines(xr,B[,1:k]%*%coefficients(reg)[1:k]
    

    http://freakonometrics.hypotheses.org/files/2013/10/Selection_165.png

    通过基于样条的矩阵中的三个项,我们可以得到两个节点之间的部分,

    
    lines(xr,B[,1:k]%*%coefficients(reg)[1:k]
    

    最后,当我们对它们求和时,这次是最后一个节点之后的右侧部分,

    k=5
    
    

    这是我们使用带有两个(固定)节点的二次样条回归得到的结果。可以像以前一样获得置信区间

    
    
    polygon(c(xr,rev(xr)),c(P[,2],rev(P[,3]))
    
    points(db)
    lines(xr,P[,1],col="red")
    
    

    使用函数 https://latex.codecogs.com/gif.latex?(x-x_i)_+,可以确保点的连续性 https://latex.codecogs.com/gif.latex?x_i

    再一次,使用线性样条函数,可以增加连续性约束,

    
    lm(mu~bs(no,knots=c(12*(1:7)+.5),Boundary.knots=c(0,97),
    
    
    lines(c(1:94,96),predict(reg),col="red")

    但是我们也可以考虑二次样条,

    
    
    abline(v=12*(0:8)+.5,lty=2)
    
    lm(mu~bs(no,knots=c(12*(1:7)+.5),Boundary.knots=c(0,97),
    


    最受欢迎的见解

    1.R语言多元Logistic逻辑回归 应用案例

    2.面板平滑转移回归(PSTR)分析案例实现

    3.matlab中的偏最小二乘回归(PLSR)和主成分回归(PCR)

    4.R语言泊松Poisson回归模型分析案例

    5.R语言回归中的Hosmer-Lemeshow拟合优度检验

    6.r语言中对LASSO回归,Ridge岭回归和Elastic Net模型实现

    7.在R语言中实现Logistic逻辑回归

    8.python用线性回归预测股票价格

    9.R语言如何在生存分析与Cox回归中计算IDI,NRI指标

    展开全文
  • 利用曲率方法研究具有结构变化的线性回归模型局部影响,分别得到了在自变量、因变量和加权扰动下相应的诊断统计量,并通过具体的数值实例说明了本文结论的有效性.
  • 自适应波长选择和局部回归策略在线更新近红外光谱模型及其工业应用
  • 断点分析法_局部线性回归_matlab

    万次阅读 热门讨论 2016-07-11 10:51:58
    本文介绍断点分析法在数据作假方面的应用 局部线性回归的matlab实现

    本文介绍断点分析法在数据作假方面的应用:

    一、题目:

    近年来空气质量问题始终是政府、环境保护部门和全国人民关注的热点问题。为了激励城市政府重视空气污染治理,地方官员的政绩考核中往往包括诸如“蓝天数”这样的指标,即全年空气污染指数低于100点的天数。搜集相关空气质量和气候数据,利用数学模型分析其数据的真实性。

    二、思路:

    使用不连续回归分析的方法。经验判断,在API为100左右最可能发生数据的操作,因为如果数据修改幅度过大,可能会引起公众和其他政府官员的怀疑,因为公众可以获得每日API指数;但是API指数在和左右是难以辨别的,在这里修改数据也不易被发现。因此,在存在数据被修改的情况下可能会存在断点。依据判断空气质量数据的概率密度分布曲线是否在达标指数附近存在不连续,我们可以初步判断数据是否被人为修改。

    三、说明:

    断点分析法一般需要在潜在断点左右两侧分别进行局部回归(一般的回归在边界处的估计存在较大偏差,采用局部线性回归可以很好的解决边界问题);而局部回归多采用局部多项式回归,局部线性回归是局部多项式回归的特例,因为其算法较为简单且性能优越,我们这里采用局部线性回归。

    四、断点分析法步骤:

    1.在100左右两侧分别进行频率分直方图的建立(这里的 100 是API值,但是具体的程序中我们使用的是每一项污染物的浓度。SO2、PM10为150,NO2为120(这里的值是API为100时对应的值),单位为:微克每立方米。至于为什么使用污染物浓度,而不使用API值,原因是API的计算函数为分段函数,本身就不具有连续性。)

    2. 取直方图的中点作为自变量,对应的概率密度作为应变量(到这里为止,我们得到拟合所要数据)

    3.对左右两侧的数据分别进行局部线性回归

    4.以下图为例:

    定性分析:在150(这里分析的是PM10,所以是150)左侧明显存在不连续,说明很有可能存在数据作假。

    定量分析:可以使用150的左右极限的差值的大小定量分析数据作假的可能性

    说明1:差值越大,表示越有可能发生数据操作,不代表作假的程度越大

    说明2:局部线性回归的带宽与直方图组距的选择很重要(后面有提到)

     

    五、局部多项式回归:

    1.局部线性的回归的简单介绍:

    多项式回归模型如下:

    其中 m(x) 表示回归函数,y_i 表示第个 i 采样点 x_i 处的采样值,ε_i表示独立分布零均值噪声

    在 m(x) 的形式未确定的情况下,假设是 N 阶局部平滑的,为了估计函数在给定数据下的任意点处的值,我们可以将函数在这一点局部展开。假设 X_i 是 X 附近的采样点,则有N阶泰勒展开式:

    首先定义权函数:

      

    其中 为核函数,它以估计点为中心,用来控制各个采样点的权重:距离 X 越近的点,权重越大,h 为带宽(平滑参数),用于控制核的尺度。核函数K( ) 形式不固定,需满足关于 y 轴对称并在零点处取最大值,在这里我们使用高斯核

    选择 m(x) 来使得下面的局部加权平方和 Q 最小。

    估计依赖于目标值 X ,最终有

    当N=1,为局部线性回归,因为其算法较为简单且性能优越,所以我们采用局部线性回归分别对临界值左右两侧的数据进行拟合。

    2.局部多项式回归的目标函数详解:

    解释1.这个式子看起来与最小二乘法回归很相似,但是最大的不同就在前面的权函数!里面存在变量x,也是就是说,当计算每一个x的估计值y时,上面的方程就会发生变换!也就是说每计算一个点,就要做计算一次参数

    解释2.为什么前面存在权函数,就会达到局部拟合的目的?局部拟合的思想从何而来?

    如果不考虑权函数的情况下,也就是最小二乘法求解方程组。

    这组方程最后的目标函数是下面的式子。我们只求两个参数,显然方程超过了两个,下面目标函数的思想就是,既然不能解,那么让(方程右边-方程左边)^2尽可能小,最后累加起来尽可能小。

    问题来了?哪个方程起的作用大呢(最小二乘拟合认为每个方程起的作用一样)?->第二节中的泰勒展开的条件是, X_i 是 X 附近的采样点,如果X_i 离X 很远,那么泰勒公式显然不成立!也就是最小二乘拟合就是强行求解参数!这样局部拟合的思想产生,如果X_i 离X 很远,对应的方程应该作用小,也就是权函数起到的作用。

    3.局部线性参数的求解:

    分别求 的偏导数,并让它们等于零,这里以线性回归进行局部的拟合,所以只需求的偏导数。

    引入矩阵

    整理关于的线性方程组,使用矩阵表示如下:

    存在,则有:

    所以有 y 的估计值:

    4.直方图组距与核函数带宽的选取:

    进行局部线性回归进行估计分两步:第一步需确保箱体大到包含足够多的样本使其样本点在临界值两边都比较平滑,但又要小到一定程度使得样本点在临界值处的跳跃能都明显的显现出来,这就需要选择合适的b;第二步以直方图箱体的中点作为观测变量,以对应的概率密度作为结果变量,采用局部线性估计y。但是潜在的不连续点不应包括在箱体中,分别在潜在不连续点左右两侧进行直方图的绘制,获得对应的样本点。

    因所获得数据较少,b选择不易过大,但是不宜过小。我们使用的标准差。带h宽控制着核函数权重变化的速率,即用来控制核的尺度,我们使用McCrary建议的带宽选择是a>10,这里我们可以尝试选择。(这里的带宽选择依据Dalia Ghanem这一篇文章:Effortless Perfection:’ Do Chinese Cities Manipulate Air Pollution Data,这一篇文章附录A中有详细描述带宽的选择,这里是这么解释的)

    说明:组距与带宽的选择有专门的研究,这里不进行深入研究,大家可以根据实际情况进行合适的选择。下图说明:当带宽选择不当会出现过拟合与欠拟合。

     补充:参见McCrary的文章:Manipulation of the runningvariable in the regression discontinuity design:A density test。里面对于带宽的选择建议是这样的:

    自己的见解:McCrary提出的这个带宽选择,可以简化为Dalia Ghanem文章中的​​,自己选择合适的a即可。正如Dalia Ghanem所说,我们不一定都要选择4次多项式拟合间断点两边的曲线,正常局部线性(1次)即可完成大多数的拟合。

    以下是matlab代码:

    % local_linear_regression:
    % author:ncf 
    % email:1476879092@qq.com  
    % log:  
    % 2016-7-12:Complete  
    % 2017-3-19:Modification
    %% 局部线性拟合   
    PM10 = xlsread('data.xlsx');
    data = PM10;  
      
    cut_off = 150; % cut_off 是相应的断点,对于 NO2 断点为 120 ,SO2、PM10 为150 (这里的数值其实是浓度,单位为微克每立方米(10^-6))
    x_lim_all = [min(PM10),max(PM10)];  
      
    % 获取 150 左侧的样本点  
    data_low = data(data<cut_off);  
    bin_width_low = 2*std(data_low)/sqrt(length(data_low));  
    bin_num_low = (cut_off-min(data_low))/bin_width_low;  
    [y_low,x_low] = hist(data_low,bin_num_low);  
    y_low=y_low/length(PM10)/mean(diff(x_low));  
    % 注:
        % 如果出现了数据量不够,那么直方图分组后,会出现部分的组数据很少甚至没有(特别是组距较小时),这时我们可以考虑将这部分数据删去,可以减少对拟合的影响
        % x_low(y_low==0) = [];  
        % y_low(y_low==0) = [];  
        
    % 获取 150 右侧的样本点  
    data_up = data(data>cut_off);  
    bin_width_up = 2*std(data_up)/sqrt(length(data_up));  
    bin_num_up = (max(data_up)-cut_off)/bin_width_up;  
    [y_up,x_up] = hist(data_up,bin_num_up);  
    y_up=y_up/length(PM10)/mean(diff(x_up));   
        % x_up(y_up==0) = [];  
        % y_up(y_up==0) = [];  
      
    y_lim_all = [min([min(y_low) min(y_up)]) max([max(y_low) max(y_up)])];  
      
    % 绘制样本点  
    colors = ['m' 'c' 'k' 'r' 'g'];   
    figure;  
    hold on;  
    plot([x_low x_up],[y_low y_up],'.b');  
    
    % 局部线性拟合  
    % 150 左侧拟合  
    h_bandwidth = [5*bin_width_low 15*bin_width_low 20*bin_width_low]; % bandwidth  
    [x_low_fit,y_low_fit] = local_linear_fit(x_low',y_low',h_bandwidth);  
    for k = 1:length(h_bandwidth)  
        plot(x_low_fit(:,k),y_low_fit(:,k),colors(k))  
    end  
    % 150 右侧拟合  
    h_bandwidth = [10*bin_width_up 15*bin_width_up 20*bin_width_up]; % bandwidth  
    [x_up_fit,y_up_fit] = local_linear_fit(x_up',y_up',h_bandwidth);  
    for k = 1:length(h_bandwidth)  
        plot(x_up_fit(:,k),y_up_fit(:,k),colors(k))  
    end  
      
    legend('trainingdata','a=10,','a=15','a=20')  
    axis([x_lim_all*1.1 y_lim_all*1.1])  
    %% 鲁棒性带宽过大过小的比较
    figure;
    hold on;
    plot([x_low x_up],[y_low y_up],'.b');
    % 局部线性拟合
    h_bandwidth = [1*bin_width_low 15*bin_width_low 30*bin_width_low]; % bandwidth
    [x_low_fit,y_low_fit] = local_linear_fit(x_low',y_low',h_bandwidth);
    for k = 1:length(h_bandwidth)
        plot(x_low_fit(:,k),y_low_fit(:,k),colors(k))
    end
    
    h_bandwidth = [1*bin_width_up 15*bin_width_up 30*bin_width_up]; % bandwidth
    [x_up_fit,y_up_fit] = local_linear_fit(x_up',y_up',h_bandwidth);
    for k = 1:length(h_bandwidth)
        plot(x_up_fit(:,k),y_up_fit(:,k),colors(k))
    end
    
    legend('trainingdata','a=1,','a=15','a=30') % 当带宽选择不当,会出现过拟合与欠拟合
    axis([x_lim_all*1.1 y_lim_all*1.1])

    以下为使用matlab编写的局部线性回归函数:(matlab中没有该函数,该函数中附有编者邮箱,具体问题可以交流)

    function [fit_x,fit_y] = local_linear_fit(x,y,h_bandwidth)  
    % local_linear_fit:local linear regression  
    %   [fit_x,fit_y] = local_linear_fit(x,y,h_bandwidth),x: independent  
    %   variable,y:dependent variable,h_bandwidth:bandwidth  
    %   
    % author:ncf 
    % email:1476879092@qq.com  
    % log:  
    % 2016-7-12:Complete  
    % 2017-3-19:Modification
      
    % column matrix  
    test_sample_x = x;  
    test_sample_y = y;  
      
    test_sample_X = [ones(length(test_sample_x),1) test_sample_x];  
      
    num_x = length(test_sample_x);   
    % Weight_speed  
    Weight_speed = 1;  
      
    %% linear fit  (basic knowledge)
    % line_fit_beta = (test_sample_X'*test_sample_X)\(test_sample_X'*test_sample_y);  
    % line_fit_y = line_fit_beta(1) + line_fit_beta(2)*test_sample_x;  
    
    
    %% local linear fit  
    % fit_x and fit_y  
    fit_x = min(test_sample_x):0.3:max(test_sample_x);  
    fit_y = zeros(length(test_sample_x),length(h_bandwidth));  
      
    for k_bandwidth = 1:length(h_bandwidth)  
        h = h_bandwidth(k_bandwidth);  
        for k_fit_y = 1:length(fit_x)  
            w = zeros(num_x,num_x);  
            K_h_all = zeros(num_x,1);  
            % compute K_h  
            for k_w = 1:num_x  
                K_h_all(k_w) = gaussian_kernel((fit_x(k_fit_y)-test_sample_x(k_w))/h,Weight_speed)/h;  
            end  
            sum_K_h_all = sum(K_h_all);  
            % compute w  
            for k_w = 1:num_x  
               w(k_w,k_w) = K_h_all(k_w)./sum_K_h_all;  
            end  
            local_beta = (test_sample_X'*w*test_sample_X)\(test_sample_X'*w*test_sample_y);  
            fit_y(k_fit_y,k_bandwidth) = local_beta(1)+local_beta(2)*fit_x(k_fit_y);  
        end  
    end  
     
    fit_x = [fit_x',fit_x',fit_x'];  
    

    以下为高斯核函数:

    function k = gaussian_kernel(x,Weight_speed)
    % Weight_speed 越大,权值变化越慢
    
    k = (1/(sqrt(2*pi)))*exp(-(x^2)/(2*Weight_speed^2));

    参考文献:

    [1]McCrary, Justin. 2008. “Manipulation of the runningvariable in the regression discontinuity design:A density test.” Journal of Econometrics 142 (2):698–714.

    [2]张煜东,颜俊,王水花,吴乐南.非参数估计方法[J].武汉工程大学学报,2010,99-106.

    [3]Ghanem,D., & Zhang, J. (2014). ‘Effortlessperfection:’ Do Chinese cities manipulate air pollutiondata?. Journal of Environmental Economics and Management, 68(2), 203-225.

    [4]欧祖军,李洪毅.局部多项式估计的带宽选择[J].长春大学学报,2007,17-19.

    [5]https://zhuanlan.zhihu.com/p/30422174

    [6]Ghanem D, Zhang J. ‘Effortless Perfection:’Do Chinese cities manipulate air pollution data?[J]. Journal of Environmental Economics and Management, 2014, 68(2): 203-225.

    注:

    1.为了方便读者理解,本博客进行了更新,并提供matlab代码与一组数据:
    http://pan.baidu.com/s/1gfcbOWj

    2.依据本文提供公式,读者可以自行编写程序,请仔细阅读

    3.博文中附有博主邮箱,1476879092@qq.com

    4.带宽的问题可以参考本文提到的参考文献,也可以自行百度查找相关文献

    5.2020.7.6更新带宽选择部分的说明。

    展开全文
  • 局部加权回归

    2018-10-03 14:33:30
    总结一下对 CS229 第三讲中的局部加权回归。线性回归并不能拟合一些特殊的模型,比如,忽上忽下的训练集。当目标函数没有明显的线性关系时,使用线性回归训练出来的线性模型并不能进行很好地匹配。这个时候就可以...

    介绍

    总结一下对 CS229 第三讲中的局部加权回归。线性回归并不能拟合一些特殊的模型,比如,忽上忽下的训练集。当目标函数没有明显的线性关系时,使用线性回归训练出来的线性模型并不能进行很好地匹配。这个时候就可以利用我们的局部加权回归来进行拟合。

    什么是局部加权回归呢?

    简单地说,就是当目标函数的线性关系不是很明显时,每次预测一个输入变量 x 的值的时候,选择距离 x 最近的那些点进行建模。通常使用的方法是,给所有的数据增加权值,距离 x 越近的点,权值越大,对构建模型的贡献也越大。下面具体介绍一下该算法。

    算法思想

    在介绍之前,先来看一下线性回归的预测步骤:

    1. 找到使损失函数 J(θ)=i=1m(y(i)θTx(i))2J(\theta)= \sum_{i = 1}^m{(y^{(i)} - \theta^Tx^{(i)})}^2最小的 θ\theta 值。
    2. 输出 θTx\theta^Tx。其中 x 是要预测的变量值。

    局部加权回归也是一样的步骤,只不过增加了权值:

    1. 找到使损失函数 J(θ)=i=1mw(i)(y(i)θTx(i))2J(\theta)= \sum_{i = 1}^mw^{(i)}{(y^{(i)} - \theta^Tx^{(i)})}^2最小的 θ\theta 值。
    2. 输出 θTx\theta^Tx。其中 x 是要预测的变量值。

    在这里,我们利用 w(i)w^{(i)} 来控制数据点对损失函数的影响,距离输入变量 x 越远的点,权值越小,对损失函数的贡献也就越小。通常情况下,我们定义权值 w 是有一定的规律,即:
    w(i)=exp((x(i)x)22τ2)w^{(i)} = exp(-\frac{{(x^{(i)} - x)} ^ 2}{2\tau^2})

    该函数被称为指数衰减函数,很像高斯分布,但并不是高斯分布。这里的 τ\tau 是波长参数,用来控制权值 ww 的下降速率的,越大的话,权值下降越快,函数的形状也就越“瘦”。

    总结

    相比于线性回归,该算法最大的缺点就是每次预测 x 的值,都需要重新遍历一遍数据集进行建模。每次建立的模型只能对一个 x 有效,这就导致一个问题,当我们需要预测大量数据的时候,就要建立大量的模型,这会导致效率变得很低。

    展开全文
  • 首先,选择不同窗宽作相应的局部线性估计,然后利用这些估计构造参数回归模型,由此给出回归函数的参数估计.相对于局部线性估计,新方法在不改变方差阶的情况下,将估计偏差的阶由h2减小至h4,最优均方收敛速度提高...
  • 原文链接:http://tecdat.cn/?p=14121 本文将分析了几种用于制定保险费率的平滑技术。 保费没有细分 该价格应与纯溢价相关,而纯溢价与频率成正比,因为
  • 非参数回归-局部回归

    千次阅读 2019-09-25 18:42:29
    ### 局部回归模型: model=loess(y_l~x_l,control = loess.control(surface = "direct"),degree=2) predictions1(model,x_l)   # 绘图 plot(x_l,y_l,pch=19) x1(x_l) nr(x1) x_arr(1:nr) y_...
  • 局部加权回归 局部加权回归原理:对于一般训练集: 参数系统为:线性模型为: 线性回归损失函数:J(θ) 局部加权回归的损失函数:在我们原始的线性回归中,对于输入变量,我们要预测,通常要做: 而对于局部...
  • 预测回归二:局部加权回归和惩罚线性回归 预测回归二:局部加权回归和惩罚线性回归 一、局部加权回归 原理 python 代码实现 二、惩罚线性回归 2.1 岭回归 2.2 lasso 缩减法 2.3 ElasticNet 形式化 2.4 求解...
  • 变系数回归模型误差具有自回归结构时,基于重新改写具有自回归误差的变系数回归模型为独立误差的变系数回归模型,文章提出其局部线性估计方法。模拟结果显示该估计方法是有效的。
  • 基于EM算法和完全数据对数似然的条件期望,分别研究了ZIP回归模型在加权扰动、解释变量扰动和响应变量扰动下的局部影响诊断问题,得到了相应的诊断统计量。最后通过一个实例说明诊断统计量的有效性。
  • 上周讲专题时做的ppt
  • 讨论了变系数回归模型的系数函数的佑计问题。在通常的局部M一回归方法基拙上嵌入-个变窗宽对模型的系数函数进行了佑计,并在样本独立同分布的情况下,讨论了系数函数佑计的弱相合性和渐近正态性,最后,给出了佑计的渐近...
  • 在上一节中主要介绍了监督学习中的线性回归模型)、最小二乘法(策略)、梯度下降法(算法)及线性最小二乘法的标准方程(闭式解)。 这节主要介绍两个回归局部加权回归与逻辑回归,其中穿插一些小的知识点:...
  • 局部加权线性回归线性回归的一个问题是有可能出现欠拟合,因为它求的是具有最小均方误差的无偏估计,显然模型欠拟合将无法做出很好的回归预测,所以有些方法允许在估计中引入一些偏差,从而降低预测的均方误差。局部...
  • 本文主要研究非参数异方差回归模型局部多项式估计问题.首先利用局部线性逼近的技巧,得到了回归均值函数的局部极大似然估计.然后,考虑到回归方差函数的非负性,利用局部对数多项式拟合,得到了方差函数的局部多项式...
  • 对于非参数回归模型夕=m(z)+ε,在局部线性估计中窗宽h的先验分布为Gamma分布的条件下,用未知光滑函数m(x)的后验均值构造了它的贝叶斯估计,并给出了参数的后验分布和抽样方法。模拟算例证明了贝叶斯局部线性...
  • 前面我们介绍了最基础的线性回归算法,也提到了它容易出现欠拟合的现象。那么,本文的局部加权线性回归将解决这个欠拟合问题。我觉得这个思路具有很好的迁移性,咱们一起好好看看。
  • k=0.1时,训练集上的误差为: 56.78868743050092 k=1时,训练集上的误差为: 429.89056187038 k=10时,训练集上的误差为: 549.1181708827924 k=0.1时,测试集上的误差为...简单线性回归时的误差为: 518.6363153245542

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 44,716
精华内容 17,886
关键字:

局部回归模型