信贷征信机构:谁有偏最小二乘法的源码能不能提供一份

来源:百度文库 编辑:中科新闻网 时间:2024/05/10 12:23:48
要分可以再加。现在时间比较紧,来不及自己编了。

很感谢emc2_zx的回答,但我要的是偏最小二乘法源码,与最小二乘法还是不太一样的。不知道你手头有没有

最小二乘法
设经验方程是y=F(x),方程中含有一些待定系数an,给出真实值{(xi,yi)|i=1,2,...n},将这些x,y值代入方程然后作差,可以描述误差:yi-F(xi),为了考虑整体的误差,可以取平方和,之所以要平方是考虑到误差可正可负直接相加可以相互抵消,所以记误差为:

e=∑(yi-F(xi))^2

它是一个多元函数,有an共n个未知量,现在要求的是最小值。所以必然满足对各变量的偏导等于0,于是得到n个方程:

de/da1=0
de/da2=0
...
de/dan=0

n个方程确定n个未知量为常量是理论上可以解出来的。用这种误差分析的方法进行回归方程的方法就是最小二乘法。

线性回归
如果经验方程是线性的,形如y=ax+b,就是线性回归。按上面的分析,误差函数为:

e=∑(yi-axi-b)^2

各偏导为:

de/da=2∑(yi-axi-b)xi=0
de/db=-2∑(yi-axi-b)=0

于是得到关于a,b的线性方程组:

(∑xi^2)a+(∑xi)b=∑yixi
(∑xi)a+nb=∑yi

设A=∑xi^2,B=∑xi,C=∑yixi,D=∑yi,则方程化为:

Aa+Bb=C
Ba+nb=D

解出a,b得:

a=(Cn-BD)/(An-BB)
b=(AD-CB)/(An-BB)

C++程序:

#include
#include
void main()
{
double x,y,A=0.0,B=0.0,C=0.0,D=0.0,delta;
int n;
cin>>n;
for(int i=0;i<n;++i)
{
cin>>x>>y;
A+=x*x;
B+=x;
C+=x*y;
D+=y;
}
delta=A*n-B*B;
if(fabs(delta)<1e-10)
{
cerr<<"Error!Divide by zero"<<endl;
}
else
{
cout<<"a="<<((C*n-B*D)/delta)<<endl
<<"b="<<((A*D-C*D)/delta)<<endl;
}
}

不知道能不能用