Как я вычисляю линию тренда для графика?

Попробуйте сделать это:

int **ary = new int[sizeY];
for (int i = 0; i < sizeY; i++)
    ary[i] = new int[sizeX];
49
задан Steven V 30 April 2014 в 08:29
поделиться

5 ответов

Учитывая, что линия тренда является прямой, найдите наклон путем выбора любых двух точек и вычисления:

(A) клонятся = (y1-y2) / (x1-x2)

Тогда, необходимо найти смещение для строки. Строка определяется уравнением:

(B) год = смещение + slope*x

, Таким образом, необходимо решить для смещения. Выберите любую точку на строке и решите для смещения:

(C) смещение = y - (slope*x)

Теперь можно включить наклон и смещение в уравнение строки (B) и иметь уравнение, которое определяет строку. Если Ваша строка имеет шум, необходимо будет выбрать алгоритм усреднения или использовать какой-то подбор кривых.

, Если Ваша строка не является прямой тогда, необходимо будет изучить Подбор кривых , или Выравнивание методом наименьших квадратов - не тривиальный, но выполнимый. Вы будете видеть различные типы подбора кривых у основания веб-страницы выравнивания методом наименьших квадратов (экспоненциал, многочлен, и т.д.), если Вы будете знать, какое соответствие Вы хотели бы.

кроме того, если это - одноразовое, Excel использования.

15
ответ дан Adam Davis 7 November 2019 в 11:38
поделиться

Благодаря всем для Вашей справки - я был от этой проблемы в течение нескольких дней и просто возвратился к нему - смог починить это - не самый изящный код, но это работает на мои цели - думал, что я совместно использую, если кто-либо еще встретится с этой проблемой:

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;
    }
}
33
ответ дан matt 7 November 2019 в 11:38
поделиться

Хорошо, вот моя лучшая псевдо математика:

уравнение для Вашей строки:

Y = + основной обмен

, Где:

b = (сумма (x*y) - сумма (x) сумма (y)/n) / (сумма (x^2) - сумма (x) ^2/n)

= сумма (y)/n - b (сумма (x)/n)

, Где сумма (xy) является суммой всего x*y, и т.д. Не особенно ясного, который я признаю, но лучше, чтобы я мог обойтись без символа сигмы:)

... и теперь с добавленной Сигмой

b = (Σ (xy) - (Σ xΣ y)/n) / (Σ (x^2) - (Σ x) ^2/n)

= (Σ y)/n - b ((Σ x)/n)

, Где Σ (xy) является суммой всего x*y и т.д., и n является числом очков

27
ответ дан blank 7 November 2019 в 11:38
поделиться

Если у Вас есть доступ к Excel, посмотрите в разделе "Statistical Functions" Ссылки на функцию в Справке. Для прямолинейного лучшего соответствия Вы должны КЛОНИТЬСЯ и ПРЕРВАТЬ, и уравнения тут же.

, О, держитесь, они также определяются онлайн здесь: http://office.microsoft.com/en-us/excel/HP052092641033.aspx для НАКЛОНА, и существует ссылка на ПРЕРЫВАНИЕ. Конечно, это предполагает, что MS не перемещает страницу, в этом случае пытается Гуглить для чего-то как "НАКЛОННЫЙ INTERCEPT EQUATION Excel site:microsoft.com" - данная ссылка оказалась третьей сейчас.

2
ответ дан Mike Woodhouse 7 November 2019 в 11:38
поделиться

Относительно предыдущего ответа

если (B) y = смещение + slope*x

затем (C) смещение = y / (slope*x) является неправильным

(C) должен быть:

смещение = y-(slope*x)

См.: http://zedgraph.org/wiki/index.php?title=Trend

3
ответ дан 7 November 2019 в 11:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: