最近在研究机器学习,使用的工具是spark,本文是针对spar最新的源码Spark1.6.0的MLlib中的logistic regression, linear regression进行源码分析,其理论部分参考:http://www.cnblogs.com/ljy2013/p/5129610.html

下面我们跟随我的demo来一步一步解剖源码,首先来看一下我的demo:

 package org.apache.spark.mllib.classification

 import org.apache.spark.SparkContext
import org.apache.spark.mllib.classification.{ LogisticRegressionWithLBFGS, LogisticRegressionModel }
import org.apache.spark.mllib.evaluation.MulticlassMetrics
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.SparkConf object MyLogisticRegression {
def main(args: Array[String]): Unit = { val conf = new SparkConf().setAppName("Simple Application").setMaster("local[*]")
val sc = new SparkContext(conf) // Load training data in LIBSVM format. 这里的数据格式是LIBSVM格式:<label> <index1>:<value1> <index2>:<value2> ...index1是按1开始的
val data = MLUtils.loadLibSVMFile(sc, "D:\\MyFile\\wine.txt") // Split data into training (60%) and test (40%).
val splits = data.randomSplit(Array(0.6, 0.4), seed = 11L)
val training = splits(0).cache()
val test = splits(1) // Run training algorithm to build the model
val model = new LogisticRegressionWithLBFGS()
.setNumClasses(10) //设置类别的个数
.run(training) // Compute raw scores on the test set.
val predictionAndLabels = test.map {
case LabeledPoint(label, features) =>
val prediction = model.predict(features)
(prediction, label)
} // Get evaluation metrics.
val metrics = new MulticlassMetrics(predictionAndLabels)
val precision = metrics.precision
println("Precision = " + precision) // Save and load model
model.save(sc, "myModelPath")
val sameModel = LogisticRegressionModel.load(sc, "myModelPath") }
}

从上面的demo,我们可以看出LogisticRegression采用的是LBFGS算法来进行优化求参数的,LBFGS是一个无约束项优化算法,主要用来求解逻辑回归的参数(权值)。不清楚的同学可以参考:http://www.cnblogs.com/ljy2013/p/5129610.html 。

我将其中的类继承图简单的画了一下:

aaarticlea/png;base64,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" alt="" width="566" height="296" />

主要分了两个过程:训练和预测。

1、训练过程

首先主程序通过调用下面的方法来进行训练

     // Run training algorithm to build the model
val model = new LogisticRegressionWithLBFGS()
.setNumClasses(10) //设置类别的个数
.run(training)

通过设置对应的类别的个数,然后调用LogisticRegressionWithLBFGS的run方法,但是LogisticRegressionWithLBFGS类本身是没有该方法的,但它继承自GeneralizedLinearAlgorithm类的run方法,训练过程就是在这个方法中完成的,现在让我们来看一下这个方法:

   def run(input: RDD[LabeledPoint], initialWeights: Vector): M = {

     if (numFeatures < 0) {
numFeatures = input.map(_.features.size).first()
}
//由于需要多次迭代,因此需要将训练数据缓存到内存中
if (input.getStorageLevel == StorageLevel.NONE) {
logWarning("The input data is not directly cached, which may hurt performance if its"
+ " parent RDDs are also uncached.")
} // Check the data properties before running the optimizer
if (validateData && !validators.forall(func => func(input))) {
throw new SparkException("Input validation failed.")
} /**
* Scaling columns to unit variance as a heuristic to reduce the condition number:
*
* During the optimization process, the convergence (rate) depends on the condition number of
* the training dataset. Scaling the variables often reduces this condition number
* heuristically, thus improving the convergence rate. Without reducing the condition number,
* some training datasets mixing the columns with different scales may not be able to converge.
*
* GLMNET and LIBSVM packages perform the scaling to reduce the condition number, and return
* the weights in the original scale.
* See page 9 in http://cran.r-project.org/web/packages/glmnet/glmnet.pdf
*
* Here, if useFeatureScaling is enabled, we will standardize the training features by dividing
* the variance of each column (without subtracting the mean), and train the model in the
* scaled space. Then we transform the coefficients from the scaled space to the original scale
* as GLMNET and LIBSVM do.
*
* Currently, it's only enabled in LogisticRegressionWithLBFGS
*/
//将数据标准化
val scaler = if (useFeatureScaling) {
new StandardScaler(withStd = true, withMean = false).fit(input.map(_.features))
} else {
null
} // Prepend an extra variable consisting of all 1.0's for the intercept.
// TODO: Apply feature scaling to the weight vector instead of input data.
val data =
if (addIntercept) {
if (useFeatureScaling) {
input.map(lp => (lp.label, appendBias(scaler.transform(lp.features)))).cache()
} else {
input.map(lp => (lp.label, appendBias(lp.features))).cache()
}
} else {
if (useFeatureScaling) {
input.map(lp => (lp.label, scaler.transform(lp.features))).cache()
} else {
input.map(lp => (lp.label, lp.features))
}
} /**
* TODO: For better convergence, in logistic regression, the intercepts should be computed
* from the prior probability distribution of the outcomes; for linear regression,
* the intercept should be set as the average of response.
*/
val initialWeightsWithIntercept = if (addIntercept && numOfLinearPredictor == 1) {
appendBias(initialWeights)
} else {
/** If `numOfLinearPredictor > 1`, initialWeights already contains intercepts. */
initialWeights
} //采用优化器对权值进行优化,返回优化好的权值,即最终的模型参数
val weightsWithIntercept = optimizer.optimize(data, initialWeightsWithIntercept) val intercept = if (addIntercept && numOfLinearPredictor == 1) {
weightsWithIntercept(weightsWithIntercept.size - 1)
} else {
0.0
} var weights = if (addIntercept && numOfLinearPredictor == 1) {
Vectors.dense(weightsWithIntercept.toArray.slice(0, weightsWithIntercept.size - 1))
} else {
weightsWithIntercept
} /**
* The weights and intercept are trained in the scaled space; we're converting them back to
* the original scale.
*
* Math shows that if we only perform standardization without subtracting means, the intercept
* will not be changed. w_i = w_i' / v_i where w_i' is the coefficient in the scaled space, w_i
* is the coefficient in the original space, and v_i is the variance of the column i.
*/
if (useFeatureScaling) {
if (numOfLinearPredictor == 1) {
weights = scaler.transform(weights)
} else {
/**
* For `numOfLinearPredictor > 1`, we have to transform the weights back to the original
* scale for each set of linear predictor. Note that the intercepts have to be explicitly
* excluded when `addIntercept == true` since the intercepts are part of weights now.
*/
var i = 0
val n = weights.size / numOfLinearPredictor
val weightsArray = weights.toArray
while (i < numOfLinearPredictor) {
val start = i * n
val end = (i + 1) * n - { if (addIntercept) 1 else 0 } val partialWeightsArray = scaler.transform(
Vectors.dense(weightsArray.slice(start, end))).toArray System.arraycopy(partialWeightsArray, 0, weightsArray, start, partialWeightsArray.size)
i += 1
}
weights = Vectors.dense(weightsArray)
}
} // Warn at the end of the run as well, for increased visibility.
if (input.getStorageLevel == StorageLevel.NONE) {
logWarning("The input data was not directly cached, which may hurt performance if its"
+ " parent RDDs are also uncached.")
} // Unpersist cached data
if (data.getStorageLevel != StorageLevel.NONE) {
data.unpersist(false)
} createModel(weights, intercept)
}

这个方法中,第一步是实现训练数据进行标准化处理;

