2 lcmsx lcmsx 于 2017.09.20 10:35 提问

不限语言类型,想获得离散点集合的轴心线,以表示走向。

先上图
图片说明

备注:横轴上,每个点之间的步进都是1.也就是第一个点和第二个点之间的横轴值相差1. 第二个点和第三个点的横轴值也是相差1. 以此类推。

如上图,我想把数据库中取出来的离散点集合的走向线画出来,也就是图中的红色走向线。显示到Web界面上去。请问怎么计算这个走向线的起始点的x,y 的值啊?

提示:可以用任意语言计算出来都行,Python、C++、C#、Java都行,只要能计算出来。

麻烦各位大神帮忙解决一下咯!或者有个思路也是好的。
先感谢各位。

3个回答

qq_28249373
qq_28249373   2017.09.20 11:26
已采纳

这是一个线性回归的问题。如果你只是想获得离散点的拟合曲线,用excel表格或者MATLAB就可以画出来,也可以得到拟合曲线的方程。如果你想知道生成拟合曲线的算法,你可以看看最小二乘法拟合曲线,如果是直线,算法还是很简单的。

lcmsx
lcmsx 好的哈,多谢咯!
大约 2 个月之前 回复
qq_28249373
qq_28249373 回复乱臣贼子: 我用C语言给你写一段
2 个月之前 回复
lcmsx
lcmsx 好的,多谢了。如果你知道Python中怎么使用的话,麻烦你给个提示呗,先采纳了哈。
2 个月之前 回复
qq_28249373
qq_28249373 回复乱臣贼子: 有的,你去参考一下《数值分析》《数值计算》这些书,里面有求最小二乘来获得趋势线的方法,也不难
2 个月之前 回复
lcmsx
lcmsx 我在Excel上确实获得了趋势线的公式,问了下朋友,就是使用最小二乘法来获得的那个公式。但是我不知道如何使用程序去计算出来这个公式
2 个月之前 回复
lcmsx
lcmsx 你好,我就是想要获得直线,进行趋势分析。 可是我不知道如何使用程序去根据最小二乘法来获得趋势线公式。兄弟有什么方法吗?
2 个月之前 回复
b100522
b100522   2017.09.20 10:51

试试用c# 绘制来坐标

qq_28249373
qq_28249373   2017.09.20 21:31

最小二乘法拟合曲线的方法。我写的是求解拟合直线的系数的公式,未必能解释的清清楚楚,如果有什么困惑,还请参考书籍《数值计算方法》或者《数值方法简明教程》或者其他关于数值计算的书。图片说明

下面是一段C程序,Python我没用过。程序并不复杂,你自己也可改为Python版本的代码。

 #include<stdio.h>
void Line(int n,double X[], double Y[], double *c0, double *c1);
int main()
{
    double c0, c1;
    double X[6] = { 1,2,4,6,8,10 },Y[6] = {1.8,3.7,8.2,12.0,15.8,20.2};

    Line(6,X, Y, &c0, &c1);
    printf("%lf %lf\n",c0,c1);
    return 0;
}

//最小二乘法求拟合曲线
//输入:离散点的个数n,X变量,Y变量
//输出:直线y=c0+c1*x的两个系数c0和c1
void Line(int n,double X[], double Y[], double *c0, double *c1)//
{

    double a00=0, a01=0, a10=0, a11=0, b0=0, b1=0;

    a00 = n;

    for (int i = 0;i < n;i++)
    {
        a01 = a01 + X[i];
        a11 = a11 + X[i] * X[i];
        b0 = b0 + Y[i];
        b1 = b1 + X[i]*Y[i];
    }

    a10 = a01;

    *c1 = (a00*b1 - a10*b0) / (a00*a11 - a10*a01);
    *c0 = (b0 - a01*(*c1)) / a00;
}
lcmsx
lcmsx 多谢多谢!
大约 2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片