xioaxu790 发表于 2014-7-27 12:14:16

Spark MLlib系列——程序框架

问题导读
1、如何对Spark中的mllib模块进行分析?
2、Spark实现机器学习算法的流程是怎样的?

static/image/hrline/4.gif


本系列将对Spark中的pyspark的mllib模块进行分析。这篇文章先简要介绍一下Spark实现机器学习算法的流程。

大部分的机器学习算法都包含训练以及预测两个部分,训练出模型,然后对未知样本进行预测。Spark中的机器学习包完全体现了这样一种思想,下面我们看一个最简单的例子:
class LinearModel(object):
    """A linear model that has a vector of coefficients and an intercept."""
    def __init__(self, weights, intercept):
      self._coeff = weights
      self._intercept = intercept

    @property
    def weights(self):
      return self._coeff

    @property
    def intercept(self):
      return self._intercept

class LinearRegressionModelBase(LinearModel):
    """A linear regression model.

    >>> lrmb = LinearRegressionModelBase(array(), 0.1)
    >>> abs(lrmb.predict(array([-1.03, 7.777])) - 14.624) < 1e-6
    True
    >>> abs(lrmb.predict(SparseVector(2, {0: -1.03, 1: 7.777})) - 14.624) < 1e-6
    True
    """
    def predict(self, x):
      """Predict the value of the dependent variable given a vector x"""
      """containing values for the independent variables."""
      _linear_predictor_typecheck(x, self._coeff)
      return _dot(x, self._coeff) + self._intercept

这是Spark MLlib的线性回归的预测模型,回归模型的两个参数,一个是特征向量对应的权重向量(weights),另一个是截距(intercept),而预测样本的回归值则只需要输入样本的特征向量。因此,在线性回归模型中,用模型参数——权重向量以及截距,来初始化,预测函数predict输入待测样本的特征向量,并输出预测值。

现在的关键是如何得到模型参数,这就需要利用已有的训练样本对模型进行训练。
class LinearRegressionWithSGD(object):
    @classmethod
    def train(cls, data, iterations=100, step=1.0,
            miniBatchFraction=1.0, initialWeights=None):
      """Train a linear regression model on the given data."""
      sc = data.context
      train_f = lambda d, i: sc._jvm.PythonMLLibAPI().trainLinearRegressionModelWithSGD(
            d._jrdd, iterations, step, miniBatchFraction, i)
      return _regression_train_wrapper(sc, train_f, LinearRegressionModel, data, initialWeights)

def _regression_train_wrapper(sc, train_func, klass, data, initial_weights):
    initial_weights = _get_initial_weights(initial_weights, data)
    dataBytes = _get_unmangled_labeled_point_rdd(data)
    ans = train_func(dataBytes, _serialize_double_vector(initial_weights))
    if len(ans) != 2:
      raise RuntimeError("JVM call result had unexpected length")
    elif type(ans) != bytearray:
      raise RuntimeError("JVM call result had first element of type "
                           + type(ans).__name__ + " which is not bytearray")
    elif type(ans) != float:
      raise RuntimeError("JVM call result had second element of type "
                           + type(ans).__name__ + " which is not float")
    return klass(_deserialize_double_vector(ans), ans)

由上面的代码可以看到,线性回归的训练调用的是封装好的trainLinearRegressionModelWithSGD函数,其输出值ans有两个,一个是weights,另一个是intercept。_regression_train_wrapper函数的作用是对训练模型的参数进行包装,并返回预测模型对象。

通过上面对线性回归模型代码分析可以知道,Spark将机器学习算法都分成了两个模块:一个训练模块,通过训练样本输出模型参数;另一个是预测模块,利用模型参数初始化,预测测试样本,输出与测值。

其他的机器学习算法都类似,当然有些机器学习算法天生不用经过训练的过程,如KNN,自然也就没有训练阶段。

stark_summer 发表于 2015-2-3 17:26:41

{:soso_e179:}

xw2016 发表于 2016-6-15 08:42:43

学习了
页: [1]
查看完整版本: Spark MLlib系列——程序框架