第二步,就是通过优化器算法进行求最优的权值。这里要注意一点:它是实现的方式是:val weightsWithIntercept = optimizer.optimize(data, initialWeightsWithIntercept)这里有一个应用到多态的特性。这里的optimizer是GeneralizedLinearAlgorithm类中的抽象方法,如下所示:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAtYAAAFGCAIAAADB/E9PAAAgAElEQVR4nO2dzYscR5r/c/+APft/mIMPYhDruujmk4/TLAgGYRB59Fx0GdhW44EGXYyrERpahxnEGFqH0oxghAtsBK02DdaUUBsWWj6URluNJTFuIc1i2ofhB5u/Q77Fe0a+VGVW9OdDgNQVmU9ERmVGfPN5nsyKEgAAAICVE/XdAVhzpnFUEE/1+vl4ZKvqoGVvs8vrRgdUjWHn1ByN+XjUtGNZS1EURdFoPG9i4nzD9bVCfA/Z9aWIZ/y6j8cq8JEgrw5GG1vRtYMm88dsEm1sje6/abBrr229GV/bijaysqL+21iLc9q6SqW9X8bqI80XVavk8rpRi+y7NPejxUrfqBuGXpi70FKCaO3Mv/kw+vS90Td/zz/4Ov70vejT3/RzbnN9mVmn60trPhUJdb/NWqqrYlBWdzWvN0uWINOd1S3hnbY1FAliuLSGeVb3cMHVmiKHwXw8iuKxaVXOa3s+hlVKkGj399nn3/8m6kmCcH3ZWafrS5X2mZsCCTJ8kCArt1mD+Xg0gDt3L5giPcjWY+OynAziGFYjQaZ/fm/0ze/jXHNM//zh+Pvfj+pKkJrrhaVzXF821un6msbRaDyO8x5O49F4Oh4hQdaAUoJI9/3Rxla08yyrKSTIbJJVSXJE2XEyNVqTbD6L8y3TNT7auDV+VdUNsTNSN9xtVWEwWGKSIO4eGkejsspM5UlsDkkKC50xBm8LZE7jaDSeC9ViZZW32tRXe8RUsqZ30hFqFasivynSaq3pQDlGo3IMR+O5ZV22HYNyxGI3m3TDclCGb6TcIuuYYaDShlKb5VAqds0S5O/TP78Xf58kydfx7u/nb34/+vTDsbfUt/j964UDuL70ttb0+irOw3iapApEFvqu4bUdsnugKgYFCeKLQ4IUS6+4SJvFRFMJUmga546FApjfv2Wqai5BLAZLvCRIuYFtNNxVVqaxazqVFPs0Li+S/HIrr07BinWv8nqTlp28Sgmzmid/8wVXdS0qtx4VPbQcSvUFr2/RfKCso+EYQ3E1NmsQwzEo34J9UfD+Kt3j5fCClEuIcMiS+BiNRplO0dZr2V4qQZLvfxP9+ev5Nx+Ovvl7UkOCOHRGPQnC9RXM9VVKk3g6H49G47lw5lVdKY5OWfbyGRQkiB+WQEy2NqereC5BZEUymZb/L3wYKpZARroe3xpd24pn5Z+6Eakb+SpeWnt1EAuW6wdNKgz62DQNlGk0qgbKaFs4hwUVX15W4jwlbKy6l4VLybGXdpXZwgVmd2XjKVIxVnFc6r1c+ymywUA5DsAxhpJJz2XGsZ5rX4JosvqrrC9BjANVNFRuInfMdBb9fbyb5qL+fbz7m/jPH47fJN4SpFmaoRGuL/241vT6Ev2LcRzLrkbHleI4ZJ8eIkE6QJQgurdDXFnLIIWoGGSXgFcgIyldAsb8Els3UpeJPSWltgSpMmi1aeuhazQqBsqEegUn4sWju+etN73CdeXYqyIQqu7Z0RRpnB7MPdTMdDNFNhgox2jYx1BpzKRB6nhB9P3FTatj2vUliHGgim5IN6S+EiSZf/NhnpT6dfxpGpex06H8KI6K6yuE60v2eAgeunjqulJch1zRw+pBQYL4UUgQR7TFJUHET7ISz0rzbgkiblndjYFIEFdYSjo6fTScVabWNeefPEVazu+KK9/3fsnekc7u0gyGvNfw5U+RNmuu0bDuJ9xml1R7JpTdXBJmHSWIgIcEyRvsambn+nKaWaPryxzuay1Bqk4zJEgH5BJEDnmY4gv5Up3nTxhSGbLcUmE91j9JksQ78uKMB6WfVLdlp8pgYVOUIK4eyjj649tVbY6UXYiec4niXXRe+taZzGLQ2mh1ldkRXeGRVZ/8X9YUWdEN62jYxtBgzy0iyk98B1VsOlwJkvemkwdZuL7Ubqzp9eWSIK4rxXHIPgoCCdIBhRdEygw1eUGMCZiOqiRJEi3fU8rqMCVGOLpRrNwW94OlLRdWg0ZXRyrCljNQ1h7G0mwrXDLpROyz3ImXrX2vqjt4Kc2g/RRpjYQ7eigcfe4mXdYUWTW8ttGwjaHhcz0OUN1D1aTcsCWtzojNsu4ZMGzcUoIY1Ya/BCl61PaJmITrS+vgel5fxo+LDx1XiuOQXV+l9ZB9K6FAyAUR1uNb49nByLqyCtJBW1n14IK0zFdKEEc3UkQFYEk98ZcgVoMOCVJjoITR8BgoG4ovXphXVOe+Rb8r16dlr2rfc9G+eG9uCjBIk3jdKlcPhZrs9kaeImu21XSg7KPhmiLN62WeTGcbDT0krXRYHz7nV+keeW2L1MiqJIjmGnFik3U1HSRcX2FcX0YJYrqMbKe7esj2HlZfRIajBzP8RgzAUPFxlAwc6904QNCs3aXaE0gQgKGiSRBdkwwdJAicT5AgfiBBAAaMGohZt+Vc9FnnfX8v+tRWeu4tQFsMgUxwgAQBAACAHkCCAAAAQA8gQQAAAKAHkCAAAADQA0gQAAAA6AEkyFBYPJlcuHn7wlcv+u7IGlN7DJ8/vHDzdlZMe3X3pby7c9dup6obzdHecgkAMBx6lCCzSb1flatpucaPxZh4e3T55u3rz7vqUjXpanf5ybvVNWki+0Vfw/di/L7UnzD0J1vdb97u8KibjqFVH3T3pTglSI1t6sCbCQBg2PQnQWr/sK0/aylBBoJVgpi/r4YS5OCr2xduTu68zf5cPJn0OtRdr/0Nm+i4G7wVDAAGDhLEwnmVIFa6lCAvrg/A3yOABAEA6IEuJIj443D5r69lN9OlDsh/py2e5VX237w1Gcwt7DwrfxFXWvk0s6VBpWri45p2ShAxiKCsGQdf3S6r5CiDtcqaCvDuzt3bl5+8K5u7e7Twa8uEI5Ky80wZJWEz5/eVS5Cp+Uux8OK6O+nBNiDPH164e7RId795+4L4BTnTKRzfV5Ik5rXfblCypn0vlrayJmxfpbUbVYfmAAkCAAOnrQQxrE+KColn5v9bJIjdoOv37tOf3jUa1KtaSpDFk8mFmw8Psr+k1VSqev5QXCMdVTn6CvTuzl1x4ZGcBx4GFV5pPzucfzi6/6aVBDF/KQ7ylbiMxZQ8f2gb3mIxTo9U/iKEEdPEhKDMjA4Yh/uhyjMh9dbRVv5VZsrDKMJsSsgyGlUgQQBg4LSUIGnIo7jxVf7M1qfJOL1Flhc/s2PfYbBY7XaeJUmS+UKuHcyL/xfaQgzEZHvdGr+qd2RWCfLiuvL584f5UqosIZkPo/i/pSoRPzRIEOF2+eCrYgMfgyrP4nxYpjv5mGiuEVuAzBWIMX0plbw9umxw3qgH4lJab48uqyKmOpYhjKHPXm6D2slgbUv9Kv30k3M0KkCBAMDQaSdBypiIzc2QqgHTsmRc0lwGlbQDQZ2kpsqQjZQLIt/Ee2ct2CRIKTgMWy7FCyJ8Ii6f9b0gqQS5djDPPUOj+2/SsSqHrpkEsWlQHzL3QL7QlkEWoYiH6V6AzYpBjVh1JEFMasbWlmZHP5EMbTlHw0r6Q1nIDwAYOiuTIFr4ozsJIkZ5hCrJ6SKFY8QV10ZzCVKuFuLujqqcBhLEbVAlHajJdDaJNibxTpHDIbmIVi1B8uPKVlanX6GRBBGM5392IkFMnbG3ZZQglV6QCi+LEx7JBYCh020gRqFIPjA9opLlnCqpCQ6DVV4QNTvB9ESMuVETNgmif16uJe/u3LUtGI4qaRtvCeJjUGO6k8fFsi/l1uiaqg7dEsSYStJagggencpXeNWVIGr+RDcSxBADcrel2lk8mWgZqdUnQC2IxADAwFlCOqqcB5reYRveNqE6POzpqMrDF4bVrvS1dJUv6UhHle90tZTDZlmN5m0qJEjtxakY89H9N6VnSEm1EYsgJszfVyMJ8vbostjzt0eX1TRbi7pqIkGkJIwsStJWgtgybxxtyXbMZ5ehLddoVIEEAYCB08FDucanYYVsg5R8hdMzH2UJYjNYsdoJC+RkKj76oa2sPlGYREqWzEt51yvG+6WlSHx+Ukk7sFcZHvI057fKd/COtqxkWk3ShQ6tpogJw/fV1Asid15ZYtUBkQ7ZLEHsY6jmvS6eTDxGvmGVf1uOIJ1ysllHowokCAAMHH4jpjvku/nik+vPnVWdtwWQJAkSBAAGDxKkOzRZsHgyyW5nHVWdtwWQQkIqAAwbJEinqMERQRM4qjpvCyCFX8oFgAGDBAEAAIAeQIIAAABADyBBAAAAoAeQIAAAANADSBAAAADoASQIAAAA9AASBAAAAHoACQIAAAA9gAQBAACAHkCCAAAAQA8gQQAAAKAHkCAAAADQA0gQAAAA6AEkCAAAAPQAEgQAAAB6AAkCAAAAPYAEAQAAgB5AggAAAEAPIEEAAACgB5AgAAAA0ANIEAAAAOgBJAgAAAD0ABIEAAAAegAJAgAAAD2ABAEAAIAeQIKcM6bHUfQoK/GpXj8fz2xVpY24YoNzzXw8inJG43kwbZ07xMGN4mnf3emKabzCoxrQGC6eTC7cvH3hqxcd253G8pGpf4ObYUqQ2STa2BrdfzMUg7NJtLEV7TzrrD8Sb8bXtqKNrHR51A5+Ho9cEmQ0/tmxcw0JMl+MokdDvyDfHl2+eftCVh4etLQ2H49MckCc+SXBIM3SspRwVDnb+t8/jv70fvSn/6o17vP//s/oT++P/ntRZ6eirbT85/h/6+2dMv3m/ehP78cn5f+FUucoss7U68b0G/cu8/Got0Wl8gxoZ3llR7WC1t4eXb55+/pza30qQS4/edehzfS4lC8l/c6GPukNhkFKkOlOx4txW4PnSIL4EJIEWTyZXLg5ufM2//vt0eWW90kOCVJ8PI3LSUqendP5K9vQUeVsKygJUsdsEwnyKK7YpXcJIp8BHamQcydBlmBTvIwl+jxl1g0kiA/LlSAZnR+1CyRIkiTZFFPvxqgSHwkiTl7adFV+4KhytrVKCZJRuZC70CVI3o3F+K/vR396P/rmUaNe+bAyCWL5sir3EdrucGlDgrS16TwmqzoBhZYS5NXBaGMr2nk2v38ru4+/dpBfY8/ija1oYzLNF9do49b4VbGn8dZf+rAswtqfm9qKNrbimakzUjfaGNT2dUuQrHXxGEVVUW2tlgSZHkfRTJrO5ouREEDJUjqsOR8mCeJOExFr5Q2MbUkfluV46twra2i0mCencV4rXchSN46VS9zgJ3BTJUEOvioCNOpmZdXdo0Xy7s6T3HfSWoKUnziqnG05JIjktCgX/kSQIIUfQpYj6VJtC47YFnL7XpaeyBIk61UpQWxOF7szJrUQn+RqpjCudUAZEMuYt6C+i75CgjhSLaqyMCxHZc8UsRjMTsGy1nj59StBnj8srmJDLohYm8dhs8QRtYhRWvmC1sAR4kknEsS8wOcSJHUhZGUyLaukYl6nJYOG2kI0lBqoG4OGHlZ6QTQNUYowY1uK2qjnBTmNDTogX5Knx0Iyx2lsyO1weEFs6mQmrJ/CBu62LF4QqbfKseQiI1+ghS2rfCq1JUjy7s5dy8SUVhWfP38oxGteXBd2UWPMHhJEcqhbdMZoPHdVOduqI0GKBTtb7I3rsWEvxbhJgjj2OvkvW1tGL0j2p2GvvMUqCWLYa/USJEnyNd7XnNy2vOrpdcVfjiqz5XJDy17TWDjPtHO53NKyMA/CCyJf0T57OWorFAgaxJeOJEi2cGZ/ijrj1uhauq5nf45f5XKh8JdkGmVSfFvmxTjdTNkr+zNTDOUurw5iYfe6BnNBk3fJMxBjNGjaK7MvV9UMxMiruCuwYoqb1JIgP49HkrBwBGLUKrNoOI0Nvo1c4kyPJc/HfDGSqmbdhMIFyjseYXpaPJlcuHu0kLbJ7oEOvrotViVvjy6L2SRe6ajqnaw8RPn05qhytuUbiMkW+HTRzZdqWZF88yjRPBPKn0mSGCWIfS81vFKVC5IeiCxHii2lGI2hG4UEiU8MRroNxKjZo2YfRA2l7EhH1Z68KE8NR5XjqNSTyXHcQgNqfor5gZDOx1CnmQSRbi1q2PQ4oCaBt3NIJxJEDb6kwYjckVDWZqRrrRD1EPcqN1AWY93PUaoEZe3XqGtQ7aFvLkjq6sgOZLojx2V0j1ErCSKt7uI6nRqLH9niJkmS1JMgmoxQdIarLaMEsUSR8vuoYz3CIvUterREIZLNUC+uW32wL64rQZnnDyUPbaUXZBpH9pvZ4pMleUFMXgFRgpRrc+py+Osf50kZwpBKxdrv2CvduOyeS4L89Y9zqQnhoMoeOrqhHpemn/pJR/V0hihtC54JXVUU2zqqXB8pz2ypS79abcym7kCCNKWZBCn8oEYh4pYgFfoCN4gXy5cgasZGHpIYsATReuidjpraHN1/kx1U0SVXxMrVSSeFFJiPZ9FoMRc/F1bxtl4QpwSpaKtjCSL0cAlC5OCrXGo4pjPF56E7RTwCMQ6nuVTtqHK2ZZcgjmjL6iSI1j17OqrzoNZVgtT1ghhdZsuRIJ7ZlaoXZI0liFClCxG8IMunUwkixy9UYVGQZYCa9xI2UJZ8h85Q4kHpJ3rOqbdBaftCPXg9EZMrj9nEkKqSW+giEJMkxWr983gkLvNqmkjrQIyS4SHar2rLKEH0D0XZUS1BKg+hIaWYqEhtE+apNJdNnNe8H8o1PnkrbemocrZllSBS5MUYiDE+imKVBSXVgRhtYyUAVCVB8r2cD8s0liB6CkhpoNMgQptcEPFvh4TwUheVqc4iajbJMiXIagMx7g3IBVk+S0hHzRdRqwRx7pUkun/Cnj1arOLigy26j6G2QSmF1jcdVejJrdE1SVS5DBodJHaPjsRpHD2Kx4uRtGb/PB49KpwiWZSklQRJpnFhMH9QJdugsi1Vo5QG5XTUUuL4ShBDmm2tdNSDr6Q7njQQk083L67flH0bBeKs9PzhhZuTy3flScrriRghoGJIHTRnqioBHEdbpkTLdNE1ZVqoUqAq2bNyL9cjJ/aEj0oJ4uqhoxtVEkT11gz5iRjry2X8qyyW3d2T4n9ZRCYoL0iKFmOVE89leCKmG7qWII7wioz0yIkWrJElRbn2Ox9tFZd5SwKKv0FBtUym+bPHtcbE+MBLlI7JTDDYRoIk5peZzhejPDNjNP55Pp45n5Wd5Xfj1ioh9vEoniaiQUdb+gZqyEbYURgoqwRReqi/wrXmEzFKwofyXlRrbZm+evdoocVl/CSIGm0p0RICzVXOtuwSRHpK9q9/nGYPrCaJvopLAQ7rM7QuCWLfS1r4v3k0F7pR4XGRHoop3TwtJIg8JkuUII3fC2J3Boj5GYppW5XJyWB/VW/RnlCRPYI7SAki529lF6bpCVtzleH5fPurk52v/kCB+NJxLgjAuUJ8UiZjlSFgws0rgNWkPWGOIW9H7QAkCEBz1FzUBAkSHKwn7Ql1DNVHkpMk8UgTAQEkCEBj3t25qzlvRV82v5S7xlS9XxSqOQdjyC/ltmOQvxEDAAAAoYMEAQAAgB5AggAAAEAPIEEAAACgB5AgAAAA0ANIEAAAAOgBJAgAAAD0ABIEAAAAegAJAgAAAD2ABAEAAIAeQIIAAABADyBBAAAAoAeQIAAAANADSBAAAADoASQIAAAA9AASBAAAAHoACQIAAAA9gAQBAACAHkCCAAAAQA8gQQAAAKAHqiXI//uP/6BQKJQeywqmQgBYPUgQCoUy9LKCqRAAVg8ShEKhDL2sYCoEgNVTQ4KsoDcAAAVMPgBhgwQBgIHC5AMQNh1LkJMHs0ubixPps9PtK8eH5s0dVQBw3kGCAIRNtxLkdPvK/vbT7I/D3f2rD86S5Gxv8/gwVSe7p5VVAAApSBCAsOlUgjw9viR5NU63r+xf2jze3j3e3ty/dGW299qnCgAgSZAgAKHToQQ529tMfRsyrxdXBdeIbxUAnHuQIABh050Eeb24qjozclfH5uzq5r7ZQWKoAgBIEiQIQOh0JkEOd/eVRFRyQQCgDUgQgLDpSoJIiahaFU/EAEBtkCAAYdONBDl5MCOYAgDdggQBCJtOJIglERUAoAVIEICw6UKCGBJRAQDaggQBCJsOJMjh7j7JpADQOUgQgLBpL0EciagAAM1BggCETVsJQiIqACwJJAhA2LSUICSiAsCyQIIAhE3Hv5QLANAVTD4AYYMEAYCBwuQDEDZIEAAYKEw+AGGDBAGAgcLkAxA2SBAAGChMPgBhgwQBgIHC5AMQNiuQIF39HO7Z3uZ6vIb15MHs0pXaXW22V4A8Pb50ZT8rvY3G8E82Zw8HMYYdgAQBCJslSpDD3fSVIWd7m8eH6RJbNRtmy7BWcjuDmU9fL67a3wmbHkXd16U026tjnMe1Wlb1dZsPeUgnmxmfHg7/KCpAggCEzVK9IKfbV/YvbR5v7x5vb+5fqvVTdoafvhvSfDqgpbpTBnRcSBA3SBAAWHuWH4hptqohQXphQMeFBHGDBAGAtWclXpDN2dXN/Xo/JWOXIGWwZnNxItY3in9LoZ9yr+zF83pbllBRfmi2Pjw9vrS5OElrNxcnrxdXffYyNicetbu5dPyv7F/yUBUVx2UdqCrEHsonQJVBbfl8eqw60l4vroqhq5ongPOQOz/ZrGdUZs3+fTlOUVcPhW3Uj42dd5+iPYEEAQibYeWClNgkSDnVnm6ry08xXZ5u11iEjHspbWlTeYW3wLh8FjP77Orm8aHBQtU9q3SMzkPO15jUfo2fErQcl32gmljzM6iPhrqZZKTRCWDvZOcnm/OMsn9f3qeo5xjaO+91iq4aJAhA2Az1iRibBBFu9Q53pelYTOT0W3RPt5UZtrzPVttSDTaSINtPxRt3rfUKCaJs7zzkormyt36JOObjcgyUE+tmPgYNoyF/C+IGzU6AJEmcEqTLk815Rlm/rxanaNGoNIb2znudoqsGCQIQNkN9L4hHLoiwKpQebJvb34DFsb/91NCWunETCTLbey3uWE+CCAebVB+y4i/xx3hcroFyk9+pK7t7GTSNhriZdIY0OgFcx9L1yeY+o2zfV5tT1Nioo/Nep+iqQYIAhE04EqT2XLlGEsSwRDkPeSgSJEUTIo0liPClnzyYCT6AFotlIwlSv63VSJBKL4i980gQAFg5YUiQRpn/+tpTTuKqwS4CMU0liDmMUvlmqu4kiGug/BE67GXQkUp5fJic7W2qYamGj37UliDN2nKeUbbxrHuKqhmp5kCMXeYiQQBgpYQhQbKnBupOl4e7+0pqXh4ml9tSnrzIN7avQx1KEDV4X+A65MYSxHJc9oGqZ7nYy8OgbbE83b6yv/1gcdX0fE2j9dIrkbP1yeY8o+zfV61T1OfRYmvnPU7Rw91Vv24VCQIQNoFIkER/xtJvosxm1SvFO1iFtgRrhik7e2pRSgUwPec523tdMb9b93JWuQ65uQQxH5d9oFwo3VP2shl0H3Kxgd6HZieA5ZA7P9mcZ5Tz+/IcKOtzvJ6nTbUEyQ8BCQIAHTFUCdIza/9OJxgYnFFNOJeTD8A5AglihAUDuoUzqgnncvIBOEcgQYywYEC3cEY14VxOPgDnCCQIAAwUJh+AsEGCAMBAYfIBCBskCAAMFCYfgLBBggDAQGHyAQgbJAgADBQmH4CwGeov5QLAuQcJAhA2S5Qgh7vpyxzP9jaPD9N3MvJQIgB4gwQBCJulekFOt6/sX9o83t493t7UfrEdAMAJEgQgbJYfiKn3w+4AABlIEICwWYkXZHN2dXO/+Q+nAcC5BAkCEDbkggDAQEGCAIQNT8QAwEBBggCEDe8FAYCBwuQDEDZIEAAYKEw+AGGDBAGAgcLkAxA2SBAAGChMPgBhgwQBgIHC5AMQNkgQABgoTD4AYYMEAYCBwuQDEDZIEAAYKEw+AGGDBAGAgcLkAxA2SBAAGChMPgBhgwQBgIHC5AMQNkgQABgoTD4AYYMEAYCBwuQDEDaD+KXckwezS5uLk6YNAECQIEEAwmaJEuRwd//qg7MkOdvbPD5MdcbuqWnD0+0r+9tP65oHgMBBggCEzVK9IKfbV/YvbR5v7x5vb+5fujLbe23a6unxpSo3CQCcQ5AgAGGz/EDM68VVl5PjbG8zdZYAAEggQQDCZiVekM3Z1c19s6vj9eKqzTsCAOcbJAhA2PScC3K4u08iKgAYQYIAhE2/T8SQiAoAVpAgAGHT53tBTh7MSEQFABtIEICw6VGCkIgKAC6QIABh058EIREVAJwgQQDCpjcJcri7b3lTGQBAkiBBAEKnLwlCIioAVIAEAQibfiQIiagAUAkSBCBsepEgJKICQDVIEICw6fOhXAAAB0w+AGGDBAGAgcLkAxA2SBAAGChMPgBhgwQBgIHC5AMQNkgQABgoTD4AYYMEAYCBwuQDEDbdSJBpHOXEU++2/zX++kV070X80nuP1kxjqYfz5FdR8otR8j9J8odR8oso+cN8dX3xwtVD5WAAQgMJAhA27SXIfDwqV0Lpj0JkRPdeRPdejn9S9kxr9c+XxXw8iqLRWFIZv5UX+H2xbpr8IsrKr8a+jfzPuNwrteyFvS1HD+fjUT3RB7BWIEEAwqatBJmPR/KqXn5wFt97EX39z7zuX+Ovf+xzsZzGpuX6t1HyizhJkmQ/lhf4afKLKPltuvk8+ZWfCkn1R2GkMF7VNVdb1h6mm8uaDyAkkCAAYdNSgkxj1a2QzMejKJ4mycsfV+nhqMK2VP9hZF7gi89T9mMvl4ayl6JIPPdS2rL1MMcsrQACAAkCEDbtJEiuQNKIQJYKkn348kdHnsf0cRGgkbf56Z+jey/HP5URnNGzf8m7nsX5joKLxWkz7aimlRzMk18VbokkSVJXhEemiKIevIRL07ZKAzhCIFCQIABh00qCZGIjj71k6ZG5LsllhCwUJH7658ggQQQNobhSXv4oiZKf/jnO950+fhE9PhM3E83WVCBpZCQTAalEGKtCwYyQPZq6QKqVROO2ykbRIBAmSBCAsGkjQbKQS/5ghqBEiuV+/uylPR3VKkEEzxocbyEAABgtSURBVMdZXG7wr/HXgs5Q7Yj2lS1rr9GFLJgnvxL+4ykL0rxRnxBM+7aSJDEk5AAEARIEIGxaSpDReF6sf7kUMeSHZL4NTYVYJIjwiShBxP/LvPyxCMGURZYgtZboVBaMNf+EnxckTSZNUzeqk1gbtyW0ihsEggQJAhA2bSRIqjXy9V3817QcnsX3NB9GLQmib1zw8sfonuNxm9pLdBpP0R6QqYyqGBJLK30hTdsSTeAFgSBBggCETWcSJH/phk2BGMMo9b0g9kCM6xVndXNBjM+2eDwR81vZ7eGZDtKsrRKcIBAoSBCAsOkgFyR7HCaeZu9ITRfD+bOXoiaYP3vZOhCTZZaUtWU6apr6aneE1Ncg2rs6lMhI6uFQXvuhvD3st9rbyYx7VbblBgUCoYIEAQibLp6IsSE+JSvrA/GtqfITtk4JkiRy2of0rI1qU3aKNHl7hvDGUl0TZDmn2pvHilxUV63+vjJnW05QIBAsSBCAsOnmvSDrQJiv8EKAQMAgQQDCpuXbUZUVcD4eDXg5NP1GzHpTP74EsEYgQQDCpqOfqcsZ+noY1I/LBnUwADpIEICwaS9BAACWApMPQNggQQBgoDD5AIQNEgQABgqTD0DYIEEAYKAw+QCEDRIEAAYKkw9A2CBBkh8mn3z00UcfffZ4BXutNYsnkws3b1/46sUK9gJIzsHkA3DO6VaCzCbRxla088y7+WfxxlaUl3jmvV9Nfph8YlcLqZj4ZPJDfZO191odzx9euHk7LZefvPPd6+3R5Zu3rz83V6Ziooa1FnsBJEgQgNDpU4JI+qM/CRIeiyeTCzcnd96mf7247u+EcEoQgBWDBAEImx4lSLrxxmQFL9c6XxLkxXXF6/D8oaBInCBBYEggQQDCpgMJ8mZ8TXJmiBJkumN3cqQS5NpBnfepZhkYKaWm+GHyyUefTH4oa/MAibS9vufjz0zWkuTxZx99MvkhrS3tVu1lbE4M1bibE6oVtZS+gNb3zbMGwfHieiYs3t25e/vyk3dZfsbN2xfuHi2SJCkyNtTy8KC0mX8oOlSeP7xw92iR1t49Wrw9uuyzl7G5vCfVzaV+nZu3L6CWQgcJAhA2bSWIGkwRJIgmTXIVIuqSslRrEdmX8fizcq3Ol/5svdecHhVeEK1aEh+ffPLJZ48NFqpcK48/k6qlP8XOl9Ik/UC3W0uCLJ5MShGQkSmP9D/Cev/uzl15ja/wgmjbS+JjcvnuwwODBW0vhecPpQ5Lf8pRpFyapPZNRwpBgQQBCJt2EmR+/5YUTBEDMYqTQ/izoQRRlvT0g1R0/DD5RPI3qKt4Iwny2WPRsNZ6hVFl+8xPY95ZFiTatvVYPJlIHoUkUSWIUKuu4o0kyPXn2Y6Xn7wTPC72vSSU7YuumnpYNFf21i/ABOsJEgQgbNpJkFRMlBEWQYLk6kQpQuZHzUBMKThyymXcqCEckkTBvntZU0+CGOWSMx7UWaZKtRdE1RDCKt5EgkzuvBV3rCdBDr5SqsogiyUehNvjHIEEAQibVhIkC7UgQQxdVSqcKqNTCWJap6VckAFJEFdXPQ8NQgYJAhA2XXhBssjLq4ORmAtSqTBqShB9xS9X7qrAyyoliDmM4uxBtxJElxHlyq2qgS4CMU0liDmM4ozaIEHOGUgQgLBpmY6aPVjrm44qPa9b+4kYPYdTevClqFEzQ7RdVTqUINY8jjRj1tyFKglS74mYNLpRrO5llkaiLvBSVYr7JSIdShA156MgfVjGLIOQIOcMJAhA2LR+KFcIuEymqSOk1Bmu53UbPZQrplSogRZDkoWA6XFe0yO7Re6pVYJY93JWuXrZtQRJ5KdelWRPMc3CsNJnD9ZKSRimR3Ynd95WSBDrXs4qQ630RAwS5ByBBAEImzB+I+Z8vXqsBVXPxwIMiXWYfACgOUiQcwUSBNaJdZh8AKA5SJBzBRIE1ol1mHwAoDlhSBAACBAmH4CwQYIAwEBh8gEIGyQIAAwUJh+AsEGCAMBAYfIBCBskCAAMFCYfgLBBggDAQGHyAQgbJAgADBQmH4CwqSFBKBQKpZeygqkQAFYPEoRCoQy9rGAqBIDVgwShUChDLyuYCgFg9VRLEAAAAIDOQYIAAABADyBBAAAAoAeQIAAAANADSBAAAADoASQIAAAA9AASBAAAAHoACQIAAAA9gAQBAACAHkCCAAAAQA8gQQAAAKAHkCAAAADQA0gQAAAA6AEkCAAAAPQAEgQAAAB6oGMJcvJgdmlzcSJ9drp95fjQvLmjqhZne5v7l3ZPO7C0LIMD5XDXepiOKp2TB7NLV87FiNXg6fEl++lda3iTYoSv7F+6sr/9tGWvMjsr+77qdb77Hp5utxw0q9mK6cs0HwJASbcSRLrUD3f3rz44S5Kzvc3jw/RqzCcUR5WNw919/WLO5/EWiuH14qphelq5BDF3Y+l0K0GuPjir0XZPh1yDNj18vbjqHJB6EuTp8aUrs73XjXpixnKGL+NLadj5Lq/B9Pzs6ri8p68lSR+AcOhUgqi3fafbV/YvbR5v7x5vb+7L05CjyozxfgIJ0pKuJEgTQpYgp9tVd/C1hteov9uxOgnStPMdX4MnD2YOp1RN/KYvpxsMAJJOJcjZ3qbpts8xqdWZ70wSpGgRCdIQJIiLpj30We1qS5COv4vVSpAmne/8GqzWhfWoGCvLfAgAAt1JkNeLq+rdQH6vsDm7urlvdpAYqsyYpnVVgpQhZ0WsmKLLYnxaKGkTTQxmn28uTtKj84t8O7uhbVA3OcO4l9h5vf+2KhvWyH327ehjWHnIjYf3cLewJp+KZoMteujidNsWgvEceW3Ybau45VtWF2/T7uo2PofcJNxWu/PWHmZIYyh/I1VJJN05QjymL8N8CAAqnUkQ3d3abS6I4NU83c6u7bO9zXQROtvbFJcQeQ2Q3KHanZDDC9LAYD4JpgZrTHmWOyrZgvdt3NNjYZ3QO1/OjNLy4KiqRl8w8jHMPtQWZttNZMPhTVeF4gw823twWmVQ+Za1Q2jmErClPlSMvKmHimRR1LD1W24iQXwOuZ4Eadh5Zw8d3XNf5h5H54/P9LWE2BlAgHQlQRyJVx09EVNMMU+P83mwaPRsb1O64IU5V3WHqrLAIUEaGHx6LN2a+98JmbuhjWqjzD5H5/2qfLBIEPMYJkniGvkGw2tXew6Dag/9zo0KLD2pMfK6BZ/vQjG4DAnSjJqdd/bQev5Xj6Fxs3a4Z7ZhBxkBhkE3EqTTVC8L+XpzuDvbe3B8afdUlSDmObd02pv9t365IL4GGyegGbuhT7jeK4QQkhBcEdru5XE5qrywSBDHQmhXXQ2G195bh0Gtz8qAN5Yg+u2va3irTlH70Zm/5TWRIJbOu3uYO66MMd/qwNmKcrxWMR8CBEEnEmQliVeZBEmdn+n9hxSRcSgG15TaSIJYDQ5DghzuSvOvl84YkgSpP7yOpcVhcGkSRO9klQRxt2L8Lqzf8jpIEHvnq3pYVElCxNPrsJoUURJRAXzpQoKsJvEqbeXp4uruaZIkh7v72099JEjVfU9tCeI02K0E0T/0sq8GwpXVTonBe1T50JUEaTi8ypLmZ9CYktk2EGMJFjiGt/rW3LRCO75lxaDdndCbBHF0vqqH5g383BureQiLRFQAbzqQIEt/ejMj87Wm83ieTm/2qItdqnorkXGtbWqw+ZsAzEu+vLLaH7XQO5/HAjJ3t5AILObYelZ5UF+CWA654fC+XlxVngp5UPl9yT00vEys2WOc5q/JMbyVL86yrtCWb1nNd/ENcyTuQ+7uiRhX56t6KHW16IzPy8ds8RFLBxqyqvkQIATaS5CVJV6lE3d+e5EuOR4SJNEfODSl2buzBHwNtnkZkaEbedP5576zv2Aqe+hUuSfOnyvxrrJiepiz0jVVcchNh1dMCJBuQy0Gy+MVH7Tx6aEbi0vGNbzuU9S8qvl9y0qV/fuqPuQuH8q1d97RQ6VK6UnFZW7VNDaV1gwSUQFq0FaCkHgFa8vykhO7fgsWtGY1MxXzIUAtWkoQEq9gfVnm8xFVvxEDK6X7H9kxwnwIUI+OfykXYH1Y8iOa/ETIUCA4AjBQkCAAAADQA0gQAAAA6AEkCAAAAPQAEgQAAAB6AAkCAAAAPYAECZ/TOHoUT+tWweqYxlEBXwcAnBuGKUFmk2hja3T/zVAMzibRxla086yz/qwUTwlyGkePIrl4Lofz8SyKjoe8dHbZw/l4FImMxvNO7GaW11aCPIs3tqK8xDP3xm/G18qNu7zSAWCdGKQEme50PDG1NXguJEjGfDyLRotaq+o5lCDFoM3Ho85UyBpLEEl/IEEAwA8kiA9IECfnWYJ0qRvWV4KkF8jGpG7fO7/SAWCtaClBXh2MNrainWfz+7eye5prB/nqld4YTab5RBNt3Bq/KvY03gZJH5ZFWPtzU6Y7rbQzUjfaGNT2dUuQrHXxGMUZ1mHNPVAOfh6PrEGTaWwNqTiqEqMEmS9G0Ww8L5sbjX/WO1CW+NTYltKH0fjnZHqc1yr6QIgKyZ0xG2zRwzyy4u3JqJAgUpxGHltHldFUccg1Dc7Ho2g0npe13cWKLKQSpLz2U6qvIIsEUXaUlI1rBgCANaMTCWJe4POVNbtDEmcT1W1rXaclg4baYg4qNVA3Bg09rPSCaPNpqS2MbeVbOgbK2Vw8K1eW6XEUlX9OY3HlllwdjqpsJM0SRFjy5bYSu49hGguL/fQ4UrpRKo+fxyN1y1xDJMl8MZ5WGcx7mO01X4zk43J6QVpJkGks7qrXFX85qsyWyw0te01joc9iP3LtkX9f8fJEiCgIymK/AVDUhkmC6JdecS24ZgAAWEM6kiDZJJL9KeqMW6Nr6TSR/Tl+lcuF4p5J8+Ka742UOy3pz2zaKnd5dRALu9c1mAuavEuegRijQdNemX1JqxkGqg6CmMhcAjWrir5ZJEipCbS9zAu82pakM6ax5PkQGpXliKdBtYeqkRWlo0p6If8grXdUyZaljTJ/hmMLyV7+LSv5KVrbXsdlddZIrbokiGxeOuel3aUL0+RNzHDNAACwjnQiQdTgSzp95Hcz2hyRzjvC7Yu66BoVg+7nKFVC1WRU16DaQ99ckPQuLTuQ6Y48k+oeI0mCNJhM1WdY0uVCW25LxeCoKofFIkGEzfwkSBlkMURAJH+GdlCWRdZuUHN7yM6eZeaCCJ4JXVUU2zqqXB+JMRiDKlCrRQki2PGTIG2wXYDWcz7vmeHClF0dgk3XDAAAa8nyJYjmKc2mmAFLEK2H3umoqc3R/TfZQRVdqo5Y1XUpn8ZSToOXzli5BLGu+lYJookJL4M9ShDh7+VIEJt4UGI5qhekfwniOufznlnTUQ2P+CJBAIKjUwkixy+sAYXMeWveS9hAWfIdOkOJB6Wf6Dmn3gal7YuZ1OuJmFx5zCaRnqqSWzAGYupFXuTUCkkWKLka4paOqpzOJIhDTFR5QWqrE7Vq6YEYowRxSAgvdWEOxDgCLxad0UyCNArEZJguJec5n/es6okY6Uok8gIQGktIR5WzLE0rq2uvJNFvd+zZo8WMZohJC5NdbYNSZqj5Bs5GGn8ZXZPvz1wGG0kQKfshi8iILxnLqvLghUdVbri+BDFKmfxpFPPCb5cgqVyQnnbJ01HtBuUezsczJWHW0sN88zZPxEj+DTVf1K/KYrnsm6njUsJHFpEZlhfEcc4bHSTp7q7JwTUDAMAa0rUEcYRXZCrepShJinKWcT7mJ055lgQUf4OCaplM82ePa42JMfk/SsdkJhpsln+aLdVR9CjKn0eVH1ItHjnxrLK/HbVSgkidEbWF+kys9ESMRYIkiZz2Iekhi8HyoIpDcwxXBw/l2v0EYn6GYtNWZfI/KE/ZmNoTKrJHcIclQRznfB0J0upReQAYNB3nggD0gTPoAwAAgwQJAgGABAEAWD+QIBAASBAAgPVjkL8RAwAAAKGDBAEAAIAeQIIAAABADyBBAAAAoAeQIAAAANADSBAAAADoASQIAAAA9AASBAAAAHoACQIAAAA9gAQBAACAHkCCAAAAQA8gQQAAAKAHkCAAAADQA0gQAAAA6AEkCAAAAPQAEgQAAAB6AAkCAAAAPYAEAQAAgB5AggAAAEAPIEEAAACgB5AgAAAA0AOZBPnHT/9HoVAogy3v/fu/vffv/9Z7NygUSocFCUKhUNagIEEolPAKEoRCoaxBQYJQKOEVJAiFQlmDggShUMIrSJBzVu7Fj6IoKx9/qW9wcuMDW1VR5h9XbECp+6VEBQyspSBBKJTwyjAlyN++iDa2Lv7l+6EY/NsX0cZWtPNt/yPTVZkfX3RJkG9vzB2715Ag333+bRQd3fPu2Heff1sopCh6FH1w/F29fWu01XTofncxEvmlc6xqW15LCdL5BWsoSBAKJbwySAlyb2er2xmtrcFzJEF8yrIlSLG9jx5q3lbToZOEwnef/7IzFbK2EqTzC9ZUkCAUSngFCeJTkCBSWZkE+UemQuL5MtpqOnSyUOhQNyBBXAUJQqGEV1pKkJdfXtzYina+/e4vO9HGVrSxFV37Mvecf/vxxla08cW9fIaKNnZuvCz2/f7Gta1sl3Lykj4si7D256a2oo2tj/9m6ozUjTYGtX3dEiRrXTxGcWp2WHMPlLnci9UgxXeffys4DLKUDmvOh0mCuNNExFp5A2Nb0odlEcSEsTldRpj8InXbco/G4xsf1ImnVEiQ1JoxscNRZTRVDFRNg/PfXYx+eWNe1l78/HHtS9uruK8v+4mdavpirtAkvumqRIJQKOGVTiSIewJK55esfHGvrJKKeZ2WDBpqC9FQaqBuDBp6WOkF0e4FyynY2Fa+pWOg7OXLI4MOyBfde7EQvPjyyBDLcHhBbOqkVDySF8Tdls0zcS8WJIJwLBYJktls2pZ7NFpJkHtxFH3wu+9EU/Fe3tavBWXgqDJbLu1b9roXC33+8tflIeTZKtmWYlXHxU+C6Ce2S4LYrkokCIUSXulIgmSrafanqDN2Ll5LZ5Dszxsvc7mgTEDComv26xqnrezPTDGUu7z88mNh97oGc0GTd8kzEFN1b1eUzL40UxsGytmcHKFwBVZMcZNaEmR+fFFath2BGLXKLAtUg+WxGLY3Sij/tnxGo1ZxpKN++eso+rXYgVKgOKpky/LIp/6M4hNZx0hl7+Ni3/nvLkqeD6GqxnGl/NonsGUJxNhPbMeVYr0qkSAUSnilEwmiBl/S5TN3JJS1WUknLCHqoS66xhlN93NYb6q0Uteg2kPfXJD0Bi47kHs7spLQPUaSBHH131jEFfe7z7+V4zLzj+WoRBsJoi3tyiruasssC748ssVN3F6QJm35jEatoggFwTOhq4rvPv9luoo7qqyWc+MqpQTZ+1iuESWIYMdPgrQoTgliOrHtEsR+VSJBKJTwyvIliJqxkTtaByxBtB56p6OmNi/+5fvsoIouVUes9IGqLIUUOLnxwaOLn5+InwuZEG29IE4JUtGWXYKY3RX69vfiR/knjdryGY1axZj8Ee/9tCwJYvND7H2syZFhShDDiY0EoVAo//ePjiWIHL+wBhSyXDPzXsIGypLv0BlKPCj9RM9u8zYobV+oB68nYnLl8bcvIj1VJbdgDMRUpqDqJcuomB9fFJdeNU2kdSBGCYWI9qvasgdizK0b5U6mrpq15TMatYpdguiqosjkcFTZLTufkVGzSVpLkNaBGO0CsZ/YYuxVub6sVyUShEIJrywhHVXOsjRNQK69/vGTfidkz1MrZj0xhV6pamJQSqAzGHSUNP5y8ZokqpwGm0uQ1J1w4/NvpcdW58cXi2U7j0G0kiCaDigNVralKoC0pI+oGBwhsoyYfyy+naxZW9Wj0e6JGCnZU/ZM+FZZLJd9M+kAKeEji8j05QWxXF/1ZoCqqxIJQqGEV7qWII7wilykR050V60kKcq13/mgrLjMWxJQ/A0Ks+oX9/Jnj2uNieKXFjqwc+NvosEWEsTy8i7hHaPf3pif3PjA+fxqtsY7qrKFPIpS3SAadLSlb2B9UFZ+Iqb8UIguNW+raq8mEsTuJxDzMxSbtirp2doM5SkbPeEj86wU1h7f+KA3CWK5vpwndnm16teX8apEglAo4ZWOc0EoFAplGQUJQqGEV5AgFAplDQoShEIJryBBKBTKGhQkCIUSXhnkb8RQKBSKXJAgFEp4JZMgAAAAAKsECQIAAAA9gAQBAACAHkCCAAAAQA8gQQAAAKAHkCAAAADQA0gQAAAA6AEkCAAAAPQAEgQAAAB64P8Dd3CkgdslbScAAAAASUVORK5CYII=" alt="" width="404" height="181" />

但是子类LogisticRegressionWithLBFGS实现了该方法:(这样子的设计可以做到每一个算法可以有自己特有的优化算法来计算最优权值,但GeneralizedLinearAlgorithm类可以适用于所有的机器学习算法)

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAvgAAAHmCAIAAACJdG3CAAAgAElEQVR4nO2976sc153gXX+PXwQjBrPpN/oH9NKXBcMgAqLM8rB6JQiBta8xazBsREoIbSyMg8k82DAtRhCP2o+zYqIbtPjO1diazEQ3YVorX0WSFUtjJau1nDg7k3peVFXX+fk951RX366u+/lwsO/tU+dXdanP537Pqeqs1PnjH/9Y9sHdD/aOn7x1vZe6AAAAADqRGb/3JDpfvffKz0598FUfVQEAAAB0ZDWi8/nBqZN7733eQ00AAAAAnVmJ6Fx/62fH33q0fD0AAAAAy7AK0Xn0xsmfvfHJ0tUAAAAALEf/osM2ZAAAABgIvYsO25ABAABgKKzorisAAACA9YPoAAAAwGhBdAAAAGC0IDoAAAAwWhAdAAAAGC2IDgAAAIyWsOjM8qwhn0XX+03x0zvZpTv5/aV7GM0s13o4L1/Myucm5Wdl+c6kfC4r35kfXl+ikHpoDAYAAAC6IIvOvJi08632y0Jlskt3skv3i6dGPVWu/fqqmBeTLJsUmst8T9eIn+klPivK57LyuTytnS6lZuVzWZ1eLLQcoYfzYpKmlgAAAGAhic68mOju0L7wVX7pTvbT3zV53xQ//WKdU/Isd0nB9xoj+Vmua8S8fDErXyzKdyYpytKt1Kx8Liu/N9NqCPewOlw3SwAAAEhFEJ1ZboZIynkxyfJZWd7/4jCjNSF8QrAwEkMjvtcsEiUpS7dSxsE/y+sQjtzDBrfAAQAAQCR+0Wk8p1pDqbfo1C/e/0LYfzPbXSxp6cc8/d3k0v3iabvmNdn/Ri/6Vd4UVMJFYp1VRy0jiyMtNtOh1Lx8cRHOKcuyCuGk7BYiqAMAALAMXtGplaZZrao3xzb208iKriMaT383cYiOYipGWOj+F5r6PP1d0ZSd7d7Jdr9SD1Or7e45qxedmaI1lfQUpvoEwHQAAACWwCs61SJVc/OP4jsLqZjv3/dvRvaKjhLF+SpvD/im+KliM2Y9av3GkcuYwOGJzrx8UfkhQXTsjVIAAAAQjSA6k2K+mGUb4XHs26njNJbreERHeUUVHfVnnftfLBat2qSLTlcROCTRKay4TqLoENIBAADohld08kwRHfX/rkn3q/ySFY9JEh374AX3v8guCbd0DTqiUz0pR91lPEt9og8RHQAAgO5EiU7zkBqf5zgXntIjOv6lK+nBg0Peo2Md/Fmh3XUVhoAOAADAEgT26NS3XOWz+vnI1ZQ737+vmsd8//7SS1f1jp82t92MXG189gd1+r/rqrrZ22czaaWs5+ikrFvhOQAAAEsRuuvKh3q/t24h6hOT9XvFRdEpS307jnY/l1mnHuBJfdpMbSR6UpeTqucUG8rSrVRZak9GTrIcPAcAAGBJws/R2QTG+WA9NAcAAGBJhCcjG/PsvJgMeNJ1fdfVZrPE3iMAAACoiPhSz4ahz7qj+sLvUQ0GAABgXciiAwAAALDBIDoAAAAwWhAdAAAAGC2IDgAAAIwWRAcAAABGC6LjYPE86MFWOHwOc8iJbfF8IgCAI0R25e9uXP+H/Uf/+r//+M2fymjReVyc2c626jS5/HjFvfSymjmrmjjTbqcXe5JaYf2FG5tyY7+LLufQhfNxQsbN99623G9K+K1yZWqPWjCbM94w07q0smqOmrGJ7zIAwPDJnv7p3x88efqLf/nNJ7c++8M3f0J0OtJrT7TZfZyPfY7F+e3tsU8Z6l10FhnGAyqFDlkWNsvrI2e5ljHsJ3ICAGwq2eM//PujP/zb4z/8241f3f3Nb79MW7qanUN0alYnOkfbdFyi45QfX+HViI7xq1d0hCd28+hrAIDDIDt4+qcq/fLB7z+8/s+W6DzYmTSRm+zMjvmXtUN0tGBPtrWdndv3505nUVleIhaMXEsJjqWGespRM+x6tWJ1trmkYRSWK9TydbURRMdfpzSuSTFX8rVyQiddQw5kiUP2vCm1u7S5zfBd77AiOp62xDelrtJuy9eeKyNOdKTr80j7KwDAoZH9t/8+rdLfP3j2V3/7sSY688sXNGWxgjdRotMesJ9vGVkLmxGyJPwTiT0RLX7TstzTjW969U9MgYiOM9tauyiUTmkzvbby0WVcjRBoU32oQmlQ4QiW4wj/m9JYh7Kqo6hM9eria2bnxUSsOPBy05bSgLaAFOMsRjjGJzpi1MboBwAArILsV4+//vW/fv2rx1//w2ePf/LzX6iiU8tH6zEPdvKw6GjUqlQFderg0IXigXWckCXinZasmaedchx/mltTjateeakhXXSEEnpgxty96glAiOMyvKfNFCoUhxxeeLHHF3pTnOaw+KnVQlsr0kXHZyk9bUa2LzWlvFLU/SoAAPRG9r+efH3nydd3nnz981/c+exzdY/O3tS5XKXiFh11tUtbvdKDPVrNQpaEb1qyp2GfEcRHdNpJyTUlpYuOsIG17b4R9HGsTRlRESGi42xMqlAcsng2nEOW3hTz4La/jYnN8klR5Fk+60d0nG35a7Iy9PPrOb2OHTpuQaxPJq4DANA72W9+/+xX9x9//M93rt/8l//z9R+XFh3bcsxtOtoqVb5XxmW56S467oBJqN7SO8Eni05o+0ZTfdSMqvfMMS5RdEIbRbrpTr+iU92TNMuz6r9Gc4cvOsLyn4Kt0f5IGHt2AABWQfY3H+3+j//5T/d/++Srr78ptefoNMqiLl1NNGVxiI62VmX9apdNzTLwTUvSsom9wyO+Xv8B3SI6wtKVfnu5tDdXacLbAfm2oKjpNXXDTsQp0t8USXRm9b3XszzLZ5sjOu6N5G7RiX8nAAAgHvHJyLVw2LEZZ9imiv1UcaDoUrUkCVki/snBDoREuEJEvY4KXQ3GVFhFQ9SNM67NyMYCiFkoss/+wI2/QkcVKRt2gm4nvSlKf+vFNWXXi91fKbIXNLDOS1dRz9ExFh8X5eb6Y3Mcq1wAANADwa+AUMVlsYwliI6mRxeKvZ2JX3TaxSkhS8TcIWrNKc6dnv7n2Drqa4oaWb7n8Bo1ChUKfTTFwXEvlKPzwrjkFSpfhcKQ47McQ3OUCoqOLnqxp9f5poRFx1Wh96wHT6/3ZPn3nAMAQF8cve+6sv90HseawVjHBQAAsASIzlgWDcY6LgAAgCU4eqJT2ks8Y7GBsY4LAACgK0dSdAAAAOBogOhE8UuAjWXd/3oAANYJohPFuqcqgO6s+18PAMA6QXSiWPdUBdCddf/rAQBYJ4hOFOueqgC6s+5/PQAA6wTRiWLdU1UcP9xq77ja+qGdP/vu876sHlqOrnZ13eiB0DnsncSzMfvu88kdqy9i9bmFq78hT3+y4xArHD5DG3LMF+M1x/meg+l6rOrR5uDG9Nj5i8c+uhNb4PbVY+cv1slVKrlCL0/efd9fT6gb3Wmunx4vj0GJzt408psfutUc8+VZHoxZ6RDnwQ5458Kq989/d9Z7k5rohObi1XUjifq9dPeji08s0w1HL9xdWFJ0XIKzmgdLVhNamlCJPUmt0HjYwiY+a6HLOYyrqDo5qW96rOiorYpvZ19X3ePijOdbg5xzSvUgfvH7qj3UDnH+4rHzF1+68aR7j60602vzWkjXChOaSDwmhdV8HA1JdBzfhd4XfYiONSP9cGuYqnN4k/SCJNEZBrPvPp9tffe7z7tNZwBj2HDR6UKvPbG/GXcQY1wLdRjF/PKR8YuOe07pKDo7H108dn767pf1rwc3pq/e7tzl5enbMDo20XM3fJ9SS4LoRFFPMGuPQkSB6EQwqxRn5jGdAYwB0VkO+2tXhzHIdTDLs0lR5O3Xx02KWTEZj+h46VN07rzaXxSnDxCdBFYjOurXnjdfz1lLd2sbzRd55ntNlvM7z70VNjWc259fvmB+7ajaoqNCI2sa+vcWnl/cezuU6bTCmFR9O0J+uJU9/92Zkq1mhtbPXH31bz3RarM7KexZUbOyONHx1tb1RAlnI3gOn//uTPkhfA6tEavd7NINz6Ac70h7RN0xx4mqGqrqbE/l1g+XEx1hS4X9HbJ17dIWDaOY8OWsSmG5Qi3f9824luj465TGNSnmSr71xa6eTrqGHMgSh+x5U+o3uM1VIziTYj6rTWeW10ct8qWNM8bpiDuHba3Lio6w9nRu3/gkVw4T55RGdGbuicPDnVflzSi+PSu3rx57/9ODqvj5i8fOX2zjQOI2F3WZzNWuyzD8FWq1Ven9Tw8CbdVNtLlKEakboaEJbIzoOK4ww3XyPffPHtHxV+j6EvXmWt/PvRXaWWHR+eGWFM/RAho/3MoWvzXzUf2rXou3VDsFapNbk6Wtnjm6JYhGyNeMTcWBHnqGEg462Ed0P1HesyGcQ1Vv3KbjGIPxLmTeEUe/lfL5EiI62WKcypA1xXn++edrG9r6YXfR0XM0V9Cy3OESV73y9BaY/JzZs1yd0ct5USid0r7z3tiikj4ufY+kdaS7QmlQ4cnecYT/TWl0ZRG3cShaPpsXk0kxV64G4V122KKW5SkVM7xY0WmdxnxxcvnxUqLjnjgEmvm+Xb1quX312PmrO/UvuhI1U37lNwc3psqRFW5lUaJHzmCSEEoJRVm03gptPXn3fdVvnKrn8y3P2QixKaJTLRItBNn4tb7CpkWl0vrl6w4zChUurtdz+2VZ1nGdMzvzxc8Lg1GXrupSF4oH8aNSJx3lD+5qijGnSuVgc8FLmbKFUuZc6Qs7/NIyE2niDGTZlQXGZcZ9lhedDidKGIBwDrUqI2XReEWtwnoT1CrDb2W66DhP1KKh9pA6s76Ik0XHWqlopz2jjLNqV736xBndE2+2UEKPRKjHmL1VKhHHZczmuip4KhSHLJ8N9/hCb4pL5xb9mxeTPM+bH6vXAhWq/VMOFYcsvBaXqbKfNx/ds3PN57YV5vFte5CWrlwTR5AvP33JsRn5ybvvayKi2cztq1oU58tPXzJVKbz6s/NRnGFEVXjnVbU/UltP3n3fDvwELU08GwFW5Dm9i067iuQLmVTO4bqwnBelVKGx1Ko4UFVVu8il7dHRZT/q+nbs0GknM3tBw/sHvDIlCqUCt2ubJXsSHed07e6hVU0/otPhRAlnw38OjcZcppMS0bHLq4eG77xPFx3niVp0oz1kOdGxp2GfEcRHdNpFkg67hRzZwq6RtvtG0MexNpVpE7gU0XE2JlUoDlk8G84hS2+KebAtOuo1UOcKFTobV8JF/iF7Oh+dqbKf15/SdSR+cvlx9Xnefrx3Ex3fX+Mx1KGOZjpvl6WUpIqOPM27vWTnI73CnkTH5Uy+tqx6bl+1Alp2W+LZ8NLbLYZO1ig61oJRf6KjrospWVoASVvAUv/NuDD/Lv+lKTqeqSwwf8fGVowcY5LuRXQcFUWbwupFx1ebdDa85Zx7YMJRFqOYJEpHRXS8U5xYb+md4JNFRyqgdt9ej4nakxQKpgQzXBUn6U7fomN3egnRiRry0qJTfZhPZ3vTbGuan1vsrdFC8octOmVZy0E1f4sxkk6io1Te/NqL6Lg642/LKTrBiE4gYiSyqj3qq166MlgsuLpug6p3HBvLsUKFoYiOuSLruuvK3aiJNaWq01uCWBgrMuIE7vUR7y4acYaUsqL3qajNGusnKxOd0N5maU+Rq5ijPllV2ldiT6ra9OaKjrRsMo+4Zyf4mWUd0C2iIyxd6fdTazt2/Abm7YB3co//dE7dsBNxivQ3JVl0pAoNCbL2AwWG3NNdV7NzzW6HeuK4MDlj/p0si45zi8/SoqOsyAQfrJcqOua+ln5Ex7FqJrdl1nNwY2rtR3YvXXW+D2tT9ug4d4Fpu4ArE3c8+cAM3vg3Ixub5x3Xaxs36mUnWjORGHtdlf2scZOqOuv5S4WiEdr2j+VFx7sDSOihtQl2daITOr2+s+E7h47X7ZXJcA/NKvWGPTupnfhqtqOIjoNXKDrSxtSl5zmzQleDMRVW0RB144xrM7Kxf8UsFNlnfxTDX6GjipQNO0G3k96URX+dHddyPduP9f3MWowrYsg9ic5iXphcftxG4o1tmmpSlMU9p3QSnS8/fUmdvL/89CVlm061T9kdxugiOtrmmHpdaVnRMbfORLSl1/Plpy85xuhoSzobITZGdErPfd3KCmtFc43ae8p00fFVGLhelUt8OlO37lv/NkLrVuXiycjG6oUyNZrLIZ5ohGO7r3M5JLQatmhfjTO4lmQ0FUvNknqo5Gz9UA93OGoMttX1RPnPhu8c+vceP//dmXg27M1CRoft0ye+lfKZt46oKlmV6OgYG3CtV42MCn0KdFZoZDl6ox1h3E3kK+ruoykOjnuhHJ0XxiUv1/gqFIYcn+UYmqNUuuhoS3vON6XtSB39UeqJHLKjVkdnBeq/WrW/kIW/Wg1lccwpXSM66i3T1kRu3r+t3XXlFh3HLd+LiIu+6/ngxnRRoVCqW1Z8W+qQpQqFsxFik0RnfLjmKThKxAR9hkp9Eff4EWLe37O6tfXDZazjGiCcWHCB6KyTdU9VsG4s0XHciDdU6ot4laJjG8JGMtZxDRBEB5ys5sJAdKJY91QFA8BcutoMy/nlir693FziGYsNjHVcQ8G1NgmgYu4H6wFEJ4p1T1UA3Vn3vx4AgHWC6AAAAMBoQXQAAABgtCA6AAAAMFoQHQAAABgtiA4AAACMFkQHAAAARguiAwAAAKMF0QEAAIDRgugAAADAaEF0AAAAYLQgOgAAADBaEB0AAAAYLYgOAAAAjBZEBwAAAEYLogMAAACjBdEBAACA0YLoAAAAwGhBdAAAAGC0IDoAAAAwWhAdAAAAGC2IDgAAAIyWIYrO8e2Tzp9Tywo1RB62TKnUni9TyiieOpYlGwUAABgsGyA6apIPVn+1fxBK+Q4L1hkpOsYoIocTLCKMIuguiA4AABwFBi06wXndfj3GRdSsSAVRIyWRihA8LP5FgaDnxRSMPM8AAAAbx8pF5+7OK8cvfHA3IsuYpONn386iE1N5sGBMuOVwRCfV2+K7CgAAsKGsWnQ+eWP75Bv7sVm+kEn87BsUHefrskX51MFXg/NI2T9iVrWCxPtK5zgQAADAZrFi0dl/6/j2W9ejs1JjOTay6AQVRK7W6J4sFoIGRfY/dVktSd2cNQgdAwAA2ERWKjqfv3fh5KmdzxOzAktRapYzNBIsGN+EXGfvouOTraAbRcaNfK10jiEBAAAMnFWKzuMPTm2/8t7jxKxOIQr7Z9mQgj9HHhxsRVYQp3DIHRZ6GHO6lo+ZAQAAbBArFJ3r05O+bchCVoeoRpLo+NwiuIYlvOjL6qwgTovq4GG+g40jER0AABgrqxOdtG3IFR2iIGWK6MTX4yvijDMFAzO9iI6zrDC6GGkTFAoAAGAErEp07u684tuG7MzyxT/UA3xtLRPRsY9MCpwIHXP6kCxMvm7L0hbTSWff5BMOAAAwAlYkOh23IVckrfiU+rQdEwUJNierzDKiEywYHLtQSaroCAejPgAAMA5WIzpdtyFXBIMZ9vGCrAgLUr627J9lB4oMAsWLTqTNyH22K4+pJKY4AADAprAS0bk+PXl8+klq1oLOS1epyz3xPlHqumMcFhmbSYroBF+0s+ylMXt5K7IniA4AAIyDVYhOl23IKvFRE7mgUJvzmJigUWQEqPSIjuwfvt7Gi47vMLmVyL4BAABsHP2LTuo2ZJtuAYaYvTLdikfKR0w8KdjiMsGVVRwJAACw0fQuOkttQwYAAADokZV/ezkAAADAukB0AAAAYLQgOgAAADBaEB0AAAAYLYgOAAAAjBZEBwAAAEYLogOd2D17YsHZXTv/3vS0L2spZnmW5bOeK92AtgEAoBsrEp29aba1Pbmsf6XVg53J1nZ2ZmfuLfa4OLPtKHi43Juedk7Q6tTun+D7aWsF1OZx4sSJEydOT+/1WatfdPprqCzLspwXkyybFMYF5LzYVsK8mGS4DgDARrEa0Zmdc/nKCESnbyc5LNHZPatZx73p6Z4aPURTK2e50zLcF9uqmBcTVAcAYIMYlugMghGKzu7Z3oMrNYcnOl7DOFzR8foWAAAMkp5Fpw7JmOncflm2ojO7fKF+vZUeraA1aRnVTiNnGW2xSZ+NXVtM1MUdR0FZdPx7VrRqo9oy7UFreffsidPTe0p7WmvubuyeDS20KeU0I3J23hyc8br3VNybnj5xenqvrVOXL3ttUMmf5dailXixlft5c6lUJpRtXSgelGVZL3W1117167n2q2ab47ezre18zz5XBHUAADaIwxcdPTVOI4hONWMli44QazDFQT+uQ0RHqHD3rDJbW5EVd1sh0fE5kb8bjVs4wzrWutY0rvP+AXiyml7UL2oVWgPRizo8J1J0Ko9RrxxJdBx12q6D6QAAbA6Hv3TVTCrzKq6jr2Q5Ctalmj/Ho/Eu19RxBe13dVaN3ozcVBKq0KgjLFVh0Wkz28ajxmVHUuIXn1ymly46hjrVBxgHm2OR1MKzdFWJzoXJmcpU6l+LB6LoOLPsxdZ5MbH3RAMAwBBZ4x4d1yziKqj/kR2/xWcxsRu6Y6+QnIgWHeeUHqjQzO5BdLp0wzgti5MSvyLnqi9ddDzjkiM6klmIouO6YPyiM18sqsoRREI6AAAbwwaIToW2gOXaOeHB1p3QpuJOouOr0Jiye4roJHfD3yspoBPofKB4B9HxClXniI7rUulHdIjoAABsBKsUHXWDZ1kuKTpizUHUKTa0VpMsOoGlKq+yeIs61nEiRCfhBij1UP9G5VDnA40mic696Wmx7649Ok2W+5JQ1qoM6l0701lpLqd616p0COgAAGwOqxEd8y9j/a4rh+i49ikLWboJzfIsC9zxa+97DS3X2Nn+iIm/Qm1XSr0MZN8lJZmOsYG3UzeMx+YYW2XMYovNyMHOl/2KTkfTcV9sgug4Lzb/ZmRLofAcAIANYmVfAaHeo9uv6JiLEdXjas2px1gKMfbpmHd3G1Os86ZqcWnIW6G+BdgRuHDfwK3dgq2V6tYNfa+NVV7NVk6Vv/Ou2+Prgv6sqLvJfL2UHl/juNgE0SkXQZ3tbGs6qy6w1mYs1zFEB88BANgk+K4rGADm/VjOEM8gntSH5gAAbBaIDgwAS3Rs8ylL33ddHSLCViEAABgkiA4MA3PpyvOVFXx7OQAApIDoAAAAwGhBdAAAAGC0IDoAAAAwWhAdAAAAGC2IDgAAAIwWRAcAAABGC6IDAAAAowXRAQAAgNGC6AAAAMBoQXQAAABgtCA6AAAAMFoQHQAAABgtiA4AAACMFkQHAAAARguiAwAAAKMF0QEAAIDRgugAAADAaEF0AAAAYLQgOgAAADBaEB0AAAAYLYgOAAAAjBZEBwAAAEYLogMAAACjBdEBAACA0YLoAAAAwGhBdAAAAGC0IDoAAAAwWhAdAAAAGC2IDgAAAIwWRAcAAABGC6IDAAAAowXRAQAAgNGyrOj83//wH0gkEolEIpFWlxAdEolEIpFIo02IDolEIpFIpNGmQYjOMp0AAAAAMEB0AAAAYLQgOgAAADBaEB0AAAAYLYgOAAAAjBZEBwAAAEYLogMAAACjBdEJcHz75Lq7IOHsXoc+JxVZpn657PHtk74U2Z/4hpw/xxwfXyr1yCUbAgAAm7GJjjGBRU6Zwlwy8GnGOTR5yMu70ZIi1eFsd7OWyIZWKjqp/RF+AACADoxNdMqu1tJtil0vzrkwZoJcMmywuohRjxEduVHhsMiT07seVVnqf+MbAgAAH5shOnd3Xjl+4YO7cVn2vGVPHjaLY7rNtYfPMv1JnYBj0pJF5G7ES1sH/5CtwtftmLEsKW2RDQEAgMBGiM4nb2yffGM/NUuj8wzhKPj4g1PuRj9/74I2J53a+bzN3H/LnPCmn/jKqpXf3XnFXWHTvST/iCybfE5CRBbp0KUOhuo7LTHutWhOOEauwXmAr9uyhAEAQJBNEJ39t45vv3U9NWuJidyoxHxJFp2Fvjz+4JSqJkJXH39wavukGpe6Pq2PvD49eXz7lfce16/f3XnFaLdDeCDySOGAmNk36Fhyc5H4ZE4Wo6QiHUQnaJ+Cfhn1IzoAAEsyfNH5/L0LjkiGM8uYQmLmZnviCU/JkaJj/OoVnc/fu3DSszD3yRuuKI7RvWWCGcHXncdEzr7xbhRpBk5H6UV0IkfhOzj+rAaPNH5AdAAAlmTwovP4g1NKSCMmK0l0ggesXHS8tZWV6OgrXFK343PjJ2DnMT4plIvEKEiH/nQIzySFl3wHJ11RvoJyVUJ0BwAAIhm66Fyf+qId3ixjco2Jc5ShyUYjUnT231JXnbyiYxym02zQ8R6QGtGJLBVzDiPbKuMsx27L+Yp6sPGD+qv8Fhvvb1KvnNdG0F0i1UroNpYDANCNgYtOl23Iy0d0Aq/3tBm5yr2788pCgJR9x4rZVDt47ArFbqeONH4eDWqNs+aYsIQQzBAKxouOXSTpYF8n7RcNTfSVlW0yaUQAAOBj0KKjSkB81ppFp11p0heePBGduzuvmAEbd4yntijDdZKiLD5H6WYtMaWC74Wze3YEKEmPgn2Lr9zO7aaJMWoonCIsBwCgM0MWnYRtyCryH8q+Kcc3/S8hOrqNSUtXem3+xazr05POSpLcpfMkaptBvCKk6kJ80CUmxCIUCR6wpOg4dTNYA6IDANAXAxad9G3IFT1GdNwTTL+iY+849ouOWmEwliPEdXwDlGMtvhqcohAjE85j7G530KkhiE5S8EwYb3z8DAAAbIYrOten3huOhKxSnO18c0baXJKydBX1HJ39t46bR77y3uOyfPzBKXWYxoN5rP7Lr9hZkaGFmMqDSzPBXJ/cxEd04r02VXQEa/TV4DwmeJhwthEdAIBuDFZ0Oj4NWRYa54vyrOaY4ZTdwU2qAjDmZmRrQcr7bEOzzsXdZPoWZnnzdfBFNSs+ApRUudBcUp12KSEW4qvBNxyfqDmLCFYUM7TIU1oqlhNvbAAAEGSgorPkNuQyYmUnqYeDJTj9r6Js6tnrcLZ9gtJLwKPHd99nmWOUJhcAACAASURBVEmXmX2kb1CjuW4BAA6NYYpOx23IAAAAACrDFB0AAACAHkB0AAAAYLQgOgAAADBaEB0AAAAYLYgOAAAAjBZEBwAAAEbLoEVnlmcN+Sy6tm+Kn97JLt3J7yf1YSlmudbDefliVj43KT8ry3cm5XNZ+c788PoShdRDYzAAAAAbzGBFZ15M2vlW+2WhMtmlO9ml+8VTo7Yq1359VcyLSZZNCs1lvqdrxM/0Ep8V5XNZ+Vye1k6XUrPyuaxOLxZajtDDeTFJU0sAAIChMlDRmRcT3R3aF77KL93Jfvq7Ju+b4qdfrHNKnuUuKfheYyQ/y3WNmJcvZuWLRfnOJEVZupWalc9l5fdmWg3hHlaH62YJAACwoQxTdGa5GSIp58Uky2dlef+Lw4zWhPAJwcJIDI34XrNIlKQs3UoZB/8sr0M4cg8b3AIHAACwWQxSdBrPqdZQ6i069Yv3vxD238x2F0ta+jFPfze5dL942q55Tfa/0Yt+lTcFlXCRWGfVUcvI4kiLzXQoNS9fXIRzyrKsQjgpu4UI6gAAwAgYoujUStOsVtWbYxv7aWRF1xGNp7+bOERHMRUjLHT/C019nv6uaMrOdu9ku1+ph6nVdvec1YvOTNGaSnoKU30CYDoAALD5DFB06kWq5uYfxXcWUjHfv+/fjOwVHSWK81XeHvBN8VPFZsx61PqNI5cxgcMTnXn5ovJDgujYG6UAAAA2jWGKzqSYL2bZRngc+3bqOI3lOh7RUV5RRUf9Wef+F4tFqzbpotNVBA5JdAorrpMoOoR0AABgoxmg6FRG01iE+n/XpPtVfsmKxySJjn3wgvtfZJeEW7oGHdGpnpSj7jKepT7Rh4gOAABsPEMXneYhNT7PcS48pUd0/EtX0oMHh7xHxzr4s0K76yoMAR0AANh8Big6tdPUt1zls/r5yNWUO9+/r5rHfP/+0ktX9Y6fNrfdjFxtfPYHdfq/66q62dtnM2mlrOfopKxb4TkAADAGBig6rt04Kur93rqFqE9M1u8VF0WnLPXtONr9XGadeoAn9WkztZHoSV1Oqp5TbChLt1JlqT0ZOcly8BwAABgHQxSdkOkMinE+WA/NAQCAcTBI0THn2XkxGfCk6/quq81mib1HAAAAg2KYolOqT0XOhj/rjuoLv0c1GAAAOOIMVnQAAAAAlgXRAQAAgNGC6AAAAMBoQXQAAABgtCA6AAAAMFoQHeiNebGXZdey/NEhlII1M7qb8xaPYh9shUtiv2ND6yFEMpB/fOvrRnLLiE6Yx8WZ7Wxre3L5sfeQvWm2tZ2d2z/EXlXUfauS1MOemB9Msmu+K6xSlknxLK3KTqWOFt4HOGpPYTAfxFB/eYqCVoVWVs1RM9xPdljvs6NW8zjLatRpgxJ70qVC/5uyPD7R6e193OTHjIav+SGhvZXiaVc/A7Qn0xlFOj07LUE3+r42qvcrvkJEJwyi0yKKDqwKWXT0j7z240r4HLKmuFleHznLtQzXwzrX/TTw4Uyo/fbE/6b0wsr//h7O+5JIxDU/LCJFRztM/Ve7+aKTWiWi0wtrE52a2TlEZ8xEio7xq/dzSAjIhD/w1j+drb8HDX32ZOVRMkTHw+Y9CT4+oqOgHDcK0Un6i2u4ouOKVTzYmWxtZ1sXigftccYcX/1apXxvcdR+vrWdbU1n7QGLSoQsOV6i5Rqi4+mGh8C4pIacJyGCemdMldr9Mc+KybVJ8azNnRzM7ePbdKu+yma3XLWV5exWNjmYV7mTg/n8YBJTytlc05Nwc+WjvMld2cdu9Zad259fvlC/KWd21I8JxwWwN3W8R009cmv9io70oRP87HB+Ig7kbCwy3Ws/9lJePRB3fN9ZTP2T2KYpLFeo5TfnUp4J6q//a8v5lhrNKowx63/fRw1Zv7omxbxtTuu7/2x04TCvqNA17z6H5htm/GvzviniWym9L763smfR8b7LgW54hhy+NnxDlk9U0tAHKzqVfGipuoKtGb3VFIcQtJLRHFaFXupUlRKyBNFx9LD55yR0w0vquIx/z4miMy/2WtuotKDWhWfF5JpiFc+KiW4SgYiOdbymOHuTya2ZowarlMHsltJb41e1860ANf+c97SCfVK7qfNN8VwAzs/cBzuTiDcuUnQMCfGJjvjXW/PB5DnAXXYgZ8NxOvQPXE1ErBpc9cofpYEPWme2tU5SzJqX/X9SN5/2jnlqlhtvub52Ka9kunooL3i0v1o97vOv9kO9oqRr3nsORdEJvCnet9J39UpvZexpV6oIiY5yMqRPmNghC50MDNlzooLVWgxSdGqLXyh8rSDT2eJnI6u6uJ1Z9a+VN1yYnKmco/61eCBn1dga0fydMZ2ldcOPMC6dumk9K010HuWGasxuZdleMS9r51BiJ6YrdBKdfFYXnBTPHK0HRMc4vo45tT1Se7horu3tXige6/6TI/SPZ/FBfG6/NK5Y7wWwnzfHz84115jzz1B3H72ioyBvRlY+yezIhFLU/arQkYGcDWsqNz6+reBEuF7ZP9JFx1ci8KYYZubs/uJApRr1oDjRMUuZcQBBpFciOodyRZXSvwTPOQxEdFSE2VxpIXDmvW9l3GnX/DooOuaHQUQ3hCF7OykMOfKa9/9L0Bmk6FTTtrXwVMlHpfO1iLQXdCsfRlLDNk7hELK0/qj/WsweKl4idkPAO66ydP19s4TotFrT0OqL01SUg7uIzl4xVwumic4sN7LaZSnPCtqKQjgG1Tvi0ln/BbCfq5/I1fu1N40J+MUuXdl/EvnmVP3DwT2d15/95ieR43NlGGfDHoUvWh8f0WknQNfHabroiMuJ/jdF3A1hCq3nT+A40bHX97w1rl50DuuKMsbgj3zEi477TbGPK70l2mLyWxlx2quqte3WsX8SKFmhK8o7ZG8nhYstcM3L9doMUXTqyKRHdOoLfXL5cdle2e3rsui4rnghq8bSCKuHPYiOd1zOKO4RER2HuNjF5eNXRJcP4uqyqRZJp/m57ezMzuzyBSN86CRWdIRIuII9zfvjFo4/q7wRnXWfjbDouD+EQ/Wqpb31x3XUX0B+U/wf+ka59sAlRMczoqGLTvcrSqc9pV1Fx/ummL+YzQpXX2fRqa7dwELS0qIjDdnbyaC/R4nOhkd0LINZuELjAYatS4tEjgWpiCytP3ZEp7YNPcoau1bl66Q1LmOtavmlK1tWWj8wnaOPpauuouNeeBLXubqIzjJLV84FSv8FMDu3nW1Ni8sXsnP75d60WjCNkuBeRceeVP2i4/o49+3RWffZkGbteTEJvqfBido6oFtEp8ObEv1WKgc6dmxFiE7I9tYuOqu4onSUcQjn0LEYqp5574nyvpXC6RPfSvm0V0ETM9v8Z+wLfUafDXHI3k6KXY8Rnc3eoyPuRCvLZmXHuogdm9QaIegkOs5QivqPzd2W0I0A7nEJbQk9FNvJrxn7eZtdL7pGtBtrFuibf016FB1zL86C6oYszwfCACI6wgWw+GO0jdvFOXHK0lXUc3SMHbHqH23Wx1PEKtdAzoawgTPmEzF4jD12v7f4Kqy8Wp0gC7W/nq3E8uyo7eTRRde4rywsOlYH/Qc7t0SJV1z8HcyHeEWJ17xwDh3hQtWBPG9KKHDjv7B9b2VAkGKiuv5/KbFnQxyy3WDEkGNEJ16thyk6ZWnc1mSuKzUTfPQt332LjhZBnc7MDf/hG8LdeMal3Et5odhT2uooOmXtOnVSfKK566pJrr+bq1vEr6mbY1w3n+8V84DoeEuJWY5c7a6r9YtO6b0AamdVd5tFXRuOqJN+i4QzECV/UhhFtQ8zT4VtvvHyQM6G2f3I50S7YnrqJg1PhY7C6qe+t4dCH8U3RVpQWhyuR67avHymBbXkHnquqqDouM+GnhMZ8TncK0q65rVzqA+5zTLPvPCmiP8q/f+evW9l/IeDUaXnKhQ/UuK6YV2HdsWugTn6J18tCSHE4YoOrIPQnd4AgTDGILFDU32us0AMRsBqI4naN7LZbMw/jKSOIjqgguhABI4lrWFjdXjjRrDpSIsUmwOiMxT82wqdIDqgguhAHBv3kW8uXWE5h0W9ODGGE75xV306GyE6ye8DogMAAACjBdEBAACA0YLoAAAAwGhBdAAAAGC0IDoAAAAwWhAdAAAAGC2IDgAAAIwWRAcAAABGC6IDAAAAo2VYokMikUgkEom0ioTokEgkEolEGm1CdEgkEolEIo02rVN0AAAAAAYLogMAAACjBdEBAACA0YLoAAAAwGhBdAAAAGC0IDoAAAAwWhAdAAAAGC2IDgAAAIwWRAcAAABGC6IDAAAAowXRAQAAgNGC6AAAAMBoQXQAAABgtCA6cPSY3cqya3XKH9n582LPl9XWkQcOOAoc3JgeO3/x2Ed3eq53lmdZPluykt2zJxac3U0qem96ukMpb00d6lmi890qjBny7tmeOpNMLxcEHF1GLjqPizPb2db25PJj7yF702xrOzu3f4i9imNvGuj5IVe42hNVv1NV6nPUAs+KiSQ6k+KZUDhBdOYHk+zaRn5Mf/npS+cvvnrbm1+Jzks3nvRYZzkvJlk2KeYJdUp4VEM0kGrWPz29F18krfWOxXfPulwkpQ3vse4h6ySIzpLjtpgXkwzXga4gOkMVndm5nqf8ZSs8QqITA6Kzmjpnec8TWhfRSaqp9zJCcZfpJDWxVH/WKDpl7Tob+c8I1s7IRScCRCeSQzlRvY9aAtEJceiis4LJbFSi4zCdtBY2WHRWIMFwVFiJ6Lj+On+wM9nazrYuFA/a44xZrfq1Svne4qj9fGs725rO2gMWlQhZcoRAyzXmb083/FRDO7c/v3yhLnhmp4m7Cz30ddLqW1IP6/OsdmOZCqUT5T0V3nc5XFuS6MxuZdmetsQxP5goS071VhvvXhyX6Mjbd9Rc/QBnW9qLbbo1E0vVDU0O5uWjvMnVPt61btxa4Qe/ICW3rx47f7FO9h4dNff81Z2yLBcbesxU55ZlWc1k5qLV7tkTp6f3qi0mp6f3tL0kroCHObuax9QVmDRHCHtZIla7rIJ1mTbXWBwKbJ2xmzRNxzjC0w1xDHIf1FxH0+brgdMr9LB6o5X27L4Q1IFu9C861dSupWresuawVgKck3Ez4zaHVRGFOlWlhCxBdBw9bGZcoRt+VLcwKwx23j5RspdIPWxNq58KhRPlJfVdNpwmLaLzKHfYRjPxz24pm2we5Y49N0JEx+dArVdpER25LU9ER+utMZZGZapS2pGHGR8KR3SevPu+JTpyKSHX5TmlpjinT5+ureHsbtlNdOSXpWyhyO5ZRWB2z7Y+00zr9e+6pmjdde6/cTSpH6cf4O1GzBh8DtTWYfRXaivqrNtnw++wFZgOdKJv0ann2kVIo57gp7PFz0ZWNXE6s+pfq5nywuRMNQHXvxYP5Kwae+JsbGA6S+uGn0Z09NiVajOOHkonytPzuBOlFHmwkyvFUyuUTpSA8C7r1PXrWYlLV7orSEtRrpWmJNF5Vkw0fRGWrswst5o8yh1xmkakZre0KM78YKJl7SVu1a22cpqEJ4xuonP76rHz03e/TK7TPYstZsN709P1bLqYcAcjOnaX6+PaTlt13Jue1uQgtklVD8QuJZwNd5bZQ2Hpysxyt2NVoAqSYXpm4xXzYtLjRnU4KvQtOtVEZS08VfJR/UFfi8jsXPuzHYpwRD4cwiFkaf2ZWPN920NlJha74acyG3O5SlUxRw/FE+XueaCHIS1LrVA4USLed7k9V/4QUeoeHdUhVBuoKsuv+VaayrJMEx1LVgybkdpyio5n3a0+bHbLvyb1rJhUraTqTjrdRKd68fxFt+7IomNPYou5sJ07hyg6xgqP10Taqd0s4VqucTbZGoFnZctfX5LoOPtu7oz2tOXtuO4u6mFRO4AI6UAXehadem3CN39X0+rk8uP69WZWjhEd1xKSkFVjTZxWDw9FdKweBk6Uq+ehE9Wz6EgnSsb3LotrfFInRRbCMS/2ssnBXH1dcYVlIzqi6ATa6ll0lB6uWnc6io6SZetOl4jO0EXHCEaYER23LMRM7P7AyOnpvdA9WctGdETRCbS1StEhogOprCaiYxnMwhWamW9v6phE3ZO0Y0EqIkvrjx3RqefXxdTrXLqKRBcdfcjeHoZOlN7PBUIPjRW06hV7x3F0hdKJCuB+l421qj6Wrspy4QTPiokqE+b2naWXroydN2r9obacomO/qMpNWHSCQ9AaO9SlK/mALnt0IkXHObseguiY22sE0VEWZGJWwjzHVOdkN3Dv+dJLV4aYqPWH2op8K0x1CokOAR3oRO+bkV1/tVuecWFyxoiUuDbMavt5E0XHGTyopnNtX7DRltCNbkNO66FrL1FCD9Wbp+zOJ1conagA7ndZqFB4v4I8yrNreXEw0czgWTG5tgjw1OtKS4lOOcsXFTY3Q9UHBNsyTaitUN+M3IpUrOg4N1n3Rw+ic+dV84mCd171PkzZc9eVV3TMLS8pizXuh+9JpeSH7WlbTTyi4/hNntvFzjuXi9zdCI/Bu/FZ3UZtjEtqy3167e3Hnq3ObvAc6MZKbi/X7tbx3f8cfct336KjTfnTWXNzeKgbfqy2hAWphBNliEtkD1WZ8GwMiq9QPFFR58R5U1VWnZM9pcJlRMfzIOP5waTZMTMpns2LPfGu73oBSMhSVouu5bNSrVBoyz7AXORSCionyis6Rg9XaDllLTr63eD1OpTrXnF3luO5yVq16u3lrieliKKj3q1c35hlZ7Q41k1ce2o8pRx5jiy5Gy53cmQHO+/2mOhuqBWKbbWZZ3dLtUKhLeH0loqjuYYkiw6eAx3hgYHLY+7RAYCu8FA4cIPmQGcQneVBdAD6o+fvuoJR4Ny/BRAHorM8iA5Ar/Bl1aDBBQFLgegAAADAaEF0AAAAYLQgOgAAADBaEB0AAAAYLYgOAAAAjBZEBwAAAEYLogMAAACjBdEBAACA0YLoAAAAwGhBdAAAAGC0IDoAAAAwWhAdAAAAGC2IDgAAAIwWRAcAAABGC6IDAAAAowXRAQAAgNGC6AAAAMBoQXQAAABgtCA6AAAAMFoQHQAAABgtiA4AAACMFkQHAAAARsvgROf49sngK0nFe2koqQ/dmuj3SLl4hyIAAACbyJETncUBwg9ytce3TzpTTGdWITodGkJ0AADgiDB00al+9c3BPueQFUSt0zCYmF4t4zRLDsRnVPEN2bkxngcAALChrFx07u68cvzCB3ejs5JEx3dk/PHGKz6fSBUdn51EKktk/wUNilE942dEBwAAxseqReeTN7ZPvrEfznJO2JHhltI1W/t0xCcHvracRwYDLTG6tqToCMRomU+J4oNGAAAAw2fForP/1vHtt66nZAmmEpyzS5ejOIuUlnzIciA0Yddvv54kOkkrVsH+Cz0RzgAAAMA4WKnofP7ehZOndj6PzzLiK75oinGwUYOvTuMA44dVi06kt/lej3kxRtqS9A4AAGDTWaXoPP7g1PYr7z1OyOq2dOILgaT6SjCYJC9dBfVC6IAxFufrwVfU4r6xOGNLQoUAAAAbzQpF5/r0pG8bsjOrw4pSt9d9WbIEpHYp6ECCTi25dOUbi7xKhegAAMD4WJ3oxG5DXuDzjOAmkqSITlBBnKtOyy9dBYfT2UIEp4npXrxUAQAAbByrEp27O6/4tiE7s+xpXvjBYJnXBSORi8hyEFNtkjzJ8tHNjZKaAAAA2ERWJDrJ25AX+EIs8rQdv9zTwUiEXi1TbWqAynmwrz9C/an9AQAA2FxWIzrp25AXpC4SCVm+6TxpX4uvJysVnW4HBzvZrQkAAIDNZSWic3168vj0k9SsisOZg307eIIdCO6wUetPii3JrydFp7ot9iE6AAAwPlYhOsnbkFV8O2BsaZCPkTfQ2E4TGRoRWrdHEVOh7wwEj4+UmKC3pa6UAQAAbBD9i07qNmSDlU6xPiORNcIZIInxCaEbSbnxlUeGavAYAAA4IvQuOt23IQMAAAD0y8q/vRwAAABgXSA6AAAAMFoQHQAAABgtiA4AAACMFkQHAAAARguiAwAAAKMF0RkRu2dPLDi7m1T03vR0h1LemjrUs0Tnu1UYM+Tdsz11ZnOZF5OsYVLM192dcaGe3Cyfrbs7fTHLxzCqZhQdRnAzf/lUfnMFfYKOZFf+7sb1f9h/9K//+4/f/Klct+g8Ls5sZ1vbk8v+78JKYm/aZ21Wzdk58SHPGvv51nbWpHyv/x61eFRDNJBq1j89vRdfJK31jsV3z7pcJKUN77HuIeskiM6S4+4DdX7RtESbT3VhEbLaAxyC8/sfTX78rezH/yVpEpj/03/MfvytyT8dpI2rbqtK/7H4fVrpitnPv5X9+Fv53fZnJaWMou5MWjdmP5eLzIvJ2pQgeAUsV/OGis5yfU8QnfmHr2Uvv72ZJ2mDyJ7+6d8fPHn6i3/5zSe3PvvDN38alejMzvWqTSppoqNZziBFJ6mm3ssIxV2mk9TEUv3ZPNFZTFOzvP1jVP/Urma2+kAhq31p7KKTUm0X0bmWB4qsXXT0K6An19lg0fFc9bEgOkMje/yHf3/0h397/Id/u/Gru7/57ZejWroaiuhUB29ND+lqHpXoOEwnrYWjKjqq6VgzTvuCkNX+vmbRqQnqgoQtOk03DoqffCv78beyn1/r1KsYDk10uszPRts92gmiE9PSYYnOkkPacLKDp3+q0i8f/P7D6/+8tOg82JlsbWfn9ueXL9QBjDM7zcmtAhvTWaMg2daF4kGVVcdyqtSqSVVbe1hZavqilVLMw3pdy20rSYyv+JoLVViJTnseAuyePXF6eq/aYnJ6ek/bS+IKeJizq3lMXYFJc4SwlyVitcsqWJdpc43FocDWGbtJ03SMIzzdEMcg90HNdTRtvh44vUIPqzdaac/oiyO+IhIvOu0rQlb7a5roaAGYVi9KRXQWMRVdeioh8C0n+XTBX8rTE1106l61ouMLIPkDS1UN+d3GmRaVWx0wTojnnC9Bdc2kVBUQHWEbUWiHkWdU/h08ngrrS7DNXf183cUKZu+cyl5ukyI6D4vX7de1F9v0zk2x1LKD2lTzXJbsv/33aZX+/sGzv/rbj3sSHbdhNKJTRzi2lTiHR3QcUZnWlpxC4xagkAZFuI65/BRToWo/bQoZj6Y4p0+frq3h7G7ZTXTkl6VsocjuWUVgds+2PtNM6/XvuqZo3XXuv3E0qR+nH+DtRswYfA7U1mH0V2or6qzbZ8PvsMuJjrYE4bGZSTGXstpflxSdhRbUSuGc9R2ljMpdoiOUuvtffG05Izr1r45STYsh0XGUOnzRKcvGJGKr09vWZdnOW/wmZLlrbg/0lJrlynVmXcvtkXoXV0Oy6MzeOZW9fqUpoEV0Zu+8Vjxsjrv5dvay8qs/oiOX6kzatTEesl89/vrX//r1rx5//Q+fPf7Jz3/Rm+jUalL/WnlJ5QoXJmcqD6h/9URrGoxwiH/NqI4hWVEWc+nKWWFIPpoAVbP8pHbDX+ESonN2t576Tk/vKRPuYETH7nJ9XNtpq45709OaHMQ2qeqB2KWEs+HOMnsoLF2ZWe52rApUQTJMz2w8GX0zsvlXuf7h1swWQlZbdomlq1ojqqm9EQLde35+rbSiLMavZVk6RcdfylyQCu3RqQaiS8/iSG1Vy9GNhejkdx2V9Lt0Ze4ddsdTEhxZ2IysWUnzQpUvZAmjMi8mYdxKA+a+IavtqHF5A0+esime8/DKRBMRYenKzIpbuopbC+v92hgP2f968vWdJ1/fefL1z39x57PPl9+jU5mNuVxV2UwTFPHP9C41qeIltQ/NzuluZAeQQqLTrqlpKbCBpqqqDfwoohOuMH3pqprw2rlziKJjrPB4TaSd2s0SruUaZ5OtEXhWtvz1JYmOs+/mzmhPW96O6+6iHtb3zev6NOT9w3zxyooiOq4Ihyo6rQFU4ZOf/Ghetos+WgoYhlCqOrjtniQ6P/nRXGtCGVTbQ6Eb5rgsS1vPZuTIP96NtpUoi+0ui2OFLOkl475AcyI2s5176WNFpxudLMCSFcNLbuYv+1a1BNGRSi3LkQvsZL/5/bNf3X/88T/fuX7zX/7P1388DNER1okENZlcflzXsKhcWiYL1JYoOvXiFKKjtmvcBS6JTvV7zMTuD4ycnt4L3ZO1bERHFJ1AW4MSHXGZQcsWstqySaIjrE8dnuhY3fNvRhYHtamikxrRcYb/ViM6vmEa150Z0Tkk0SmdLYYOl0TnZq7tvImM6ARKLcPRjOj8zUe7/+N//tP93z756utvyh6eo6OLjr7i41irMvDcJ9X4zd5UtQ1jrcq3dGWucyVqh6OqhWA5l65sVic6ztn1EETH3F4jiI6yIBOzEuY5pjonu4F7z5deujLERK0/1FbkW2Gq06pERwvqWJ/b7ZFCVkWq6GhrVc6lK+ftTl75aAkvXVkHG0tmIdFpSok3ZHUWHXtrTltBr0tXy+zREe/IaxUjymGCG91VzF0+S4vOMktXqWtXxh6am2+3ARj157KMFZ1QKX+ve702xkPvT0Z2RVkacfGLjjM2o5hBtWI1OeOKlPgjOmasRbgnK3ijuNRWqMIeRcfc8pKyWON++J5USn7YnrbVxCM6jt/kuV3svHO5yN2N8Bi8G5/VbdTGuKS23KfX3n7s2ersYLm7rpQlKMfGUfc+ZWPJqznALzpaqqZ21w4YUzhCW32DpaTbmvwbcYKiI/VQ6EZIdMzI05DvuvI+jCk+y1Oz3D1txbRew1pbRCd5k87N/OVTkw8flmXtKK2mPLwyWWQ1q1GasphOE1eqC0f6rivj9/5FR1mo6i465h7nBmW374Vir76z3XOAmiXdKO5D0abp7IHRllhhn6Kj3q1c35hlZ7Q41k1ce2o8pRx5jiy5Gy53cmQHO+/2mOhuqBWKbbWZZ3dLtUKhLeH0loqjuYa0OtEx16darO2g7qz2gCTR0e73U4BySgAAGmRJREFU/smPZvWt12Vpu4K2JOS9G1wSHX8pTS9+fm2udCMQPdJuvGpDVkuIjn5OVig6nZ+j4495qPtmjKp9Wa7Agv8x3cbTKpuj58Vkg0SnVpPs5VPZy2/PyofF662XzD98rdln81rxUMuyDmiXq4KlVj+kMbEi0UlcGAKAYXK0Px8PiQ1+tN444aofGYgOAPjhI/8QQHSGBu/IuEB0AMCPutKA8PRM6NnCsEaW+PZyGBq9iw4AAADAUPCKzm+f/plEIpFIJBJpoxOiQyKRSCQSabQJ0SGRSCQSiTTahOiQSCQSiUQabToaonMpz7L8vbX24e6b376WZVX69FJKke9cWf8JXE2af8cc3eiHrKcrf5llfxl3MTjSpfqukO41kEgk0hFIwxKdX715Zjvb2n7hb37lyv34O8qjh7/z97HV3vzBX2TZX7w5X23nL+ULj/nYbutSfi379q2bZsc+FqWnmvUdtR1Smt96IVsMahX+4ROdtCGHTuMQ0m92yuvfL69fNl/fffPbHU3l5g/+AsUhkUikiLQxoqNZToLoXPnLLMtWHCG4++a3FY+58qnlBPPvZNde+MFdo+DQZ+j5rReUgdz8wcd9u44tOl3SwE/j3XLv++Xezp/333GIzm9r10kON+6++e3shR/srn10JBKJNPg0LNHxp7//q2xrO9v6q8T5rNsskpiufGoEIaz4jXtGH/gMbYiO6XM9pA0TnV//9X868Z9/9Ou0Uv/4/XL/7p9/+9QrOt1cHNEhkUikyDQU0aljOVVyRHQq0TlzJW2WvfKXjkWr+a0Xso/fnLebZtpYizm1tzPxpfzaCz+4W61PvfCDu1V4I8vnT53LUlc+1afeZNFRFsL0gkLn5YLaJiEtqxpaFYjSthCZZ0MbqbdUoBtalporFFmcw/qAug/aiNqUz7sPOZD+8f/9zydOnPivf9flCveLThcdR3RIJBIpMg1edC6d078VvP5i8yjjuZRn2bdfN49stp7UM58ajxFFp1Wcb3/8Qj5vNOXum99WJ9dFPR+/OTcndUNNwqEISzWkzledXPREX0G7lCsxJ7tUO9krw3FGdJr6vaUC3VCl0OV/9pCbSlQffVM5wHMa9ffF7oan88H0d2dPnDhx4s2PU69wQXQ6bLhBdEgkEikyDUV06lRpTU+i4/lDeX7rBS0Qoky3AdH59FI9rX785nwRtrn75ret/TeN6DiaUFJn0fF3Xm1UmL+1/iyG1vaqchHHHh1Dj3ylPN2IOS0O0QmIiPs0mkE1Mxzl7nxc+vVf/6cTJ078P3/9jynXtiQ6T+evv5C0Xz71eBKJRDq6afCiU6cuS1eev3r9NhMQnW/fuqlOq4ro+CI6jiaU1Fl03J1vF2Kc6zjK0o+9ZuTUCPOuK8sbnKX83bDGGyk6ga08ztNoryeqh3k7H58+/q8nTpw4cfb/iy4SFJ24bTrz11/IXHFKEolEIrnT2EXHF9HpT3Rcs+bSe3Q8XQ2Kjq+2+Xcs6YkUHd/sK4qOuxsdRUfshu80rlR0hhHRWfW9hCQSiTSONGbRkfboRImO8qsgOvZEa82jhyI6ghCYd7yvUnQC3TC2CsVGdFKXruQ3ZRnRYY8OiUQibVQaiOjcv/KCvBGn57uufLO+uRU3ixCdeiZu4gfGXhariTb1LDr1TUauCrWdPfUa1qpER+iG+jyhZoUrZjOy+QgffTOyW5gMPRJ2bSck7roikUikjUvjFp0/v/edzJpCJFdQN6bUd3FHiM5vQ9/wIIiOvpdFuHHatUHYqtksaDzuzx7X0/5FR+qGcnrr7U26pTnPxm+f/lnf+uN+xrS8Lcl60FG66HR6js7ty+X175uperLO4px0WIdCdEgkEikyDUR0VpcO48nIJFLnxJORSSQSaaVp9KJzWN91RSJ1SO5tZBGJ77oikUikuHQEROfpIL69nESyEt9eTiKRSCtPR0N0SCQSiUQiHcnkFR0AAACATQfRAQAAgNGC6AAAAMBoQXQAAABgtCA6K+b21WPnL9bpozt2/sGNqS9rwc5HgQPGwO7ZEwvO7iYVvTc93aGUt6YO9SzR+W4Vxgx592xPnVmGWZ5l+WytXXhWTBbPjbwV15W6yJo7vkIe5eboRj9knbjrUjzqZv7yqfxmz/2KbBsS2WTR+fLTlxYOcf7isfPTd79MK/vq7cij77zqcpGDG9Nj56/uRNXw5N33JdF56cYToXCC6KSNa4B4VEM0kGrWPz29F18krfWOxXfPulwkpQ3vse4h6ySIzpLj9jEvJlk2KeZ916szyxces2e3NcuvZZMD4+V5sSdKTzXrO2o7JOYHE/0p4X3PeD7RSRty6DQOgWe75fXvl9f/1nx9Xkwy2SRCV2+C6Mw/fC17+e3EExXuIUSz8aKzmNRjjMFXNsjORxctp/G6i4ukg12tIzqpM/H6RcdpOklNLNWfdYvOLF/95/SzYqJ4zOyW5QSP8uzapHhmFBv6DD0/mCgDmRd7fbuOLTpdGPhp/LK8+f3y5m75m3cdolPWJuE7C+Grd9WiE+ohJDAe0SmTQiypQnD76jHj+LQaEJ1IRiU6DtNJa2GDRedQPqNnt4wghBW/cc/oA5+hDdExfa4HjoLo/Pr75W++LMvSKzqCzcRcvYcgOofz18JRYFSi44zxGPtjtBfb1OqRs5S9emVIlafUApfoyNt31FxH032NqyxvXz32/qcH1QDPXzR9TutGhETunj1xenqv2mJyenpP20viCniYs6t5TF2BSXOEsJclYrXLKliXaXONxaHA1hm7SdN0jCM83RDHIPdBzXU0bb4eOL1CD6s3WmlP78ssd4T95weTbK+Yt5tm2liLObW3M/EsvzYpnlXrU5PiWRXeyPJHpXNZanZLn3qTRUdZCNMLCp2XC2qbhLSsamhVIErbQmSeDW2k3lKBbmhZaq5QZHEO6wPqPmgjUr5P91H3IUfQVcf9ouMTGufVW+W8cyp7uU2K6DwsXrdf115s0zs3xVIRPYQ0Rig69erV7avKMtadV41VLV/kw19KX73SxUVuyz4+mHX7qrrlSIvodBqXrmW6tDUqU5XSjuwQH9IU5/Tp07U1nN0tu4mO/LKULRTZPasIzO7Z1meaab3+XdcUrbvO/TeOJvXj9AO83YgZg8+B2jqM/kptRZ11+2z4HdY9UzRbT+rPbTUeI4pOqziTvUn+qNGUZ8VEnVwX9ewVc3NSN9QkHIqwVEPqfNXJRU/0FbRZrsSc7FLtZK8MxxnRaer3lgp0Q5VCl//ZQ24qUX20UA7wnEb9fbG74el8kBWIjtsjfJ4ze+dU9vqV5nUtojN757XiYXPczbezl5Vf/REduZTQQ0hkXKLjloyytFd/4qZwwzDaaIdY3LXSlCQ6T959XxuFsHQVN647rzriNI1IGatyX376kpaVssW7VGbDe9PT9Wy6mHAHIzp2l+vj2k5bddybntbkILZJVQ/ELiWcDXeW2UNh6crMcrdjVaAKkmF6euOeD+f5wUQLhCjTbUB0bs3qaXWvmC/CNs+KibX/phEdRxPqUV1Fx995tVFh/tb6sxha26vKRRx7dAw98pXydCPmtDhEJyAi7tNoBtXMcJS78xGsQnTKeTExpcZz9T68MtFERFi6MrPilq48FTp6CKmMS3TUiE4dg3Gv/gim4i/VBkLszUBSW2WZJjpW3wybSR6X7SvqYbev+teknrz7fuIdbYu5sP1UGqLoGCs8XhNpp3azhGvpyNlkawSelS1/fUmi4+y7uTPa05a343qMST1M3AHk+Wz220xAdCYHc3VaVUTHF9FxNKH1r6PouDvfLsQ413GUpR97zcipEeZdV5Y3OEv5u2GNN1J0Alt5nKfRXk9UD/N23o/zX17olkOVoOgYVuO+ei1ZMbzkZv6yb1VLEB2plL+HkMq4REcJThj3SUVGdORSOx9dPPb+pweWmgTaKsseRafLuLqLjtLDSN3ZBNExghFmRMctCzFbe/2BkdPTe6F7spaN6IiiE2hrFaLji+j0JzquWXPpPTqergZFx1fbo9ySnkjR8d8PJIiOuxsdRUfshqvapnu9is6C9UZ0RNG5mWs7byIjOoFS/h5CKqMSnUZESnvvcPwSj1SqMobbRtlQqbJMXLoyFuDU+juNy22EjdyERSc4BIUE0XF+bh2C6JjbawTRURZkYj5lPcdU52Q3cO/50ktXhpio9YfainwrTHXynw5hj06U6Ci/CqJjT7TWPHoooiMIgXnH+ypFJ9ANY6tQbEQndelKflOGJjoJe3SMPTQ3324DMOrPZRkrOqFSQg8hkfGIzs5HasjhybvvL6SnWeuxZMKtI8FS5v1HwVJl6mZk09jaCruNy4gD6SIVKzqO/U+zPMuMux8l0TG3vKQs1rgfvieVkh+2p2018YiO4zf5c1bsvHO5yN2N8Bi8G5/VbdTGuKS23KfX3n7s2eps473ryjfrm1txswjRqWfiJn5g7GWxmlA60q/o1DcZuSrUdvbUa1irEh2hG+rzhJoVrpjNyOYjfPTNyG5hMvRI2LWdyLrvurqZv3xq8uHDsqwdpdWUh1cmi6xmNUpTFtNp4koJPYQ0Nl502q0qzfRv575048nBjak5/WvFtfuMhFJuj/GXct31XduYkKWsFl189XapdaPbuPSdPZqv+EXH6KG1y7t6dGeC6Kh3K9c3ZtkZvlV4143OUilHniNL7obLnRzZwc67PSa6G2qFYltt5tndUq1QaEs4vaXiaK4hSZOO6wEgkiuoG1Pqu7gjRKcMfcODIDr6XhbhxmnXBmGrZrOg8bg/e1xl/6IjdUM5vfX2Jt3SnGejau+W+3X7TLq3JVkPOuoqOon869+W179vpt9oi+9ei/A8vubhlUm9mebtWfmweL31kvmHrzX7bF4rHmpZ1gHtclWwFJ7TE5ssOgAwXHjWGQyaJZ+MfAigOX2B6ADAajic77oC6ID/oYA1a796gz2EaBAdAFgZfAczDJEevr18xfAvp08QHQAAABgtgxCda34OvzMAAAAwGoYiOkmvAwAAAMSA6AAAAMBoQXQAAABgtAxGdOqH7Gr7zDdPdFyjAAAAgHUxGNGp0J8csIzoPC7ObGdbdZpcfrx0J8PwdCcAAICBMTDR0b+pdbNEhy+ZBQAAGBqjFZ2a2TlEBwAA4Miy+aJTqUyV8j13riU6Wrwn25rOrCK+Cv0gOgAAAENjs0XH8BWHmrhEZz/fMkotRCdcoR9EBwAAYGgMTXQ0XQiJzt4029rOzuzMnb+WZekUnQc7k63tbOtC8aBLhV7wHAAAgMExONEpy/r2pWxSBERnfvlCZsZm3OtQekRHD9soHhNToasfdXeRHAAAgIExONFRbzBfkehUaAtY1fpUR9Gpe8PN5QAAAENjaKKTtEcnYmkpeNdVvfX43H5khX5YuwIAABgaGy06rr3DtbLUG3H0VBmMK6sxIX+FYRAdAACAobHZolM61CRddPT7qjwVhkF0AAAAhsbGi85wQHQAAACGxsBEZ5ar34i5WaLDdmQAAIChMRjRab73W42JbJjolHx7OQAAwLAYiuj4OPzOAAAAwGgYhOgAAAAArAJEpzvHt0/2cgwAAACsiKMoOse3T8Ynu2zwZ2eRpCaM3JhSAAAAYHMURccg0lfsY+wflmw92B/8BgAAIIlRic7dnVeOX/jgbmJWqujEH9xtbcsXucFyAAAAUhmT6HzyxvbJN9yPMRayElagUpe6OouO/TPrVgAAAB0Ykejsv3V8+63rcVndNuioxY3/Coc5W3QeIxxJaAcAAKADoxGdz9+7cPLUzueRWTF7in0+Eb9HZ5lWnFUF1QoAAABUxiI6jz84tf3Ke49jszorSO8HC1Ef48arEtEBAABIZCSic3160rfX2JnVQXSCm2Pi759KihupvyI6AAAASYxDdJK3IRurTk6NWP6mKkQHAABgvYxBdO7uvOLbhuzLEkTH/rXs+ozBbqKzaN25HxnLAQAAiGcEopO2DbnCqTJCbkwNvmMWP8ffdWW/zl1XAAAAHdh80UnchlwhaIT8op3V4bBU0ZF3/wAAAICPjRed69OTx6efpGbFiELk7pmkI4PHqOtWwbIAAAAgs+mi08PTkH25TqERnCY17iIvUcXvBAIAAAAfmy06HbYhV6TeURXpFsH9N8FWgk0AAABAPBstOl22IQMAAMDRYaNFBwAAAEAC0QEAAIDRgugAAADAaEF0AAAAYLQgOgAAADBaEB0AAAAYLYjOirl99dj5i3X66I6df3Bj6stasPNR4IAh8ayYXMvyR8IR82IvywLHDI/wuNzMbmXZtTr1MuRQhTGnd5YP4PzP8izLZ57Mm/nLp/Kb62kbAMbFJovOl5++tHCI8xePnZ+++2Va2VdvRx5951WXixzcmB47f3UnqoYn774vic5LN54IhRNEJ21cqyBWdCbFs0Prk9WDg0l2LXGe6yo67uKPcpeLzIu9LLsV1y9vf2JOb4LodDlXMdUWkyybFHNffoLozD98LXv57cQezotJhusAHA02XnQWk3qMMfjKBtn56KLlNF53cZF0sKv1EYnO+lm/6JSz/JrlNElNLNWfdYvOLA9ZxqpFp6xdB9UBGD/jEZ0yKcSSKgS3rx4zjk+rAdEZEgMQnWoFSutDWq82WHRiDOMQRCfGtwBgBIxKdJwxHmN/jPZim1o9cpayV68MqfKUWuASHXn7jprraLqvcZXl7avH3v/0oBrg+Yumz2ndiJHIegKud4pk17LJQbs+4d1f8qyYXJsUz9ylFvtO7IKzW9nkYF6tBGXXFuowL/aybE9bGFEnbHHy9rQljksamlZcecVcvTLWrbxD9lYY6oOa62jafF17sU0RPfS8KYvs3LdoNXvnVPZymxTReVi8br+uvdimd26KpVQI6gAcBUYoOvXq1e2ryjLWnVeNVS1f5MNfSl+90sVFbss+Pph1+6q65UiL6HQal65lurQ1KlOV0o7sEh96VkxUD3BuRrEn6aZU/eKjXN1lMrul7Dgxsyy/qWZi/bAqhrFQE0F0vG2J45rdUgwgcsjG6pV+gDBkf4VS1uyWan5aREduy3OudC2zz4bzTanbdnvO7J1T2etXmte1iM7sndeKh81xN9/OXlZ+9Ud05FLNMDAdgNEzLtFxS0ZZ2qs/cVO4YRhttEMs7lppShKdJ+++r41CWLqKG9edVx1xmkakjFW5Lz99SctK2eJdlvUsq0Q7XBtsPaKjlBLWVoxJWgsYzA8mzXSumU35KDcPi1qOUdoSxlWHo0pHljBkvfNil1xnI0l0zB7Gnl5vx/TzWeoi5X9TSq9aPLwy0UREWLoys+KWrjwVzouJtCcaAEbAuERHjejUMRj36o9gKv5SbSDE3gwktVWWaaJj9c2wmeRx2b6iHnb7qn9N6sm776fe0ebcjKKvIvlEx9ira27ddS27aKEUHXWGNg4LWoWjLWFc7RqNc4nHM+RSDYTYbuQdslShJ8sab+zp9Z0r+z0VzraO2ywsWTG85Gb+sm9VSxAdqZTSHUI6AONmXKKjBCeM+6QiIzpyqZ2PLh57/9MDS00CbZVlj6LTZVzdRUfpYazuOIUgLqLjER3jBiUrouObU9s6Z3nUcozYljAuK7whdsZsbnIwD92TtWxERxSdQFurEB3bLETRuZlrO28iIzqBUkp3iOgAjJtRiU4jIqW9dzh+iUcqVRnDbaNsqFRZJi5dGQtwav2dxuU2wkZuwqITHIKKOcvOiz1z326a6JhbXqJFZ5H7KDeO8YqO0JYwrpgboDzHVMYwM/ojDlmu0J1l7LxR6w+15TxX9ovqGxF4U5x7dIw9NDffbgMw6s9lGSs6oVJ1WQI6AONnPKKz85Eacnjy7vsL6WnWeiyZcOtIsJR5/1GwVJm6Gdk0trbCbuMy4kC6SMWKjmP/0yzPMvMGXX2WdStFkuhom2PqRZZI0VksKhlC4BUdoS1pXNX9R+J86fOSxbKXOgpxyIEK3VnKjiXjnATbcj/bUI8D2TvEhTfFYzr5y6cmHz4sy9pRWk15eGWyyGpWozRlMZ0mrlRZ4jkAR4ONF512q0oz/du5L914cnBjak7/WnHtPiOhlNtj/KVcd33XNiZkKatFF1+9XWrd6DYufWeP5it+0TF6aO3yrp4ua84Uxm3JaqbrjuVqBUTcozM/mDTH17egx4qO6z5zvUK9G1JbwrgcQ5Nu0tb64/aY6G6oFYptNXeNZdfyWamdQ+H0Ok6XvsilFFSGFHhTPI+veXhlUm+meXtWPixeb71k/uFrzT6b14qHWpZ1QLtcFSyF5wAcDTZZdABCuBbOYO0M4kl9aA7AEQHRgfHiuOELhkHou65Wjv+xhQAwMhAdGCHNqgqWM2DW+Q3ifHs5wBEC0QEAAIDRgugAAADAaEF0AAAAYLQgOgAAADBaEB0AAAAYLYMRnfohu9wKAQAAAL0xGNGp4OEWAAAA0B8DEx2+TBgAAAD6A9EBAACA0YLoAAAAwGhBdAAAAGC0DE10MB0AAADojcGJTlnW32yM7gAAAMCSDE50uMEcAAAA+mJoosPKFQAAAPQGogMAAACjBdEBAACA0YLoAAAAwGgZmOjMcr7XEwAAAPpiMKLTfHs54RwAAADoi8GIDgAAAEDfIDoAAAAwWhAdAAAAGC2IDgAAAIwWRAcAAABGywpEp7l/irvEAQAAYL2sLKLDl3MCAADAulnd0hXPOAYAAIA1g+gAAADAaEF0AAAAYLQgOgAAADBaVnh7OaYDAAAA62XFz9GZFxO+qBMAAADWxApFhxvMAQAAYL2wRwcAAABGC6IDAAAAowXRAQAAgNGC6AAAAMBoWel3XfG9ngAAALBOVvjt5YRzAAAAYL2s+Dk6AAAAAOsD0QEAAIDRgugAAADAaEF0AAAAYLQgOgAAADBaEB0AAAAYLYgOAAAAjBZEBwAAAEYLogMAAACjBdEBAACA0YLoAAAAwGhBdAAAAGC0IDoAAAAwWhAdAAAAGC2IDgAAAIwWRAcAAABGC6IDAAAAowXRAQAAgNHy/wPHBSpmELCUwwAAAABJRU5ErkJggg==" alt="" width="459" height="294" />

