加权最小二乘回归方法的程序实现范例
来源:互联网 发布:unirx 响应式编程 编辑:程序博客网 时间:2024/05/17 07:47
加权最小二乘回归方法-程序范例
在一般的线性回归求相关系数时候,大都选择最小二乘回归分析方法来拟合。它的原理是:假设拟合方程为:,将实测值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-X平Y-XY平+X平Y平)
=∑XY-X平∑Y-Y平∑X+nX平Y平=∑XY-nX平Y平-nX平Y平+nX平Y平=∑XY-nX平Y平;
∑(X -X平)2=∑(X2-2XX平+X平2)=∑X2-2X平∑X+nX平2=∑X2-2nX平2+nX平2
=∑X2-nX平2;
(1) K=∑(X-X平)(Y-Y平)/∑(X -X平)2=(∑XY-nX平Y平) /(∑X2-nX平2)
(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;
}
- 加权最小二乘回归方法的程序实现范例
- 最小二乘和加权最小二乘的原理与实现
- 偏最小二乘回归(PLS)的MATLAB实现
- 最小二乘回归树Python实现
- 5、spss做加权最小二乘回归及岭回归
- 加权最小二乘滤波算法原理及实现
- 最小二乘回归
- 最小二乘回归
- 161206 - Ordinary least square, ridge regression and weighted least square 最小二乘,岭回归,加权最小二乘
- 《机器学习实战》学习笔记-[9]-回归-加权最小二乘LWLR
- 局部加权回归、最小二乘的概率解释、逻辑斯蒂回归、感知器算法——斯坦福ML公开课笔记3
- 【图像处理】加权最小二乘滤波器
- IRLS 迭代加权最小二乘
- 偏最小二乘回归
- 演示如何使用偏最小二乘回归方法
- 偏最小二乘回归方法r语言代码
- CART—最小二乘回归树Python实现
- 最小二乘回归树Golang多线程实现
- 把对数据库的查询结果封装在List中
- java中for(type element:array)语法
- UINavigationController各种注意点
- “全员编程,广泛嵌入”(五)—— 物联网时代(三)
- ITK-Snap3.2.0 Build 编译 VS2013
- 加权最小二乘回归方法的程序实现范例
- Word 统一修改 Mathtype尺寸
- Bug终结者之Reveal的使用
- CORAB 对 ior 文件的解析使用
- 职场前辈对实习生的谆告
- 关于machine.config的那些事儿
- maven本地jar依赖
- GYP 简介——与cmake比较
- HDU -- 3849 By Recognizing These Guys, We Find Social Networks Useful(双连通 求割边)