计算Map Reduce中数据集的线性回归

时间:2013-12-05 13:42:20

标签: java hadoop mapreduce

说我有如下输入:

60,3.1

61,3.6 

62,3.8 

63,4 

65,4.1

预计输出如下:

预期产出:y = -8.098 + 0.19x。

我知道如何在java中执行此操作。但不知道这是如何使用mapreduce模型的。任何人都可以提出想法或示例Map Reduce代码来解决这个问题吗?我会很感激。

这个简单的数学例子:

Regression Formula:
Regression Equation(y) = a + bx 
Slope(b) = (NΣXY - (ΣX)(ΣY)) / (NΣX2 - (ΣX)2)
Intercept(a) = (ΣY - b(ΣX)) / N

where 
              x and y are the variables.
              b = The slope of the regression line 
              a = The intercept point of the regression line and the y axis. 
              N = Number of values or elements 
              X = First Score
              Y = Second Score
              ΣXY = Sum of the product of first and Second Scores
              ΣX = Sum of First Scores
              ΣY = Sum of Second Scores
              ΣX2 = Sum of square First Scores

e.g。

X Values   Y Values 
  60          3.1 
  61          3.6 
  62          3.8 
  63            4 
  65          4.1 

为了找到回归方程,我们首先找到斜率,截距并用它来形成回归方程。

Step 1: Count the number of values.
            N = 5

  Step 2: Find XY, X2
            See the below table

X Value   Y Value          X*Y             X*X 
  60        3.1     60 * 3.1 = 186     60 * 60 = 3600 
  61        3.6     61 * 3.6 = 219.6   61 * 61 = 3721 
  62        3.8     62 * 3.8 = 235.6   62 * 62 = 3844 
  63          4     63 * 4 = 252       63 * 63 = 3969 
  65        4.1     65 * 4.1 = 266.5   65 * 65 = 4225 



  Step 3: Find ΣX, ΣY, ΣXY, ΣX2.
            ΣX = 311 
            ΣY = 18.6 
            ΣXY = 1159.7 
            ΣX2 = 19359 

  Step 4: Substitute in the above slope formula given.
            Slope(b) = (NΣXY - (ΣX)(ΣY)) / (NΣX2 - (ΣX)2)
            = ((5)*(1159.7)-(311)*(18.6))/((5)*(19359)-(311)2)
            = (5798.5 - 5784.6)/(96795 - 96721)
            = 13.9/74
            = 0.19 

  Step 5: Now, again substitute in the above intercept formula given.
            Intercept(a) = (ΣY - b(ΣX)) / N 
            = (18.6 - 0.19(311))/5
            = (18.6 - 59.09)/5
            = -40.49/5
            = -8.098

  Step 6: Then substitute these values in regression equation formula
            Regression Equation(y) = a + bx 
            = -8.098 + 0.19x.

假如我们想知道变量x = 64的近似y值。那么我们可以用上面的等式中的值代替。

    Regression Equation(y) = a + bx 
    = -8.098 + 0.19(64).
    = -8.098 + 12.16
    = 4.06

1 个答案:

答案 0 :(得分:1)

我用mrjob编码了Map-Reduce线性回归的实现:

https://github.com/AmazaspShumik/MapReduce-Machine-Learning/blob/master/Linear%20Regression%20MapReduce/LinearRegressionTS.py

获取线性回归参数的两个最重要的组件 是X.t * X(其中X是每行观察的输入矩阵)和 X.t * Y. 每个Mapper为其处理的第i部分数据计算X_i.t * X_i和X_i.t * Y_i,然后所有映射器将数据输出到单个reducer。所有映射器的减速器总和结果: X.t * X =Σi(X_i.t * X_i) X.t * Y =Σi(X_i.t * Y_i)

然后参数向量b =(X.t * X)^ - 1 * X.t * Y. 然而,更好的参数识别解决方案是使用Cholesky分解,因为它是在代码中完成的。