好了,现在是第三步,创建算法模型。我们可以看到GeneralizedLinearAlgorithm的run方法中,创建模型就一句代码搞定:createModel(weights, intercept)。但其中包含了程序员的设计思想在里面。和上面optimizer类似,createModel(weights, intercept)方法也是用到了多态的方式来实现。首先,GeneralizedLinearAlgorithm类中定义了一个抽象的:createModel方法,如下所示:

 protected def createModel(weights: Vector, intercept: Double): M

子类LogisticRegressionWithLBFGS实现了该方法。如下所示:

   override protected def createModel(weights: Vector, intercept: Double) = {
if (numOfLinearPredictor == 1) {
//两类的模型
new LogisticRegressionModel(weights, intercept)
} else {
//多类的模型
new LogisticRegressionModel(weights, intercept, numFeatures, numOfLinearPredictor + 1)
}
}

因此实际上调用的是对应LogisticRegressionWithLBFGS的createModel方法。到目前为止,算法的模型算是已经建立了。接下来就是如何利用算法的模型,比如预测等

2、预测过程

预测过程主要是利用上面建立好的模型,去判断未知样本的类别。首先父类GeneralizedLinearModel有一个predict方法用来预测,该方法有两个实现方式,一个是一参数为RDD的方式,用于并行预测;另一个参数是vector的方式,用于单机预测。代码如下所示:

   /**
* Predict values for the given data set using the model trained.
*
* @param testData RDD representing data points to be predicted
* @return RDD[Double] where each entry contains the corresponding prediction
*
*/
@Since("1.0.0") //该方法是用于并行预测
def predict(testData: RDD[Vector]): RDD[Double] = {
// A small optimization to avoid serializing the entire model. Only the weightsMatrix
// and intercept is needed.
val localWeights = weights
val bcWeights = testData.context.broadcast(localWeights)
val localIntercept = intercept
testData.mapPartitions { iter =>
val w = bcWeights.value
iter.map(v => predictPoint(v, w, localIntercept))
}
} /**
* Predict values for a single data point using the model trained.
*
* @param testData array representing a single data point
* @return Double prediction from the trained model
*
*/
@Since("1.0.0") //该方法适用于单机预测
def predict(testData: Vector): Double = {
predictPoint(testData, weights, intercept)
}

