原创

机器学习入门

温馨提示:
本文最后更新于 2018年03月09日,已超过 2,450 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

什么 是机器学习?

机器学习(Machine Learning, ML)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。
它是人工智能的核心,是使计算机具有智能的根本途径,其应用遍及人工智能的各个领域,它主要使用归纳、综合而不是演绎。

什么是SparkMLlib?

MLlib是Spark的机器学习(ML)库。其目标是使实用的机器学习可扩展且简单。从较高的层面来说,它提供了以下工具:

  • ML算法:常见的学习算法,如分类,回归,聚类和协同过滤
  • 特征化:特征提取,转换,降维和选择
  • 管道:用于构建,评估和调整ML管道的工具
  • 持久性:保存和加载算法,模型和管道
  • 实用程序:线性代数,统计,数据处理等。

简单示例

1.计算两个数之间的相关性

package com.lzhpo.spark.com.lzhpo.spark.basic;

import org.apache.spark.ml.linalg.VectorUDT;
import org.apache.spark.ml.linalg.Vectors;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.Metadata;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

import java.util.Arrays;
import java.util.List;


/**
 * <p>Create By IntelliJ IDEA</p>
 * <p>Author:lzhpo</p>
 * 《机器学习》---基本统计
 *
 *      ---《相关性》
 *          计算两个数据系列之间的相关性是统计学中的常见操作。
 *          在spark.ml提供的灵活性来计算多个系列两两之间的相关性。
 *          支持的相关方法目前是Pearson和Spearman的相关性。
 *
 *  Correlation 使用指定的方法计算输入数据集的相关矩阵。输出将是一个DataFrame,它包含向量列的相关矩阵。
 *
 */
public class CorrelationDemo {

  public static void main(String[] args) {
    SparkSession spark = SparkSession
      .builder()
      .appName("CorrelationDemo")
      .master("local")
      .getOrCreate();

    List<Row> data = Arrays.asList(
      RowFactory.create(Vectors.sparse(4, new int[]{0, 3}, new double[]{1.0, -2.0})),
      RowFactory.create(Vectors.dense(4.0, 5.0, 0.0, 3.0)),
      RowFactory.create(Vectors.dense(6.0, 7.0, 0.0, 8.0)),
      RowFactory.create(Vectors.sparse(4, new int[]{0, 3}, new double[]{9.0, 1.0}))
    );

    StructType schema = new StructType(new StructField[]{
      new StructField("features", new VectorUDT(), false, Metadata.empty()),
    });

    Dataset<Row> df = spark.createDataFrame(data, schema);
    Row r1 = org.apache.spark.ml.stat.Correlation.corr(df, "features").head();
    System.out.println("Pearson correlation matrix:\n" + r1.get(0).toString());
    //结果:
    /*
    Pearson correlation matrix:
    1.0                   0.055641488407465814  NaN  0.4004714203168137
    0.055641488407465814  1.0                   NaN  0.9135958615342522
    NaN                   NaN                   1.0  NaN
    0.4004714203168137    0.9135958615342522    NaN  1.0
    */

    Row r2 = org.apache.spark.ml.stat.Correlation.corr(df, "features", "spearman").head();
    System.out.println("Spearman correlation matrix:\n" + r2.get(0).toString());
    //结果:
    /*
    Spearman correlation matrix:
    1.0                  0.10540925533894532  NaN  0.40000000000000174
    0.10540925533894532  1.0                  NaN  0.9486832980505141
    NaN                  NaN                  1.0  NaN
    0.40000000000000174  0.9486832980505141   NaN  1.0
     */

    spark.stop();
  }
}

2.预测

package com.lzhpo.spark.com.lzhpo.spark.basic;

import org.apache.spark.ml.linalg.VectorUDT;
import org.apache.spark.ml.linalg.Vectors;
import org.apache.spark.ml.stat.ChiSquareTest;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.DataTypes;
import org.apache.spark.sql.types.Metadata;
import org.apache.spark.sql.types.StructField;
import org.apache.spark.sql.types.StructType;

import java.util.Arrays;
import java.util.List;


/**
 * <p>Create By IntelliJ IDEA</p>
 * <p>Author:lzhpo</p>
 * 《机器学习》---基本统计
 *
 假设检验是统计学中一种强有力的工具,用于确定结果是否具有统计显着性,无论该结果是否偶然发生。
 spark.ml目前支持Pearson的卡方(χ2
 ChiSquareTest对标签的每个功能进行Pearson独立测试。
 对于每个特征,(特征,标签)对被转换为应急矩阵,对其计算卡方统计量。所有标签和特征值必须是分类的。
 *
 */
public class ChiSquare {

  public static void main(String[] args) {
    SparkSession spark = SparkSession
      .builder()
      .appName("ChiSquare")
      .master("local")
      .getOrCreate();

    List<Row> data = Arrays.asList(
      RowFactory.create(0.0, Vectors.dense(0.5, 10.0)),
      RowFactory.create(0.0, Vectors.dense(1.5, 20.0)),
      RowFactory.create(1.0, Vectors.dense(1.5, 30.0)),
      RowFactory.create(0.0, Vectors.dense(3.5, 30.0)),
      RowFactory.create(0.0, Vectors.dense(3.5, 40.0)),
      RowFactory.create(1.0, Vectors.dense(3.5, 40.0))
    );

    StructType schema = new StructType(new StructField[]{
      new StructField("label", DataTypes.DoubleType, false, Metadata.empty()),
      new StructField("features", new VectorUDT(), false, Metadata.empty()),
    });

    Dataset<Row> df = spark.createDataFrame(data, schema);
    Row r = ChiSquareTest.test(df, "features", "label").head();
    System.out.println("pValues: " + r.get(0).toString());
    System.out.println("degreesOfFreedom: " + r.getList(1).toString());
    System.out.println("statistics: " + r.get(2).toString());
    //结果
    /*
    pValues: [0.6872892787909721,0.6822703303362126]
    degreesOfFreedom: [2, 3]
    statistics: [0.75,1.5]
     */


    spark.stop();
  }
}
本文目录