//利用最小二乘法进行线形拟合
创新互联公司主要从事成都网站设计、网站制作、外贸营销网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务兴海,十年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:028-86922220
#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)==0fabs(y+999)==0) break;
data[count][0]=x;
data[count][1]=y;
count++;
}
for(i=0;icount;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;icount;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(r0.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(b0)
printf("y=%3.1fx+%3.2f\n",a,b);
else if(b0)
printf("y=%3.1fx%3.2f\n",a,b);
printf("相关系数为:%3.1f\n",r);
}
就用MATLAB来做就是了撒
两个函数都可以做回归的,一个是regress,一个是stepwise
当然,你也可以把数据写成矩阵的形式,y=[],x=[],我可以给你算
#include math.h
#include stdio.h
#include stdlib.h
void analysis(double * x, double * y, int n) {
double d1, d2, d3,a,b;
double sumx,sumy,sumxx,sumyy,sumxy,mx,my,mxx,myy,mxy;
int i;
// 变量的初始化
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=%f my=%f\n",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=%f myy=%f mxy=%f\n",mxx,myy,mxy);
//
a=(n*sumxy-sumx*sumy)/(n*sumxx-sumx*sumx);
b=(sumxx*sumy-sumx*sumxy)/(n*sumxx-sumx*sumx);
printf("a=%f b=%f\n",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);
}
double r = d1 / sqrt(d2 * d3);
//
printf("相关系数r=%f\n",r);
//
double *yy=(double*)malloc(sizeof(double)*n);
double sumerrorsquare=0,error;
for(i=0;in;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\n",error);
}
int main(){
double x[4]={1.0,3.0,3.0,9.0};
double y[4]={11.0,12.0,13.0,14.0};
analysis(x,y,4);
return 0;
}
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
从键盘输入abcd,
float x,y,z,M;
M=a*x+b*y+c*x+d
输出M
你要的是这个意思吗?
一元线性回归:y=a*x+b
其中(x,y)给定值,还有a,b未知。
一元线性那么你就要假定a或b为某个常数。
在此只考虑整数范围。
例:y=11,x=2
0、假定b=0时
a=5.5
(抛弃)
1、假定b=1时
a=5
2、假定b=2时
a=4.5
(抛弃)
3、假定b=3时
a=4
4、假定b=4时
a=3.5
(抛弃)
5、假定b=5时
a=3
6、假定b=6时
a=2.5
(抛弃)
7、假定b=7时
a=2
8、假定b=8时
a=1.5
(抛弃)
9、假定b=9时
a=1
10、假定b=10时
a=0.5
(抛弃)
11、假定b=11时
a=0
从以上实例可以看出给定(x,y)后,a,b取值有6组,显示a和b都被固定在了某一值域内。
所以在写代码时应假设a或b从某一数值到某一数值。
说了这么些也不知道你看懂没?