Statistic.inl
上传用户:fxromeo
上传日期:2010-04-08
资源大小:89k
文件大小:9k
开发平台:

Visual C++

  1. //Statistic.inl 数据处理与回归分析头文件
  2. // Ver 1.0.0.0
  3. // 版权所有(C) 何渝, 2002
  4. // 最后修改: 2002.5.31.
  5. #ifndef _STATISTIC_INL //避免多次编译
  6. #define _STATISTIC_INL
  7. //随机样本分析
  8. template <class _Ty>
  9. void StatRandomSample(valarray<_Ty>& x, _Ty x0, _Ty h, int l, 
  10. valarray<_Ty>& dt, valarray<int>& g, valarray<int>& q)
  11. {
  12.     char a[50];
  13. int n = x.size(); //随机样本点数
  14. int m = g.size(); //直方图中区间总数
  15.     dt[0] = 0;
  16.     for(int i=0; i<n; i++) dt[0]=dt[0]+x[i]/n;
  17.     dt[1] = 0;
  18.     for(i=0; i<n; i++)
  19.       dt[1] = dt[1] + (x[i] - dt[0]) * (x[i] - dt[0]);
  20.     dt[1] = dt[1] / n;
  21.     dt[2] = sqrt(dt[1]);
  22.     for(i=0; i<m; i++)
  23.     {
  24. q[i]=0;
  25.         _Ty s=x0+(i+0.5)*h-dt[0];
  26.         s=exp(-s*s/(2.0*dt[1]));
  27.         g[i]=n*s*h/(dt[2]*2.5066);
  28.     }
  29.     _Ty s=x0+m*h;
  30.     for(i=0; i<n; i++)
  31. if((x[i] - x0) > 0 || FloatEqual((x[i]-x0), 0))
  32.         if((s - x[i]) > 0 || FloatEqual((s-x[i]), 0))
  33.         {
  34. int j = (x[i] - x0) / h;
  35.             q[j] = q[j] + 1;
  36.         }
  37.     if (l==0) return; //不打印直方图
  38.     cout << endl << "n = " << n << endl;
  39.     cout << endl << "x0 = " << x0 << "t h = " << h << "t m = " << m << endl;
  40.     cout << endl << "xa = " << dt[0] << "t s = " << dt[1];
  41. cout << "t t = " << dt[2] << endl << endl;
  42.     int k = 1;
  43. int z = 0;
  44.     for (i=0; i<m; i++)   if (q[i]>z) z=q[i];
  45.     while(z>50)
  46.     {
  47. z=z/2;
  48. k=2*k;
  49. }
  50.     for(i=0; i<m; i++)
  51.     {
  52. s=x0+(i+0.5)*h;
  53.         for (int j=0; j<=49; j++) a[j]=' ';
  54.         j=q[i]/k;
  55.         for(z=0; z<j; z++) a[z]='X';
  56.         j = g[i]/k;
  57.         if((j>0) && (j<=50)) a[j] = '*';
  58. cout << s << "t" << q[i] << "t" ;
  59.         for (j=0; j<50; j++)
  60. cout << a[j];
  61.         cout << endl;
  62.     }
  63.     cout << endl << "k = " << k << endl;
  64.     cout << endl;
  65. return; //正常结束程序
  66. }
  67. //一元线性回归分析
  68. template <class _Ty>
  69. void LinearRegression1D(valarray<_Ty>& x, valarray<_Ty>& y, 
  70. valarray<_Ty>& a, valarray<_Ty>& dt)
  71. {
  72. _Ty xx(0), yy(0), e(0), f(0), u(0), p(0), umax(0), umin(1.0e+30);
  73. int n = x.size(); //观测点数
  74.     for(int i=0; i<n; i++)
  75.     {
  76. xx=xx+x[i]/n;
  77. yy=yy+y[i]/n;
  78. }
  79.     
  80.     for(i=0; i<n; i++)
  81.     {
  82. _Ty q=x[i]-xx;
  83. e=e+q*q;
  84.         f=f+q*(y[i]-yy);
  85.     }
  86.     a[1]=f/e;
  87. a[0]=yy-a[1]*xx;
  88.     _Ty q=0.0;
  89.     for(i=0; i<n; i++)
  90.     {
  91. _Ty s=a[1]*x[i]+a[0];
  92.         q=q+(y[i]-s)*(y[i]-s);
  93.         p=p+(s-yy)*(s-yy);
  94.         e=fabs(y[i]-s);
  95.         if (e>umax) umax=e;
  96.         if (e<umin) umin=e;
  97.         u=u+e/n;
  98.     }
  99.     dt[1]=sqrt(q/n);
  100.     dt[0]=q;
  101. dt[2]=p;
  102.     dt[3]=umax;
  103. dt[4]=umin;
  104. dt[5]=u;
  105. }
  106. //n元线性回归分析
  107. template <class _Ty>
  108. void LinearRegressionND(matrix<_Ty>& x, valarray<_Ty>& y, 
  109. valarray<_Ty>& a, valarray<_Ty>& dt, valarray<_Ty>& v)
  110. {
  111. int m = x.GetRowNum(); //自变量个数
  112. int n = x.GetColNum(); //观测数据的组数
  113. //为调用平方根法求解对称正定方程组函数准备,其两参数须matrix类型
  114. matrix<_Ty> b((m+1),(m+1));
  115. matrix<_Ty> aa(m+1,1);
  116. for(int i=0;i<m+1;i++) aa(i,0) = a[i];
  117.     int mm = m + 1;
  118. b(m, m) = n;
  119.     for(int j=0; j<m; j++)
  120.     {
  121. _Ty p(0);
  122.         for(int i=0; i<n; i++) p = p + x(j,i);
  123. b(m,j) = p;
  124. b(j,m) = p;
  125.     }
  126.     for(i=0; i<m; i++)
  127.       for(j=i; j<m; j++)
  128.       {
  129.   _Ty p(0);
  130.           for(int k=0; k<n; k++) p=p+x(i,k)*x(j,k);
  131.   b(j,i) = p;
  132.   b(i,j) = p;
  133.       }
  134. aa(m,0) = 0.0;
  135.     for(i=0; i<n; i++) aa(m,0) += y[i];
  136.     for(i=0; i<m; i++)
  137.     {
  138. aa(i,0) = 0.0;
  139. for(j=0; j<n; j++) aa(i,0) = aa(i,0) + x(i,j) * y[j];
  140.     }
  141. //调用平方根法求解对称正定方程组的函数
  142.     if(LE_SymmetryRegularEuationSquareRoot(b,aa)<1)
  143. {
  144. cout << "Matrix is not Symmetry and Regular!" << endl;
  145. return;
  146. }
  147.     
  148. _Ty yy(0);
  149.     for (i=0; i<n; i++) yy = yy + y[i] / n;
  150.     _Ty q(0), e(0), u(0);
  151.     for(i=0; i<n; i++)
  152.     {
  153. _Ty p = aa(m,0);
  154. for(j=0; j<m; j++) p = p + aa(j,0) * x(j,i);
  155.         q=q+(y[i]-p)*(y[i]-p);
  156.         e=e+(y[i]-yy)*(y[i]-yy);
  157.         u=u+(yy-p)*(yy-p);
  158.     }
  159.     _Ty s = sqrt(q/n);
  160.     _Ty r = sqrt(1.0-q/e);
  161.     for(j=0; j<m; j++)
  162.     {
  163. _Ty p(0);
  164.         for (i=0; i<n; i++)
  165.         {
  166. _Ty pp = aa(m,0);
  167.             for(int k=0; k<m; k++)
  168.               if(k!=j) pp = pp + aa(k,0) * x(k,i);
  169.             p = p + (y[i] - pp) * (y[i] - pp);
  170.         }
  171.         v[j] = sqrt(1.0 - q / p);
  172.     }
  173.     dt[0] = q;
  174. dt[1] = s;
  175. dt[2] = r;
  176. dt[3] = u;
  177. for(i=0; i<m+1; i++) a[i] = aa(i,0);
  178. }
  179. //逐步回归分析
  180. template <class _Ty>
  181. void StepwiseRegression(matrix<_Ty>& x, _Ty f1, _Ty f2, 
  182. _Ty eps, valarray<_Ty>& xx, valarray<_Ty>& b, valarray<_Ty>& v, 
  183. valarray<_Ty>& s, valarray<_Ty>& dt, valarray<_Ty>& ye, 
  184. valarray<_Ty>& yr, matrix<_Ty>& r)
  185. {
  186. int ii,l;
  187.     _Ty phi,sd,fmi,fmx;
  188. int k = x.GetRowNum(); //观测点数
  189. int n = x.GetColNum()-1; //自变量x的个数
  190.     int m = n + 1;
  191. _Ty q(0);
  192.     for(int j=0; j<=n; j++)
  193.     {
  194. _Ty z(0);
  195.         for(int i=0; i<k; i++) z = z + x(i,j) / k;
  196.         xx[j] = z;
  197.     }
  198.     for(int i=0; i<=n; i++)
  199.       for(j=0; j<=i; j++)
  200.       {
  201.   _Ty z(0);
  202.           for(ii=0; ii<k; ii++)
  203.   z = z + (x(ii,i) - xx[i]) * (x(ii,j) - xx[j]);
  204.           r(i,j) = z;
  205.       }
  206.     for(i=0; i<=n; i++) ye[i]=sqrt(r(i,i));
  207.     for (i=0; i<=n; i++)
  208.       for (j=0; j<=i; j++)
  209.       {
  210.   r(i,j) = r(i,j) / (ye[i] * ye[j]);
  211.           r(j,i) = r(i,j);
  212.       }
  213.     phi = k - 1.0;
  214.     sd = ye[n] / sqrt(k-1.0);
  215.     int it(1);
  216.     while(it==1)
  217.     {
  218. it = 0;
  219. _Ty vmi(1.0e+35), vmx(0);
  220.         int imi(-1), imx(-1);
  221.         for(i=0; i<=n; i++)
  222.         {
  223. v[i]=0.0;
  224. b[i]=0.0;
  225. s[i]=0.0;
  226. }
  227.         for(i=0; i<n; i++)
  228.           if(r(i,i) > eps || FloatEqual(r(i,i),eps))
  229.            {
  230.   v[i] = r(i,n) * r(n,i) / r(i,i);
  231.               if (v[i] > 0.0 || FloatEqual(v[i],0))
  232.               { 
  233.   if(v[i]>vmx)
  234.                   {
  235. vmx=v[i];
  236. imx=i;
  237.   }
  238.               }
  239.               else
  240.               {
  241.   b[i] = r(i,n) * ye[n] / ye[i];
  242.                   s[i] = sqrt(r(i,i)) * sd / ye[i];
  243.                   if(Abs(v[i])<vmi)
  244.                   {
  245.   vmi=Abs(v[i]);
  246.   imi=i;
  247.   }
  248.               }
  249.           }
  250.         if(phi!=n-1.0)
  251.         {
  252. _Ty z(0);
  253.             for (i=0; i<n; i++) z = z + b[i] * xx[i];
  254.             b[n] = xx[n] - z;
  255. s[n] = sd;
  256. v[n] = q;
  257.         }
  258.         else
  259.         {
  260. b[n]=xx[n];
  261. s[n]=sd;
  262. }
  263.         fmi = vmi * phi / r(n,n);
  264.         fmx = (phi-1.0) * vmx / (r(n,n)-vmx);
  265.         if((fmi<f2)||(fmx>=f1))
  266.         {
  267. if(fmi<f2)
  268.             {
  269. phi=phi+1.0;
  270. l=imi;
  271. }
  272.             else
  273.             {
  274. phi=phi-1.0;
  275. l=imx;
  276. }
  277.             for(i=0; i<=n; i++)
  278.               if (i!=l)
  279.                 for (j=0; j<=n; j++)
  280.                   if (j!=l)
  281.                     r(i,j)=r(i,j)-(r(l,j)/r(l,l))*r(i,l);
  282.             for(j=0; j<=n; j++)
  283.               if(j!=l)
  284.                 r(l,j)=r(l,j)/r(l,l);
  285.             for(i=0; i<=n; i++)
  286.               if(i!=l)
  287.                 r(i,l)=-r(i,l)/r(l,l);
  288.             r(l,l)=1.0/r(l,l);
  289.             q=r(n,n)*ye[n]*ye[n];
  290.             sd=sqrt(r(n,n)/phi)*ye[n];
  291.             dt[0]=sqrt(1.0-r(n,n));
  292.             dt[1]=(phi*(1.0-r(n,n)))/((k-phi-1.0)*r(n,n));
  293.             it=1;
  294.         }
  295.     }
  296.     for(i=0; i<k; i++)
  297.     {
  298. _Ty z(0);
  299.         for(j=0; j<n; j++) z=z+b[j]*x(i,j);
  300.         ye[i]=b[n]+z; 
  301. yr[i]=x(i,n)-ye[i];
  302.     }
  303. }
  304. //半对数数据相关
  305. template <class _Ty>
  306. void HalfLogarithmCorrelation(valarray<_Ty>& x, valarray<_Ty>& y, 
  307. _Ty t, valarray<_Ty>& a)
  308. {
  309. _Ty xx(0), yy(0), dx(0), dxy(0);
  310. int n = x.size(); //数据点数
  311.     for(int i=0; i<n; i++)
  312.     {
  313. xx = xx + x[i] / n; 
  314.         yy = yy + log(y[i]) / log(t) / n;
  315.     }
  316.     
  317.     for(i=0; i<n; i++)
  318.     {
  319. a[2] = x[i] - xx; 
  320. dx = dx + a[2] * a[2];
  321.         dxy = dxy + a[2] * (log(y[i]) / log(t) - yy);
  322.     }
  323.     a[1] = dxy / dx;
  324. a[0] = yy - a[1] * xx;
  325.     a[0] = a[0] * log(t); 
  326. a[0] = exp(a[0]);
  327.     a[2] = a[6] = a[4] = 0.0;
  328. a[5] = 1.0e+30;
  329.     for(i=0; i<n; i++)
  330.     {
  331. a[3] = a[1] * x[i] * log(t);
  332. a[3] = a[0] * exp(a[3]);
  333.         a[2] = a[2] + (y[i] - a[3]) * (y[i] - a[3]);
  334.         dx = Abs(y[i] - a[3]);
  335.         if(dx>a[4]) a[4] = dx;
  336.         if(dx<a[5]) a[5] = dx;
  337.         a[6] = a[6] + dx / n;
  338.     }
  339.     a[3] = sqrt(a[2] / n);
  340. }
  341. //对数数据相关
  342. template <class _Ty>
  343. void LogarithmCorrelation(valarray<_Ty>& x, 
  344. valarray<_Ty>& y, valarray<_Ty>& a)
  345. {
  346. _Ty xx(0), yy(0), dx(0), dxy(0);
  347. int n = x.size(); //数据点数
  348.     for(int i=0; i<n; i++)
  349.     {
  350. xx = xx + log(x[i]) / n; 
  351.         yy = yy + log(y[i]) / n;
  352.     }
  353.     
  354.     for(i=0; i<n; i++)
  355.     {
  356. a[2] = log(x[i]) - xx; 
  357. dx = dx + a[2] * a[2];
  358.         dxy = dxy + a[2] * (log(y[i]) - yy);
  359.     }
  360. a[1] = dxy / dx;
  361. a[0] = yy - a[1] * xx;
  362. a[0] = exp(a[0]);
  363.     a[2] = a[6] = a[4] = 0.0;
  364. a[5] = 1.0e+30;
  365.     for(i=0; i<n; i++)
  366.     {
  367. a[3] = a[1] * log(x[i]);
  368. a[3] = a[0] * exp(a[3]);
  369.         a[2] = a[2] + (y[i] - a[3]) * (y[i] - a[3]);
  370.         dx = Abs(y[i] - a[3]);
  371.         if(dx>a[4]) a[4] = dx;
  372.         if(dx<a[5]) a[5] = dx;
  373.         a[6] = a[6] + dx / n;
  374.     }
  375.     a[3] = sqrt(a[2] / n);
  376. }
  377. #endif // _STATISTIC_INL