如何计算图形的趋势线?
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=趋势