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组数据。
其他的自己写吧。懒人