我们仔细看上面的代码,上面的两个predict方法都是需要调用predictPoint方法 ,而predictPoint方法在GeneralizedLinearModel类中是抽象方法。也就是说,对应不同的机器学习的算法,有不同的预测方式,如逻辑回归的预测方式是判断对应的与测试是否大于0.5(如下所示)。

aaarticlea/png;base64,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" alt="" width="558" height="105" />

所以,对应的每一个具体的机器学习算法的模型都会去重新实现父类(GeneralizedLinearModel)的predictPoint方法。那么我们来看一下GeneralizedLinearModel的predictPoint方法是怎么实现的,代码如下所示:

 override protected def predictPoint(
dataMatrix: Vector,
weightMatrix: Vector,
intercept: Double) = {
require(dataMatrix.size == numFeatures) // If dataMatrix and weightMatrix have the same dimension, it's binary logistic regression.
if (numClasses == 2) {
val margin = dot(weightMatrix, dataMatrix) + intercept
val score = 1.0 / (1.0 + math.exp(-margin))
threshold match {
case Some(t) => if (score > t) 1.0 else 0.0
case None => score
}
} else {
/**
* Compute and find the one with maximum margins. If the maxMargin is negative, then the
* prediction result will be the first class.
*
* PS, if you want to compute the probabilities for each outcome instead of the outcome
* with maximum probability, remember to subtract the maxMargin from margins if maxMargin
* is positive to prevent overflow.
*/
var bestClass = 0
var maxMargin = 0.0
val withBias = dataMatrix.size + 1 == dataWithBiasSize
(0 until numClasses - 1).foreach { i =>
var margin = 0.0
dataMatrix.foreachActive { (index, value) =>
if (value != 0.0) margin += value * weightsArray((i * dataWithBiasSize) + index)
}
// Intercept is required to be added into margin.
if (withBias) {
margin += weightsArray((i * dataWithBiasSize) + dataMatrix.size)
}
if (margin > maxMargin) {
maxMargin = margin
bestClass = i + 1
}
}
bestClass.toDouble
}
}

