Multiple Layer Perceptron Classifier(多层神经网络分类) in ML

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: Multiple Layer Perceptron Classifier(多层神经网络分类) in ML

引言

Logistic Regression(逻辑回归) in ML的基础上,现在来介绍多层神经网络分类方法。
神经网络分类就是模拟人类大脑认识物体的方式对输入进行分类。一般为了提高精确性和鲁棒性,都会设置多层进行分析,其中第一层为输入层,一般进行数据初分类,修剪等,最后一层为输出层,中间的为隐藏层。
每一层有多个神经元节点组成,它们都有各自的weight权值,越高越能决定输出值。本文根据Spark中的代码进行介绍,理论知识可参考《数字图像处理与机器视觉 Visual C++与Matlab实现》第12章介绍。
和逻辑回归的相比较,主要是它们的梯度计算器和更新器不一样,且神经网络的梯度计算和损失计算都是多层的。

代码分析
测试代码

以MultilayerPerceptronClassifierSuite类中的测试 test(“3 class classification with 2 hidden layers”)为例。
此单元测试用了多层神经网络和逻辑回归两种方式进行模型训练,并对训练结果进行了比较。

  test("3 class classification with 2 hidden layers") {
    val nPoints = 1000
 
    // The following coefficients are taken from OneVsRestSuite.scala
    // they represent 3-class iris dataset
    val coefficients = Array(
      -0.57997, 0.912083, -0.371077, -0.819866, 2.688191,
      -0.16624, -0.84355, -0.048509, -0.301789, 4.170682)
 
    val xMean = Array(5.843, 3.057, 3.758, 1.199)
    val xVariance = Array(0.6856, 0.1899, 3.116, 0.581)
    // the input seed is somewhat magic, to make this test pass
//用输入的系数,均值和方差生成多类逻辑回归输入数据
    val data = generateMultinomialLogisticInput(
      coefficients, xMean, xVariance, true, nPoints, 1).toDS()
    val dataFrame = data.toDF("label", "features")
    val numClasses = 3//3类
    val numIterations = 100//最大迭代次数100
//层神经元数量,输入为4个,输出为3个,隐藏层分别为5,4
    val layers = Array[Int](4, 5, 4, numClasses)
    val trainer = new MultilayerPerceptronClassifier()
      .setLayers(layers)
      .setBlockSize(1)
      .setSeed(11L) // currently this seed is ignored
      .setMaxIter(numIterations)
    val model = trainer.fit(dataFrame)//下一节继续
    val numFeatures = dataFrame.select("features").first().getAs[Vector](0).size
    assert(model.numFeatures === numFeatures)
    val mlpPredictionAndLabels = model.transform(dataFrame).select("prediction", "label").rdd.map {
      case Row(p: Double, l: Double) => (p, l)
    }
    // train multinomial logistic regression
    val lr = new LogisticRegressionWithLBFGS()
      .setIntercept(true)
      .setNumClasses(numClasses)
    lr.optimizer.setRegParam(0.0)
      .setNumIterations(numIterations)
    val lrModel = lr.run(data.rdd.map(OldLabeledPoint.fromML))
    val lrPredictionAndLabels =
      lrModel.predict(data.rdd.map(p => OldVectors.fromML(p.features))).zip(data.rdd.map(_.label))
    // MLP's predictions should not differ a lot from LR's.
    val lrMetrics = new MulticlassMetrics(lrPredictionAndLabels)
    val mlpMetrics = new MulticlassMetrics(mlpPredictionAndLabels)
    assert(mlpMetrics.confusionMatrix.asML ~== lrMetrics.confusionMatrix.asML absTol 100)
  }

继续阅读“Multiple Layer Perceptron Classifier(多层神经网络分类) in ML”本作品采用知识共享署名 4.0 国际许可协议进行许可。