2013-03-25 162 views
2

我期待在C#中爲一組數據創建一個趨勢函數,看起來像使用大型數學庫對我的需求有點矯枉過正。數據集的簡單線性迴歸

給出一個值列表,如6,13,7,9,12,4,2,2,1。我想得到簡單線性迴歸的斜率(看它是遞減還是遞增)和下一個估計值。我知道有大量的圖書館可以做到這一點,但我想要一個更簡單的方法。

我對統計數據不太瞭解,所以如果有人能夠以我的方式來做到這一點,將不勝感激。

+0

google搜索regression'揭示了一些解決一個簡單的功能,你需要相當多的命中'C#線性。他們有什麼不足? – 2013-03-25 19:33:00

+0

當我只關注1維數據集時,大多數處理2D元素的矩陣。 – Justin 2013-03-25 19:37:12

+0

這不是真正的一維。你只是暗示元素之間的間距相等。所以你似乎確實有[0,6],[1,13],[2,7],[3,9]等等。最終你似乎需要知道斜率和截距,所以你可以計算出下一個估計值。從表面上看,這個看起來很有用:https://gist.github.com/tansey/1375526 – 2013-03-25 19:38:37

回答

3

你不需要大量的庫。公式相對簡單。

給定一對爲你的X數組和y的數據,你會計算最小二乘法擬合係數是這樣的:

http://mathworld.wolfram.com/LeastSquaresFitting.html

公式(27)和(28)你希望兩個。編碼只涉及輸入數組值的平方和和。

+8

「相對簡單」的公式讓我有點慌張 – Justin 2013-03-25 19:42:50

+2

你不應該害怕。這僅僅是添加數字列表的總和。 – duffymo 2013-03-25 19:51:32

+0

這是因爲所使用的語法對於不熟悉它的讀者來說並不直觀。這是一個很好的例子,一個簡單的例子可以大大簡化理解。 – Salgat 2018-02-20 17:26:03

4

(從第一天示例第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; 
    } 
+0

當我用0,1,2,3 ...提供X數組時,它工作的很好,Y數組也包含線性漸進值。我知道數組X中的值是Y數組中的值之間的距離,所以它們應該線性增加以及根據Chris Farmer的評論。 當我給Y數組提供類似於:1,2,3,4,5,6,5,4,3,2,1時,它無法正確預測 – Mariusz 2015-09-10 13:17:30

+0

是否因爲此方法需要「粗略」線性進度Y陣列? – Mariusz 2015-09-10 13:23:09

+0

乳清你畫的XY窗格,X和Y都有線性進展, – VISHMAY 2017-02-16 08:07:56