C言語を使って最小二乗法で回帰直線を求めたいのですが、分かりません。
今ここまで書けております。
C
1#include <stdio.h> 2#include <math.h> 3 4double total(double *x, int n) 5{ 6 int j; 7 double ans=0.0; 8 for (j=0;j<n;j++){ 9 ans+=x[j]; 10 } 11 return ans; 12} 13double lsm(double *x, double *y, int n, double *a, double *b) 14{ 15 //Least square method 16 int j; 17 double xy[n],x2[n],y2[n]; 18 double xsum,ysum,xysum,x2sum,y2sum; 19 double denom,cc; 20 for (j=0;j<n;j++){ 21 xy[j]=x[j]*y[j]; 22 x2[j]=x[j]*x[j]; 23 y2[j]=y[j]*y[j]; 24 } 25 xsum=total(x,n); 26 ysum=total(y,n); 27 xysum=total(xy,n); 28 x2sum=total(x2,n); 29 y2sum=total(y2,n); 30 denom=n*x2sum-xsum*xsum; 31 (*a)=(n*xysum-xsum*ysum)/denom; 32 (*b)=(x2sum*ysum-xysum*xsum)/denom; 33 //Correlation coefficient 34 denom=sqrt((n*x2sum-xsum*xsum)*(n*y2sum-ysum*ysum)); 35 cc=(n*xysum-xsum*ysum)/denom; 36 return cc; 37} 38 39int main(void){ 40 // Your code here! 41 // lwsson 11-1 42 double x[10]={1,2,3,4,5,6,7,8,9,10}; 43 double y[10]={10.083,5.760,34.672,11.894,42.462, 44 37.928,17.584,54.281,61.774,74.931}; 45 46 double a,b,c; // Regression line y=ax+b. c=cor. coef. 47 c=lsm(x,y,10,&a,&b); 48 printf("y = (%f)x + (%f)\n",a,b); 49 printf("Correlation coefficient = %f\n" ,c); 50}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/21 02:40
2020/12/24 14:24