如何计算图形的趋势线?

时间:2020-03-05 18:47:28  来源:igfitidea点击:

Google不再是我的朋友,自从我上大学的统计课程以来已经有很长时间了...我需要计算图形上趋势线的起点和终点,有没有简便的方法可以做到这一点? (使用C语言工作,但任何适合语言)

解决方案

回答

好,这是我最好的伪数学:

生产线的等式是:

Y = a + bX

在哪里:

b =(总和(x * y)总和(x)总和(y)/ n)/(总和(x ^ 2)总和(x)^ 2 / n)

a = sum(y)/ n b(sum(x)/ n)

其中sum(xy)是所有x * y的总和,等等。我承认不是特别清楚,但这是我最好的,不用sigma符号的方法:)

...现在添加了西格玛

b =(((xy)(xy)/ n)/((xx2)(x)^ 2 / n)

a =(y)/ n b((x)/ n)

其中(xy)是所有x * y等的总和,而n是点数

回答

假定趋势线是直线,则通过选择任意两个点并计算来找到斜率:

(A)斜率=(y1-y2)/(x1-x2)

然后,我们需要找到该行的偏移量。该线由等式指定:

(B)y =偏移量+斜率* x

因此,我们需要解决偏移量。拾取线上的任意点,并求解偏移量:

(C)偏移量= y(斜率* x)

现在,我们可以将斜率和偏移量插入到直线方程式(B)中,并获得定义直线的方程式。如果直线有噪声,则必须确定平均算法或者使用某种曲线拟合。

如果直线不是笔直的,则需要研究"曲线拟合"或者"最小二乘拟合"非平凡但可行的方法。如果我们知道自己想要哪种拟合,则将在最小二乘拟合网页的底部看到各种类型的曲线拟合(指数,多项式等)。

另外,如果这是一次性的,请使用Excel。

回答

如果可以访问Excel,请在"帮助"中的"功能参考"的"统计功能"部分中查找。对于直线最佳拟合,我们需要SLOPE和INTERCEPT,方程式就在那。

哦,等等,它们也在此处在线定义:http://office.microsoft.com/en-us/excel/HP052092641033.aspx(适用于SLOPE),并且有指向INTERCEPT的链接。当然,这假定MS不会移动页面,在这种情况下,请尝试使用Google搜索类似" SLOPE INTERCEPT EQUATION Excel site:microsoft.com"之类的链接,该链接现在位于第三位。

回答

感谢大家的帮助,我将这个问题搁置了几天,然后回到它可以将最精致的代码拼凑起来,但是出于我的目的,我认为如果有人遇到这个问题我会分享问题:

public class Statistics
{
    public Trendline CalculateLinearRegression(int[] values)
    {
        var yAxisValues = new List<int>();
        var xAxisValues = new List<int>();

        for (int i = 0; i < values.Length; i++)
        {
            yAxisValues.Add(values[i]);
            xAxisValues.Add(i + 1);
        }

        return new Trendline(yAxisValues, xAxisValues);
    }
}

public class Trendline
{
    private readonly IList<int> xAxisValues;
    private readonly IList<int> yAxisValues;
    private int count;
    private int xAxisValuesSum;
    private int xxSum;
    private int xySum;
    private int yAxisValuesSum;

    public Trendline(IList<int> yAxisValues, IList<int> xAxisValues)
    {
        this.yAxisValues = yAxisValues;
        this.xAxisValues = xAxisValues;

        this.Initialize();
    }

    public int Slope { get; private set; }
    public int Intercept { get; private set; }
    public int Start { get; private set; }
    public int End { get; private set; }

    private void Initialize()
    {
        this.count = this.yAxisValues.Count;
        this.yAxisValuesSum = this.yAxisValues.Sum();
        this.xAxisValuesSum = this.xAxisValues.Sum();
        this.xxSum = 0;
        this.xySum = 0;

        for (int i = 0; i < this.count; i++)
        {
            this.xySum += (this.xAxisValues[i]*this.yAxisValues[i]);
            this.xxSum += (this.xAxisValues[i]*this.xAxisValues[i]);
        }

        this.Slope = this.CalculateSlope();
        this.Intercept = this.CalculateIntercept();
        this.Start = this.CalculateStart();
        this.End = this.CalculateEnd();
    }

    private int CalculateSlope()
    {
        try
        {
            return ((this.count*this.xySum) - (this.xAxisValuesSum*this.yAxisValuesSum))/((this.count*this.xxSum) - (this.xAxisValuesSum*this.xAxisValuesSum));
        }
        catch (DivideByZeroException)
        {
            return 0;
        }
    }

    private int CalculateIntercept()
    {
        return (this.yAxisValuesSum - (this.Slope*this.xAxisValuesSum))/this.count;
    }

    private int CalculateStart()
    {
        return (this.Slope*this.xAxisValues.First()) + this.Intercept;
    }

    private int CalculateEnd()
    {
        return (this.Slope*this.xAxisValues.Last()) + this.Intercept;
    }
}

回答

关于先前的答案

如果(B)y =偏移量+斜率* x

那么(C)偏移= y /(斜率* x)是错误的

(C)应为:

偏移量= y-(斜率* x)

看:
http://zedgraph.org/wiki/index.php?title=趋势