Попробуйте сделать это:
int **ary = new int[sizeY];
for (int i = 0; i < sizeY; i++)
ary[i] = new int[sizeX];
Учитывая, что линия тренда является прямой, найдите наклон путем выбора любых двух точек и вычисления:
(A) клонятся = (y1-y2) / (x1-x2)
Тогда, необходимо найти смещение для строки. Строка определяется уравнением:
(B) год = смещение + slope*x
, Таким образом, необходимо решить для смещения. Выберите любую точку на строке и решите для смещения:
(C) смещение = y - (slope*x)
Теперь можно включить наклон и смещение в уравнение строки (B) и иметь уравнение, которое определяет строку. Если Ваша строка имеет шум, необходимо будет выбрать алгоритм усреднения или использовать какой-то подбор кривых.
, Если Ваша строка не является прямой тогда, необходимо будет изучить Подбор кривых , или Выравнивание методом наименьших квадратов - не тривиальный, но выполнимый. Вы будете видеть различные типы подбора кривых у основания веб-страницы выравнивания методом наименьших квадратов (экспоненциал, многочлен, и т.д.), если Вы будете знать, какое соответствие Вы хотели бы.
кроме того, если это - одноразовое, Excel использования.
Благодаря всем для Вашей справки - я был от этой проблемы в течение нескольких дней и просто возвратился к нему - смог починить это - не самый изящный код, но это работает на мои цели - думал, что я совместно использую, если кто-либо еще встретится с этой проблемой:
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;
}
}
Хорошо, вот моя лучшая псевдо математика:
уравнение для Вашей строки:
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 является числом очков
Если у Вас есть доступ к Excel, посмотрите в разделе "Statistical Functions" Ссылки на функцию в Справке. Для прямолинейного лучшего соответствия Вы должны КЛОНИТЬСЯ и ПРЕРВАТЬ, и уравнения тут же.
, О, держитесь, они также определяются онлайн здесь: http://office.microsoft.com/en-us/excel/HP052092641033.aspx для НАКЛОНА, и существует ссылка на ПРЕРЫВАНИЕ. Конечно, это предполагает, что MS не перемещает страницу, в этом случае пытается Гуглить для чего-то как "НАКЛОННЫЙ INTERCEPT EQUATION Excel site:microsoft.com" - данная ссылка оказалась третьей сейчас.
Относительно предыдущего ответа
если (B) y = смещение + slope*x
затем (C) смещение = y / (slope*x) является неправильным
(C) должен быть:
смещение = y-(slope*x)