加权最小二乘回归方法的程序实现范例

news/2024/7/10 4:07:16 标签: 数据, 优化, 数据挖掘

      加权最小二乘回归方法-程序范例

在一般的线性回归求相关系数时候,大都选择最小二乘回归分析方法来拟合。它的原理是:假设拟合方程为:,将实测值Yi与预测值(Yj=a0+a1X)的离差(Yi-Yj)的平方和最小作为“优化判据”,那么对a0、a1求偏导数,令这两个偏导数等于零:

a0 = ∑Yi) / n - a1∑Xi) / n

a1 = [n∑(Xi Yi) –(∑Xi∑Yi)] / [n∑(Xi^2) – (∑Xi)^2 )]

 

或者用最小二乘公式推理如下:

X-X(Y-Y=∑XY-XY-XY+XY

=∑XY-X∑Y-Y∑X+nXY=∑XY-nXY-nXY+nXY=∑XY-nXY

 

X -X2=∑X2-2XX+X2)=∑X2-2X∑X+nX2=∑X2-2nX2+nX2

=∑X2-nX2

(1) K=X-X(Y-Y/∑X -X2=(∑XY-nXY) /(∑X2-nX2)

(2) b=Y-kX

 

1)原理解决后,就是代码了,参考一个气候模型中回归函数的代码,主要目的是解决下一个问题:加权回归。

float regression(float  z[],float  temp[], intndata)

{

 float  sz, st;

 float   sz_media, st_media, sz_acum,st_minus_st_media, sz_minus_sz_media;

 int i;

 

float beta0=0.0;

 floatbeta1=0.0;

 

 sz=0.0;

 st=0.0;

 

 for(i=0;i<ndata;i++)

   {

     sz += z[i];

     st += temp[i];

   }

 

 /*sz_media =sz/ndata;*/

 sz_media=sz;

 st_media=st;

 //st_media =st/ndata;

 sz_acum = 0.0;

//printf("\n sz = %f,  st = %f,sz_media = %f, st_media = %f", sz, st, sz_media, st_media );

 for(i=0;i<ndata;i++)

  {

     sz_minus_sz_media = z[i]- sz_media;

     sz_acum += (sz_minus_sz_media *sz_minus_sz_media) ;

     st_minus_st_media = temp[i]- st_media;

     beta1 += (sz_minus_sz_media *st_minus_st_media);

   }

 

 beta1 /= ( sz_acum);

 

 beta0 = st_media - beta1 * sz_media;

 

//printf("\n beta0 = %f,  beta1 =%f", *beta0, *beta1);

 

 return beta1;

}

 

2)在需要考虑到不同数据对线性回归影响大小,比如分析浓度与检测峰值的回归关系的时候,浓度越大的数据样本对建模回归结果影响较大;在求解温度递减率的时候,温差大的数据站点的影响力度要大。所以简单最小二乘回归要考虑单个样本的权重大小。如何在程序中加入权重w数组。仔细对比下面代码和上面的,就可以了解如何处理。PS:权重大小用小数表示,权重总和是1。

float regression(floatz[],float temp[],float weight[],int ndata)

{

    float  sz, st;floatsw;float beta1=0.0;floatbeta0=0.0;

    float   sz_media, st_media, sz_acum,st_minus_st_media, sz_minus_sz_media;

    int i;

 

 

    sz=0.0;

    st=0.0;

 

    for(i=0;i<ndata;i++)

    {

        sz += weight[i]*z[i];

        st += weight[i]*temp[i];

    }

 

    //sz_media =sz/ndata;

    sz_media = sz;

    //st_media =st/ndata;

    st_media = st;

    sz_acum = 0.0;

    // printf("\nsz = %f,  st = %f, sz_media = %f,st_media = %f", sz, st, sz_media, st_media );

    for(i=0;i<ndata;i++)

    {

        sz_minus_sz_media = z[i]- sz_media;

        sz_acum += weight[i]*(sz_minus_sz_media* sz_minus_sz_media) ;

        st_minus_st_media = temp[i]- st_media;

        beta1 += weight[i]*(sz_minus_sz_media *st_minus_st_media);

    }

 

    beta1 /= sz_acum;

 

    beta0 = st_media - beta1 * sz_media;

 

    // printf("\nbeta0 = %f,  beta1 = %f", *beta0,*beta1);

 

    returnbeta1;

 

 

}

 


http://www.niftyadmin.cn/n/1318172.html

相关文章

jsonp跨域请求数据实例—手机号码查询

网上有很多开放的api&#xff0c;我们在本地通过ajax获取数据时&#xff0c;总会碰到一个问题&#xff0c;那就是跨域&#xff01;如果不借助php等&#xff0c;仅仅通过js怎么解决跨域的问题呢&#xff1f;或许jsonp是个不错的选择。 实例运行效果&#xff1a; 源代码&#xff…

基于GDAL的栅格图像空间插值预处理——C语言版

基于GDAL的栅格图像预处理 前言 栅格数据和矢量数据构成空间数据的主要来源&#xff0c;怎样以开源方式读取并处理这些空间数据&#xff1f;目前有多种开源支持包&#xff0c;这里只介绍GDAL包。GDAL包的优点是支持库简洁、支持栅格和矢量、与多种开发平台结合。OpenGis方式读…

hdu 3339 In Action

http://acm.hdu.edu.cn/showproblem.php?pid3339 这道题就是dijkstra01背包&#xff0c;先求一遍最短路&#xff0c;再用01背包求。 1 #include <cstdio>2 #include <cstring>3 #include <algorithm>4 #define maxn 1000005 using namespace std;6 const in…

JavaScript深入浅出学习笔记(四)—对象

对象中包含一系列属性&#xff0c;这些属性是无序的。每个属性都有一个字符串key和对应的value。 var obj {}; obj[1] 1; obj[1] 2; obj;//Object{1:2}obj[{}] true; obj[{x:1}] true; obj;//Object{1:2,[object Object]:true} 一.创建对象 1.字面量 var obj1 {x:1,y:2};…

使用GDAL下载并转换SRTM的DEM数据

怎样批量下载数据是苦逼学生的比较关注的问题&#xff0c;发现一篇批量下载SRTM的好文章&#xff0c;转载分享。 感谢箜_Kong博主&#xff0c;原文链接http://blog.csdn.net/liminlu0314/article/details/8068715 有时候需要用到DEM数据&#xff0c;常用的免费的DEM数据就是SRT…

Java安全—Java实现消息摘要算法加密

一.概述 我们打开Apache的官网的如下页面&#xff0c;可以看到md5&#xff0c;点击md5的超链接&#xff0c;在新打开的页面将看到一串字符串&#xff0c;即是MD5的消息摘要。 消息摘要算法有&#xff1a;MD&#xff08;Message Digest&#xff09;、SHA(Secure Hash Algorithm)…

箴言录2014年4月22日

入一行&#xff0c;先别惦记着赚钱&#xff0c;先学着让自己值钱。把自己提升到更高的平台面&#xff0c;赚钱才更容易。做的越少&#xff0c;价值越低&#xff0c;没有哪个行业的钱是好赚的。多付出&#xff0c;你会发现 受益的是你自己。赚不到钱&#xff0c;赚知识&#xff…

SQLServer存储过程之筛选、更新、分组简记

在SQLserver中&#xff0c;一般写一些存储过程能提高数据库操作效率。简单记录几个存储过程&#xff0c;以备查询。 一、利用一个字段进行分组求平均值、最大值、最小值&#xff1b; USE [Mengtougou] GO /****** Object: StoredProcedure [dbo].[extracter_Site_651031] …