c語言線性回歸
⑴ 求一元線性回歸分析的c語言代碼
//利用最小二乘法進行線形擬合
#include"stdio.h"
#include"math.h"
#define max_size 100
void main()
{
float data[max_size][2];
//用data數組來存放x,y的值.
float x_sum=0,y_sum=0;
float x_avg,y_avg;
float x,y;
float Lxy=0,Lxx=0,Lyy=0;
float r;
float a,b;
int i;
int count=0;
next:
printf("輸入至少2組x,y的值,輸入格式為 x,y");
printf("輸入 -999,-999 表示輸入結束!\n");
while(1)
{
scanf("%f,%f",&x,&y);
//實數最好不直接用"=="或"!="比較大小。
if(fabs(x+999)==0&&fabs(y+999)==0) break;
data[count][0]=x;
data[count][1]=y;
count++;
}
for(i=0;i<count;i++)
{
x_sum=data[i][0]+x_sum;
y_sum=data[i][1]+y_sum;
}
x_avg=x_sum/count;
y_avg=y_sum/count;
for(i=0;i<count;i++)
{
Lxy=(data[i][0]-x_avg)*(data[i][1]-y_avg)+Lxy;
Lxx=(data[i][0]-x_avg)*(data[i][0]-x_avg)+Lxx;
Lyy=(data[i][1]-y_avg)*(data[i][1]-y_avg)+Lyy;
}
//r用於計算相關系數,相關系數越接近1,表示相關性越好.
r=Lxy/sqrt(Lxx*Lyy);
if(r>0.5)
{
printf("數據的線形關系較好。\n");
a=Lxy/Lxx;
b=y_avg-a*x_avg;
}
else
{
printf("數據的線形關系不好!請重新輸入數據!\n");
goto next;
}
printf("線形擬合的結果為:\n");
if(fabs(b)==0)
printf("y=%3.1fx\n",a);
else if(b>0)
printf("y=%3.1fx+%3.2f\n",a,b);
else if(b<0)
printf("y=%3.1fx%3.2f\n",a,b);
printf("相關系數為:%3.1f\n",r);
}
⑵ 急!!!關於C語言編程 線性回歸法建立數學模型
就是二分法查找法:
k跟數組的中間的元素temp比較,確定在哪部分,若k>temp1,則再跟後部分數組的中間元素temp2比較.否則跟前部分數組的中間元素temp2。循環下去。直到中間元素等於k;
就是循環確定區間再比較再確定區間. 當然演算法再優化一下
⑶ 急求一元線性回歸的C語言程序!!!
#include<math.h>
#include<stdio.h>
#include<stdlib.h>
voidanalysis(double*x,double*y,intn){
doubled1,d2,d3,a,b;
doublesumx,sumy,sumxx,sumyy,sumxy,mx,my,mxx,myy,mxy;
inti;
//變數的初始化
d1=d2=d3=sumx=sumy=sumxx=sumyy=sumxy=0.0;
//計算x、y的平均值
for(i=0;i<n;i++){
sumx+=x[i];
sumy+=y[i];
}
mx=sumx/n;
my=sumy/n;
printf("mx=%fmy=%f ",mx,my);
//計算x、y平和x*y的平均值
for(i=0;i<n;i++){
sumxx+=x[i]*x[i];
sumyy+=y[i]*y[i];
sumxy+=x[i]*y[i];
}
mxx=sumxx/n;
myy=sumyy/n;
mxy=sumxy/n;
printf("mxx=%fmyy=%fmxy=%f ",mxx,myy,mxy);
//
a=(n*sumxy-sumx*sumy)/(n*sumxx-sumx*sumx);
b=(sumxx*sumy-sumx*sumxy)/(n*sumxx-sumx*sumx);
printf("a=%fb=%f ",a,b);
//計算相關系數的數據組成部分
for(i=0;i<n;i++){
d1+=(x[i]-mx)*(y[i]-my);
d2+=(x[i]-mx)*(x[i]-mx);
d3+=(y[i]-my)*(y[i]-my);
}
doubler=d1/sqrt(d2*d3);
//
printf("相關系數r=%f ",r);
//
double*yy=(double*)malloc(sizeof(double)*n);
doublesumerrorsquare=0,error;
for(i=0;i<n;i++){
yy[i]=a*x[i]+b;
sumerrorsquare+=(yy[i]-y[i])*(yy[i]-y[i]);
}
error=sqrt(sumerrorsquare/(n-1));
printf("標准偏差s(y)=%f ",error);
}
intmain(){
doublex[4]={1.0,3.0,3.0,9.0};
doubley[4]={11.0,12.0,13.0,14.0};
analysis(x,y,4);
return0;
}
⑷ c語言編程問題求解,在線等
這程序。。。
你的循環變數n和你計算的數據n沒有分開,完全亂的
格式也亂的,我給你改了改格式,公式我就不清楚了,你自己再調試
#include<stdio.h>
#include<math.h>
main()
{int i,num;char E;
float a[10],b[10],c[10],d[10],e[10],R,h,g,s=0,m=0,n=0,p=0,q=0,U=0,V=0,W=0,K=0,T=0;
printf("input a number\n");
scanf("%d",&num);
printf("input x\n");
for(i=0;i<num;i++)
scanf("%f",&a[i]);
printf("input y\n");
for(i=0;i<num;i++)
scanf("%f",&b[i]);
for(i=0;i<num;i++)
{c[i]=a[i]*a[i];
d[i]=b[i]*b[i];
e[i]=a[i]*b[i];}
printf(" \tx\ty\tx*x\ty*y\tx*y\n");
for(i=0;i<num;i++)
printf("%d,%8.4f,%8.4f,%8.4f,%8.4f,%8.4f,\n",i+1,a[i],b[i],c[i],d[i],e[i]);
for(i=0;i<num;i++)
{s+=a[i];
m+=b[i];
n+=c[i];
p+=d[i];
q+=e[i];}
printf("%c \t%8.4f\t%8.4f\t%8.4f\t%8.4f\t%8.4f\n",E,s,m,n,p,q);
R=s/n;K=m/n;T=q/n;
for(i=0;i<num;i++)
{U+=a[i]*a[i]-n*R*R;
V+=b[i]*b[i]-n*K*K;
W+=e[i]*e[i]-n*T*T;}
n=W/U;g=K-h*R;
printf("y=%8.4f-%8.4f*x\n",g,h);
}
⑸ 用C語言編制最小二乘法多元線性回歸的通用程序,並對數據進行回歸分析
就用MATLAB來做就是了撒
兩個函數都可以做回歸的,一個是regress,一個是stepwise
當然,你也可以把數據寫成矩陣的形式,y=[],x=[],我可以給你算
⑹ 求個c語言實現的線性回歸代碼
我寫過一個GVBasic的,其實很簡單,比如一個數組x[NUM],一個數組y[NUM],求一些中間值比如 x[i]*y[i]的求和,x[i]*x[i]的求和,y[i]*y[i]的求和,照公式看吧,就得到回歸系數和偏差了。
⑺ 用C語言解決!謝謝!
用SAS軟體解決線性回歸的問題
很簡單
通過SAS
proc
reg過程就可以擬合出回歸模型並進行顯著性試驗。
別偷懶,具體程序我是不會給的,自己去學。
具體參考梅長林,範金成編寫的《數據分析方法》
⑻ 怎樣用c程序編多元線性回歸
Dim a() As String, b() As String
Private Sub Command1_Click()
Dim temp1 As String
Dim i As Integer, k As Integer
temp1 = Text1.Text
a = Split(temp1, ",")
lenolds = Len("->")
For i = 0 To UBound(a)
s = a(i)
j = InStr(s, "->")
Do While j > 0
ReDim Preserve b(i, k)
b(i, k) = Val(Left(s, j + lenolds))
s = Left(s, j - 1) + "->" + Mid(s, j + lenolds + 1)
k = k + 1
j = InStr(s, "->")
Loop
ReDim Preserve b(i, k)
b(i, k) = s
Next i
For i = 0 To UBound(a)
For j = 0 To k
Text2.Text = Text2.Text + b(i, j)
Next j
Next i
End Sub
⑼ C語言 多元線性回歸演算法
從鍵盤輸入abcd,
float x,y,z,M;
M=a*x+b*y+c*x+d
輸出M
你要的是這個意思嗎?
⑽ C語言問題
偷懶,都不難,但要花時間。自己寫。我又個第二個現成的代碼。
/* HELLO.C -- Hello, world */
#include "stdio.h"
#include "conio.h"
# include <stdlib.h>
typedef struct Node
{ float num1; /*the first number*/
float num2; /*the second number*/
struct Node *next;
};
/* 插入函數 */
void insert(struct Node *p,int num1)
{
struct Node *temp=malloc(sizeof(struct Node));
if(temp==NULL)
{
printf("out of space\n");
}
else
{
temp->num1=num1;
temp->next=p->next;
p->next=temp;
}
}
/* 求線性回歸*/
void line(struct Node *p,float *a,float *b)
{
float *line_p[2];
float n=0;
float A=0,B=0,C=0,D=0;
if(p->next==NULL)
{
printf(" the link is empty!");
}
else
{
while(p->next!=NULL)
{
n++;
p=p->next;
B+=p->num1;
A+=(p->num1)*(p->num1);
C+=(p->num1)*(p->num2);
D+=p->num2;
}
}
*a=(C*n-B*D)/(A*n-B*B);
*b=(A*D-B*C)/(A*n-B*B);
}
/* main function */
void main()
{
float a;
float *A,*B;
struct Node *head=NULL;
struct Node *p,*temp;
p->next=head;
temp= p;
printf("please input your data(X):");
/* input the number*/
while(scanf("%f",&a)!=EOF)
{
insert(p,a);
}
printf("please input your data(Y,and Y's sequency is contract with X):");
while(p->next!=NULL)
{
scanf("%f",&a);
p=p->next;
p->num2=a;
}
line(temp,A,B);
printf("the line of these numbers is :");
printf("A=%f,B=%f\n",*A,*B);
getch();
}
解釋下程序,是求一組數據的線性回歸,似乎和你的歸一化差不多。自己先輸入數組X,按CTRIL+Z結束,再輸入Y組數據。
其他的自己寫吧。懶人