我期待在C#中爲一組數據創建一個趨勢函數,看起來像使用大型數學庫對我的需求有點矯枉過正。數據集的簡單線性迴歸
給出一個值列表,如6,13,7,9,12,4,2,2,1。我想得到簡單線性迴歸的斜率(看它是遞減還是遞增)和下一個估計值。我知道有大量的圖書館可以做到這一點,但我想要一個更簡單的方法。
我對統計數據不太瞭解,所以如果有人能夠以我的方式來做到這一點,將不勝感激。
我期待在C#中爲一組數據創建一個趨勢函數,看起來像使用大型數學庫對我的需求有點矯枉過正。數據集的簡單線性迴歸
給出一個值列表,如6,13,7,9,12,4,2,2,1。我想得到簡單線性迴歸的斜率(看它是遞減還是遞增)和下一個估計值。我知道有大量的圖書館可以做到這一點,但我想要一個更簡單的方法。
我對統計數據不太瞭解,所以如果有人能夠以我的方式來做到這一點,將不勝感激。
你不需要大量的庫。公式相對簡單。
給定一對爲你的X數組和y的數據,你會計算最小二乘法擬合係數是這樣的:
http://mathworld.wolfram.com/LeastSquaresFitting.html
公式(27)和(28)你希望兩個。編碼只涉及輸入數組值的平方和和。
(從第一天示例第15天),爲未來的預測我自己的代碼
static void Main(string[] args)
{
double[] xVal = new double[9]
{
...
};
double[] yVal = new double[9] {
...
};
double rsquared;
double yintercept;
double slope;
LinearRegression(xVal, yVal,0,9, out rsquared, out yintercept, out slope);
Console.WriteLine(yintercept + (slope*15));//15 is xvalue of future(no of day from 1)
Console.ReadKey();
}
public static void LinearRegression(double[] xVals, double[] yVals,
int inclusiveStart, int exclusiveEnd,
out double rsquared, out double yintercept,
out double slope)
{
Debug.Assert(xVals.Length == yVals.Length);
double sumOfX = 0;
double sumOfY = 0;
double sumOfXSq = 0;
double sumOfYSq = 0;
double ssX = 0;
double ssY = 0;
double sumCodeviates = 0;
double sCo = 0;
double count = exclusiveEnd - inclusiveStart;
for (int ctr = inclusiveStart; ctr < exclusiveEnd; ctr++)
{
double x = xVals[ctr];
double y = yVals[ctr];
sumCodeviates += x * y;
sumOfX += x;
sumOfY += y;
sumOfXSq += x * x;
sumOfYSq += y * y;
}
ssX = sumOfXSq - ((sumOfX * sumOfX)/count);
ssY = sumOfYSq - ((sumOfY * sumOfY)/count);
double RNumerator = (count * sumCodeviates) - (sumOfX * sumOfY);
double RDenom = (count * sumOfXSq - (sumOfX * sumOfX))
* (count * sumOfYSq - (sumOfY * sumOfY));
sCo = sumCodeviates - ((sumOfX * sumOfY)/count);
double meanX = sumOfX/count;
double meanY = sumOfY/count;
double dblR = RNumerator/Math.Sqrt(RDenom);
rsquared = dblR * dblR;
yintercept = meanY - ((sCo/ssX) * meanX);
slope = sCo/ssX;
}
google搜索regression'揭示了一些解決一個簡單的功能,你需要相當多的命中'C#線性。他們有什麼不足? – 2013-03-25 19:33:00
當我只關注1維數據集時,大多數處理2D元素的矩陣。 – Justin 2013-03-25 19:37:12
這不是真正的一維。你只是暗示元素之間的間距相等。所以你似乎確實有[0,6],[1,13],[2,7],[3,9]等等。最終你似乎需要知道斜率和截距,所以你可以計算出下一個估計值。從表面上看,這個看起來很有用:https://gist.github.com/tansey/1375526 – 2013-03-25 19:38:37