至此,机器学习的算法的源码分析算是完成,本文主要是借用LogisticRegression算法来讲述源码,其他机器学习实际上也是类似的分析,后续也会给出其他算法的源码分析。

SparkMLlib之 logistic regression源码分析的更多相关文章

  1. FastText总结,fastText 源码分析

    文本分类单层网络就够了.非线性的问题用多层的. fasttext有一个有监督的模式,但是模型等同于cbow,只是target变成了label而不是word. fastText有两个可说的地方:1 在w ...

  2. Spark中决策树源码分析

    1.Example 使用Spark MLlib中决策树分类器API,训练出一个决策树模型,使用Python开发. """ Decision Tree Classifica ...

  3. Spark MLlib - Decision Tree源码分析

    http://spark.apache.org/docs/latest/mllib-decision-tree.html 以决策树作为开始,因为简单,而且也比较容易用到,当前的boosting或ran ...

  4. 源码分析——迁移学习Inception V3网络重训练实现图片分类

    1. 前言 近些年来,随着以卷积神经网络(CNN)为代表的深度学习在图像识别领域的突破,越来越多的图像识别算法不断涌现.在去年,我们初步成功尝试了图像识别在测试领域的应用:将网站样式错乱问题.无线领域 ...

  5. Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树

    Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 目录 Alink漫谈(十六) :Word2Vec源码分析 之 建立霍夫曼树 0x00 摘要 0x01 背景概念 1.1 词向量基础 ...

  6. Alink漫谈(十七) :Word2Vec源码分析 之 迭代训练

    Alink漫谈(十七) :Word2Vec源码分析 之 迭代训练 目录 Alink漫谈(十七) :Word2Vec源码分析 之 迭代训练 0x00 摘要 0x01 前文回顾 1.1 上文总体流程图 1 ...

  7. [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本

    [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 目录 [阿里DIEN] 深度兴趣进化网络源码分析 之 Keras版本 0x00 摘要 0x01 背景 1.1 代码进化 1.2 Deep ...

  8. ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  9. HashMap与TreeMap源码分析

    1. 引言     在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...

随机推荐

  1. [分享] 《步步为营封 Win7》--skyfree

    [分享] <步步为营封 Win7>--skyfree Skyfree 发表于 2009-9-13 05:51:32 https://www.itsk.com/thread-20957-1- ...

  2. medoo–高效的轻量级PHP数据库操作类

    网址:http://medoo.lvtao.net/ /*medoo.php*/ class medoo { protected $database_type = ‘mysql’; protected ...

  3. 更改make/bison的版本

    一.make版本 1.下载make的压缩包 ftp://ftp.gnu.org/gnu/make/ 2.解压,安装 cd make-x.x ./configuration sh build.sh su ...

  4. Lua 与 Redis

    Lua 与 Redis 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis - 案例-实现访问频率限制: 实现访问者 $ip 在一定的 ...

  5. 【原创】xgboost 特征评分的计算原理

    xgboost是基于GBDT原理进行改进的算法,效率高,并且可以进行并行化运算: 而且可以在训练的过程中给出各个特征的评分,从而表明每个特征对模型训练的重要性, 调用的源码就不准备详述,本文主要侧重的 ...

  6. Eclipse 安装需要的 JDK 版本简要说明

    Eclipse 4.6 (Neon) Eclipse 4.6 (Neon)is scheduled for release on June 22, 2016. Consider using the I ...

  7. PHP xml 转换为 array

    retrun json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), tru ...

  8. ubuntu下各种压缩包的解压命令

    .tar解包:tar xvf FileName.tar打包:tar cvf FileName.tar DirName(注:tar是打包,不是压缩!)-------------------------- ...

  9. js面向对象的使用方法

    标准用法: function Sprite(){ //函数内容部设置属性 this.name='shimily'; } //原型上设置方法 Sprite.prototype.show=function ...

  10. DataTable数据导出CSV文件

    public static void SaveAsExcel(DataTable dt1) { //System.Windows.Forms.SaveFileDialog sfd = new Syst ...