推荐系统-基于模型协同过滤理论基础与业务实

协同过滤推荐之基于模型协同过滤 目录(1)基于模型协同过滤的核心思想(2)矩阵分解详解(3)矩阵分解图例及数据演化过程(4)SVD算法之交替最小二乘(ALS)详解(5)基于SVD算法之交替最小二乘(ALS)完成推荐开发 几种推荐系统图: (1)基于模型协同过滤的核心思想 概述: 基于模型的协同过滤推荐就是基于样本的用户喜好信息,训练一个推荐模型,然后根据实时的用户喜好的信息进行预测,计算推荐。 基于模型的推荐算法,是与基于近邻的推荐算法相对的。基于近邻的推荐算法,主要是将所有的用户数据,读入内存,进行运算,当数据量特别大时,显然这种方法 阅读详情

推荐系统-基于模型协同过滤理论基础与业务实践

1.SparkMllib库框架详解

  • Spark机器学习库
    • 五个组件
      • ML Algratham算法 : 分类 , 聚类 , 降维 , 协同过滤
      • Pipelines管道 ----
      • Featurization 特征化---- 特征抽取 , 特征转换 , 特征降维 , 特征选择
      • Persistence 持久化---- 模型的保存 , 读取 , 管道操作
      • Utilities ---- 提供了线性代数 , 统计学以及数据处理工具
    • Sparkml和Sparkmllib
      • ml基于DatafrmaeAPI
        • MLlib仍将支持基于RDD的API spark.mllib以及错误修复。
        • MLlib不会为基于RDD的API添加新功能。
        • 在Spark 2.x版本中,MLlib将为基于DataFrames的API添加功能,以实现与基于RDD的API的功能奇偶校验。
        • 在达到功能奇偶校验(粗略估计Spark 2.3)之后,将弃用基于RDD的API。
        • 预计将在Spark 3.0中删除基于RDD的API。
      • 为什么会从MLlib切换到DataFrame的API
        • DataFrames提供比RDD更加用户友好的API。DataFrame的许多好处包括Spark数据源,SQL / DataFrame查询,Tungsten和Catalyst优化以及跨语言的统一API。
        • 基于DataFrame的MLlib API跨ML算法和多种语言提供统一的API。
        • DataFrames有助于实用的ML管道,特别是功能转换
      • mllib基于rdd的API

2.SparkMllib基本数据类型

  • 向量

    • Local vector本地向量,主要向Spark提供一组可进行操作的数据集合

      • 创建方式上
        • dense稠密性向量----会存储0值和非0值
        • sparse稀疏性向量—仅可以存储非0值元素
          • sparse(n,seq((x,y),(p,q)))结构数据
          • 元素个数,(下标,元素的值),(下标,元素的值)…
        • 在MLlib的数据支持格式中 , 目前仅支持整数和浮点型数
    • Labled Point标签向量,让用户能够分类不同的数据集合

      • 通过指定Vectors给定dense或sparse等向量

      • 从mllib.regression.LabeledPoint中获取lablepoint通过该方法给特征进行标签赋值

      • Spark读取libsvm格式数据

        1 1:-0.555556 4:-0.916667 
        1 1:-0.666667 2:-0.166667 3:-0.864407 4:-0.916667 
        1 1:-0.777778 3:-0.898305 4:-0.916667 
        1 1:-0.833333 2:-0.0833334 3:-0.830508 4:-0.916667 
        1 1:-0.611111 2:0.333333 3:-0.864407 4:-0.916667 
        1 1:-0.388889 2:0.583333 3:-0.762712 4:-0.75 
        1 1:-0.833333 2:0.166667 3:-0.864407 4:-0.833333 
        1 1:-0.611111 2:0.166667 3:-0.830508 4:-0.916667 
        1 1:-0.944444 2:-0.25 3:-0.864407 4:-0.916667 
        1 1:-0.666667 2:-0.0833334 3:-0.830508 4:-1 
        1 1:-0.388889 2:0.416667 3:-0.830508 4:-0.916667 
        1 1:-0.722222 2:0.166667 3:-0.79661 4:-0.916667 
        1 1:-0.722222 2:-0.166667 3:-0.864407 4:-1 
        1 1:-1 2:-0.166667 3:-0.966102 4:-1 
        1 1:-0.166667 2:0.666667 3:-0.932203 4:-0.916667 
        1 1:-0.222222 2:1 3:-0.830508 4:-0.75 
        1 1:-0.388889 2:0.583333 3:-0.898305 4:-0.75 
        
        • libsvm格式非常适合于稀疏性数据(0值元素较多非0元素较少的情况)

        • SparkMLlib读取LibSvm数据,libsvm数据格式为:Label index1:value1 index2:value2 …

        • 2 1:5 2:8 3:9(索引从1开始,从0开始会报错)
          1 1:7 2:6 3:7
          1 1:3 2:2 3:1
          
      • (2.0列别标签,(9元素个数,[0,1,2]下标,[5.0,8.0,9.0]值))
        (1.0,(9,[0,1,2],[7.0,6.0,7.0]))
        (1.0,(9,[0,1,2],[3.0,2.0,1.0]))
        (2.0,(9,[0,1,2],[5.0,8.0,9.0]))
        
    • 矩阵

      • LocalMatrix–本地矩阵

        • MLlib中的局部矩阵以列主要顺序存储
        val dm: Matrix = Matrices.dense(3, 2, Array(1.0, 3.0, 5.0, 2.0, 4.0, 6.0))
        //dense(行数 , 列数 , 数组())
        println(dm(2,0))
        // Create a sparse matrix ((9.0, 0.0), (0.0, 8.0), (0.0, 6.0))
        val sm: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), Array(0, 2, 1), Array(9, 6, 8))
        println(sm(2,1))//6
        println(sm(2,0))//0
        //sparse(行数,列数,数组1--列索引(),数组2--行索引(),数组3--数值())
        //没有的为0
        
        • 分布式矩阵(了解)
        • 在MLlib实现了三类分布式矩阵存储格式,分别是**行矩阵(RowMatrix)、行索引矩阵(IndexedRowMatrix)、三元组矩阵(CoordinateMatrix)和分块矩阵(BlockMatrix)**等四种。

3.统计量的MLLIB实现

  • 基于均值、方差、极差、分层抽样、假设检验等方面

4.Mllib抽取-转换-选择之特征提取器

  • 提取(抽取) : 从"原始"数据中提取要素

  • 转换 : 缩放 , 转换或修改功能

  • 选择 : 从更大的功能集中选择子集

  • TF-IDF–适用于文本分析----自然语言的文本处理之中 ---- 常用与基于内容的推荐

  • TF-IDF可以筛选掉不是非常常用的关键词

  • Word2Vec词向量工具----一个词能够使用不同词向量表示

  • [[0.03173386193811894,0.009443491697311401,0.024377789348363876]]

  • 建议自学word2vec原理

  • word2vec缺陷

    • 1是词语数量较大时,向量维度高且稀疏,向量矩阵巨大而难以存储

    • 2是向量并不包含单词的语义内容,只是基于数量统计。

    • 3是当有新的词加入语料库后,整个向量矩阵需要更新

    • 利用skip-gram算法克服上述三个缺陷

    • 隐藏层 : 根据最终需要获取的词向量维数决定隐藏神经元就是多少个

    • 在这里插入图片描述

    • skip-gram算法构造的神经网络神经元太多了,导致权重矩阵非常大 , 导致数据难以训练

    • 负抽样 : 主要解决模型难以训练

    • 使用SGD(最速下降法)训练神经网络的过程就是抽取一条样本数据 , 然后据此去调整神经网络的所有权重==>所有权重导致数据难以训练

    • 负抽样解决方法就是使得对每一条样本的每一次训练 , 只更新很小的一部分的权重, 而不是全部更新

    • 让我们用一个例子来具体感受一下。假设我们负抽样的维度数为5,我们的词表中有10000个单词,词向量的维度为300,也即是隐藏层有300个神经元。
      那么,在输出层,权重矩阵的大小将是300*10000。现在我们抽取了5个负的维度(输出应当为0的维度),加上输出为1的维度,只更新这6个维度所对应的神经元。那么需要更新的权重系数是300*6=1800个。这只占输出层中所有权重系数的0.06%!!
      为什么是300*6?????
      
    • 如何抽样?

      • 根据单词在语料库中出现的次数多少来的 , 出现的次数越多 , 抽到的可能性越大

在这里插入图片描述 * P(w_i)就是w_i这个单词被负抽样抽中的概率。f(w_i)即是w_i在语料库中出现的次数。
* 至于为什么要取一次3/4次方,据说是基于经验,这样效果会更好。

  • CountVector–处理文本中的词频,按照词频进行原文本的排序(按照原文本顺序?次数排序?)

    • CountVectorizer并CountVectorizerModel旨在帮助将一组文本文档转换为令牌计数的向量。当apriori字典不可用时,CountVectorizer可以用作Estimator提取词汇表,并生成一个CountVectorizerModel。该模型为词汇表上的文档生成稀疏表示,然后可以将其传递给其他算法,如LDA。
    • 在拟合过程中,CountVectorizer将选择vocabSize按语料库中的术语频率排序的顶部单词。可选参数minDF还通过指定术语必须出现在文档中的最小数量(或<1.0)来影响拟合过程。另一个可选的二进制切换参数控制输出向量。如果设置为true,则所有非零计数都设置为1.这对于模拟二进制而非整数计数的离散概率模型特别有用。

5.Mllib抽取-转换-选择之特征转换

  • n-gram中的n就是选取出现频率较多的n个词来进行匹配

  • 二值化

    • import org.apache.spark.ml.feature.Binarizer
      import org.apache.spark.sql.SparkSession
      
      object Binaziner_3 {
        def main(args: Array[String]): Unit = {
          val spark: SparkSession = SparkSession.builder()
            .appName("SparkMlilb")
            .master("local[2]")
            .getOrCreate()
          spark.sparkContext.setLogLevel("WARN")
          val data = Array((0, 0.1), (1, 0.8), (2, 0.2))
          val dataFrame = spark.createDataFrame(data).toDF("label", "feature")
      
          val binarizer: Binarizer = new Binarizer()
            .setInputCol("feature")
            .setOutputCol("binarized_feature")
            .setThreshold(0.5)
          //小于0.5为0 , 大于0.5为1
      
          val binarizedDataFrame = binarizer.transform(dataFrame)
          val binarizedFeatures = binarizedDataFrame.select("binarized_feature")
          binarizedFeatures.collect().foreach(println)
        }
      }
      
      //输出
      //[0.0]
      //[1.0]
      //[0.0]
      
  • stringtoindexer : 将标签的字符串列编码为标签索引项 . 索引[0, numLabels)按标签频率排序,因此最常用的标签获得索引0。

    • import org.apache.spark.ml.feature.StringIndexer
      import org.apache.spark.sql.SparkSession
      
      object StringIndex {
        def main(args: Array[String]): Unit = {
          val spark: SparkSession = SparkSession.builder()
            .appName("SparkMlilb")
            .master("local[2]")
            .getOrCreate()
          spark.sparkContext.setLogLevel("WARN")
          val df = spark.createDataFrame(
            Seq((0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, "c"))
          ).toDF("id", "category")
      
          val indexer = new StringIndexer()
            .setInputCol("category")
            .setOutputCol("categoryIndex")
      
          val indexed = indexer.fit(df).transform(df)
          indexed.show()
          //输出
          //      +---+--------+-------------+
          //      | id|category|categoryIndex|
          //      +---+--------+-------------+
          //      |  0|       a|          0.0|
          //      |  1|       b|          2.0|
          //      |  2|       c|          1.0|
          //      |  3|       a|          0.0|
          //      |  4|       a|          0.0|
          //      |  5|       c|          1.0|
          //      +---+--------+-------------+
        }
      }
      
  • indextoString : 一列标签索引映射回包含原始标签作为字符串的列。一个常见的用例是从标签生成索引StringIndexer,使用这些索引训练模型,并从预测索引列中检索原始标签IndexToString。但是,可以自由提供自己的标签。

  • StandardScaler : StandardScaler转换Vector行的数据集,将每个要素标准化以具有单位标准差和/或零均值。

    • 需要的参数 :

      • withStd:默认为True。将数据缩放到单位标准偏差。
      • withMean:默认为False。在缩放之前使用均值将数据居中。它将构建一个密集的输出,因此这不适用于稀疏输入并将引发异常。
    • import org.apache.spark.sql.SparkSession
      
      object StandScater {
        def main(args: Array[String]): Unit = {
          import org.apache.spark.ml.feature.StandardScaler
          val spark: SparkSession = SparkSession.builder()
            .appName("SparkMlilb")
            .master("local[2]")
            .getOrCreate()
          spark.sparkContext.setLogLevel("WARN")
          val dataFrame = spark.read.format("libsvm").load("I:\\ideaworkspace\\Saprk_Test_ML\\src\\main\\scala\\cn\\apple\\BigDataMachineLearningPro\\sample_libsvm_data.txt")
      
          val scaler = new StandardScaler()
            .setInputCol("features")
            .setOutputCol("scaledFeatures")
            .setWithStd(true)
            .setWithMean(false)
      
          // Compute summary statistics by fitting the StandardScaler.
          val scalerModel = scaler.fit(dataFrame)
      
          // Normalize each feature to have unit standard deviation.
          val scaledData = scalerModel.transform(dataFrame)
          scaledData.show()
          //    +-----+--------------------+--------------------+
          //    |label|            features|      scaledFeatures|
          //    +-----+--------------------+--------------------+
          //    |  0.0|(692,[127,128,129...|(692,[127,128,129...|
          //    |  1.0|(692,[158,159,160...|(692,[158,159,160...|
          //    |  1.0|(692,[124,125,126...|(692,[124,125,126...|
          //    |  1.0|(692,[152,153,154...|(692,[152,153,154...|
          //    |  1.0|(692,[151,152,153...|(692,[151,152,153...|
          //    |  0.0|(692,[129,130,131...|(692,[129,130,131...|
          //    |  1.0|(692,[158,159,160...|(692,[158,159,160...|
          //    |  1.0|(692,[99,100,101,...|(692,[99,100,101,...|
          //    |  0.0|(692,[154,155,156...|(692,[154,155,156...|
          //    |  0.0|(692,[127,128,129...|(692,[127,128,129...|
          //    |  1.0|(692,[154,155,156...|(692,[154,155,156...|
          //    |  0.0|(692,[153,154,155...|(692,[153,154,155...|
          //    |  0.0|(692,[151,152,153...|(692,[151,152,153...|
          //    |  1.0|(692,[129,130,131...|(692,[129,130,131...|
          //    |  0.0|(692,[154,155,156...|(692,[154,155,156...|
          //    |  1.0|(692,[150,151,152...|(692,[150,151,152...|
          //    |  0.0|(692,[124,125,126...|(692,[124,125,126...|
          //    |  0.0|(692,[152,153,154...|(692,[152,153,154...|
          //    |  1.0|(692,[97,98,99,12...|(692,[97,98,99,12...|
          //    |  1.0|(692,[124,125,126...|(692,[124,125,126...|
          //    +-----+--------------------+--------------------+
          //    only showing top 20 rows
        }
      }
      
  • Bucketizer 分箱 , 分桶 : Bucketizer将一列连续特征转换为一列要素存储区,其中存储区由用户指定。它需要一个参数:

    • splits:用于将连续要素映射到存储桶的参数。对于n +1个分裂,有n个桶。由splits x,y定义的存储区包含除最后一个存储区之外的[x,y]范围内的值,该存储区还包括y。

    • import org.apache.spark.sql.SparkSession
      
      object Bucketizer {
        def main(args: Array[String]): Unit = {
          import org.apache.spark.ml.feature.Bucketizer
          val spark: SparkSession = SparkSession.builder()
            .appName("SparkMlilb")
            .master("local[2]")
            .getOrCreate()
          spark.sparkContext.setLogLevel("WARN")
          val splits = Array(Double.NegativeInfinity, -0.5, 0.0, 0.5, Double.PositiveInfinity)
      
          val data = Array(-0.5, -0.3, 0.0, 0.2)
          val dataFrame = spark.createDataFrame(data.map(Tuple1.apply)).toDF("features")
      
          val bucketizer = new Bucketizer()
            .setInputCol("features")
            .setOutputCol("bucketedFeatures")
            .setSplits(splits)
      
          // Transform original data into its bucket index.
          val bucketedData = bucketizer.transform(dataFrame)
          bucketedData.show()
          //      +--------+----------------+
          //      |features|bucketedFeatures|
          //      +--------+----------------+
          //      |    -0.5|             1.0|
          //      |    -0.3|             1.0|
          //      |     0.0|             2.0|
          //      |     0.2|             2.0|
          //      +--------+----------------+
        }
      }
      //结果解释 : -0.5和-0.3都在1号桶 , 0和0.2在2号桶
      //桶的编号从0开始???
      
  • SQLTransformer

    • import org.apache.spark.ml.feature.SQLTransformer
      import org.apache.spark.sql.SparkSession
      
      object SqlTransformer {
        def main(args: Array[String]): Unit = {
          val spark: SparkSession = SparkSession.builder()
            .appName("SparkMlilb")
            .master("local[2]")
            .getOrCreate()
          spark.sparkContext.setLogLevel("WARN")
          val df = spark.createDataFrame(
            Seq((0, 1.0, 3.0), (2, 2.0, 5.0))).toDF("id", "v1", "v2")
      df.show()
          //    +---+---+---+
          //    | id| v1| v2|
          //    +---+---+---+
          //    |  0|1.0|3.0|
          //    |  2|2.0|5.0|
          //    +---+---+---+
          val sqlTrans = new SQLTransformer().setStatement(
            "SELECT *, (v1 + v2) AS v3, (v1 * v2) AS v4 FROM __THIS__")
      
          sqlTrans.transform(df).show()
          //      +---+---+---+---+----+
          //      | id| v1| v2| v3|  v4|
          //      +---+---+---+---+----+
          //      |  0|1.0|3.0|4.0| 3.0|
          //      |  2|2.0|5.0|7.0|10.0|
          //      +---+---+---+---+----+
        }
      }
      //结果解读 : 将低维的数据进行增加维度 , 是对原来维度的整合 , 特征融合
      
  • QuantileDiscretizer : 连续属性离散化 —分位数

    • QuantileDiscretizer采用具有连续特征的列,并输出具有分箱分类特征的列。箱数由numBuckets参数设定。

    • import org.apache.spark.sql.SparkSession
      object QuantileDiscreator {
        def main(args: Array[String]): Unit = {
          import org.apache.spark.ml.feature.QuantileDiscretizer
          val spark: SparkSession = SparkSession.builder()
            .appName("SparkMlilb")
            .master("local[2]")
            .getOrCreate()
          spark.sparkContext.setLogLevel("WARN")
          val data = Array((0, 18.0), (1, 19.0), (2, 8.0), (3, 5.0), (4, 2.2))
          var df = spark.createDataFrame(data).toDF("id", "hour")
      
          val discretizer = new QuantileDiscretizer()
            .setInputCol("hour")
            .setOutputCol("result")
            .setNumBuckets(3)
      
          val result = discretizer.fit(df).transform(df)
          result.show()
          //    +---+----+------+
          //    | id|hour|result|
          //    +---+----+------+
          //    |  0|18.0|   2.0|
          //    |  1|19.0|   2.0|
          //    |  2| 8.0|   1.0|
          //    |  3| 5.0|   1.0|
          //    |  4| 2.2|   0.0|
          //    +---+----+------+
        }
      }
      

6.Mllib抽取-转换-选择之特征选择器

  • 特征选择VectorSlicer是一个变换器 , 它采用一个特征向量 ,并输出一个带有原始特征子阵列的新特征向量。

    • import org.apache.spark.ml.attribute.{Attribute, AttributeGroup, NumericAttribute}
      import org.apache.spark.ml.feature.VectorSlicer
      import org.apache.spark.ml.linalg.Vectors
      import org.apache.spark.sql.{Row, SparkSession}
      import org.apache.spark.sql.types.StructType
      
      object VectorSlicer_4 {
        def main(args: Array[String]): Unit = {
          import java.util.Arrays
      
          val spark: SparkSession = SparkSession.builder()
            .appName("SparkMlilb")
            .master("local[2]")
            .getOrCreate()
          spark.sparkContext.setLogLevel("WARN")
      
          val data = Arrays.asList(Row(Vectors.dense(-2.0, 2.3, 0.0)))
      
          val defaultAttr = NumericAttribute.defaultAttr
          val attrs = Array("f1", "f2", "f3").map(defaultAttr.withName)
          val attrGroup = new AttributeGroup("userFeatures", attrs.asInstanceOf[Array[Attribute]])
      
          val dataset = spark.createDataFrame(data, StructType(Array(attrGroup.toStructField())))
      
          val slicer = new VectorSlicer().setInputCol("userFeatures").setOutputCol("features")
      
          slicer.setIndices(Array(1)).setNames(Array("f3"))
          //or slicer.setIndices(Array(1, 2)), or slicer.setNames(Array("f2", "f3"))
      
          val output = slicer.transform(dataset)
          println(output.select("userFeatures", "features").first())
          //[[-2.0,2.3,0.0],[2.3,0.0]]
        }
      }
      
  • RFormula根据R公式

    • RFormula选择由R模型公式指定的列。目前,我们支持R运算符的有限子集,包括'〜','。',':','+'和' - '。基本的运营商是:
      •	~ 单独的目标和条款
      •	+ concat术语,“+ 0”表示删除拦截
      •	- 删除一个术语,“ - 1”表示删除拦截
      •	: 交互(数值乘法或二进制分类值)
      •	. 除目标之外的所有列
      
    • import org.apache.spark.ml.feature.RFormula
      import org.apache.spark.sql.SparkSession
      
      object RSelectElement {
        def main(args: Array[String]): Unit = {
          val spark: SparkSession = SparkSession.builder()
            .appName("SparkMlilb")
            .master("local[2]")
            .getOrCreate()
          spark.sparkContext.setLogLevel("WARN")
          val dataset = spark.createDataFrame(Seq(
            (7, "US", 18, 1.0),
            (8, "CA", 12, 0.0),
            (9, "NZ", 15, 0.0)
          )).toDF("id", "country", "hour", "clicked")
          val formula = new RFormula()
            .setFormula("clicked ~ country + hour")
            .setFeaturesCol("features")
            .setLabelCol("label")
          val output = formula.fit(dataset).transform(dataset)
          output.select("features", "label").show()
          //    +--------------+-----+
          //    |      features|label|
          //    +--------------+-----+
          //    |[0.0,0.0,18.0]|  1.0|
          //    |[1.0,0.0,12.0]|  0.0|
          //    |[0.0,1.0,15.0]|  0.0|
          //    +--------------+-----+
        }
      }
      
  • 卡方验证Chisquare

  • ChiSqSelector代表Chi-Squared特征选择。它使用具有分类特征的标记数据进行操作。ChiSqSelector根据 类的独立性Chi-Squared测试来命令特征 ,然后过滤(选择)类标签最依赖的顶级特征。这类似于产生具有最强预测能力的特征。

    • import org.apache.spark.ml.feature.ChiSqSelector
      import org.apache.spark.ml.linalg.Vectors
      import org.apache.spark.sql.SparkSession
      object chiSquare {
        def main(args: Array[String]): Unit = {
          val spark: SparkSession = SparkSession.builder()
            .appName("SparkMlilb")
            .master("local[2]")
            .getOrCreate()
          spark.sparkContext.setLogLevel("WARN")
          val data = Seq(
            (7, Vectors.dense(0.0, 0.0, 18.0, 1.0), 1.0),
            (8, Vectors.dense(0.0, 1.0, 12.0, 0.0), 0.0),
            (9, Vectors.dense(1.0, 0.0, 15.0, 0.1), 0.0)
          )
      
          val df = spark.createDataset(data).toDF("id", "features", "clicked")
      
          val selector = new ChiSqSelector()
            .setNumTopFeatures(1)
            .setFeaturesCol("features")
            .setLabelCol("clicked")
            .setOutputCol("selectedFeatures")
      
          val result = selector.fit(df).transform(df)
          result.show()
        }
      }
      

6-1.最小二乘法

  • 最小二乘法–数学上重要方法 — 不一定能得到最优解
  • f(x)预测值 ---- y真实值
  • 构建平方损失Loss=sum{(y-f(x))**2}
  • 求解Loss的导数,关于参数求导
  • 令导数为0,得到参数求解的公式,利用公式迭代求解参数
  • 最终得到参数最优解
  • 和梯度下降法结合理解

7.ALS 实战从行为数据到评分再到预测-API简介

  • ALS—交替最小二乘法算法学习潜在因素
  • 几个参数:
    • numblocks分块个数----默认为10
    • rank隐因子个数----默认为10
    • maxiterator迭代次数----默认10
    • regparrm正则化参数----默认1.0
    • implictPref显式反馈----默认false
    • alpha隐式反馈的参数—置信参数----默认1.0
    • nonnegative非负最小二乘法----默认false
  • 显式反馈和隐式反馈
    • 用户有明确的喜好,如打分,显式反馈
    • 用户没有明确打分,但是有点击、浏览、收藏等行为,构成隐式反馈,通过alpha参数控制隐式反馈的参数
  • 正则化参数
    • 主要通过正则化参数达到控制参数的复杂度,防止模型的过拟合
  • 冷启动策略
    • 设置nan方式,但是会因为设置了nan评价参数业务nan —默认方式
    • 设置drop方式,进一步在构建模型的时候不处理新加入的用户或商品
  • SparkMl上调用Spark的ALS包
    • 基于dataframe
    • new ALS()添加参数
  • SparkMLLIB上调用Spark的ALS包
    • 基于rdd的
    • ALS.train()

8.ALS 实战从行为数据到评分再到预测-需求分析与说明

  • ALS实战电商数据
    • 数据来源:从大数据工程师处理好的结构化的数据给到算法工程师
    • 数据格式:[user,itemid,type,timestamp,times]
    • 对userid列来讲拿到的数据是需要处理的,采用stringIndexer将string类型的user转换为数值类型供计算

9.ALS 实战从行为数据到评分再到预测-实战

@Since("0.8.0")
case class Rating @Since("0.8.0") (
    @Since("0.8.0") user: Int,
    @Since("0.8.0") product: Int,
    @Since("0.8.0") rating: Double)
  • 通过Spark处理数据成为Rating接受的类型—userid(int)+itemid(int)+rating(double)
  • [user,itemid,type,timestamp,times]
  • 处理user---->usercode---->userid----使用的方法是StringIndex(转化为datafrmame进行fit和transform)
  • 处理type设置不同分数
    • pv浏览=1分
    • fav收藏=3分
    • buy购买=10分
  • 设置rating打分规则
    • type数值化*times=得到得分
  • 处理数据完毕
  • 引入算法+数据=>模型
  • SparkMllib中的ALS算法
  • Als.train(numblocks,rank,regparam,iteration)
  • predictions=als.predict
  • rmse进行预测
  • 输出推荐结果—uid+itemid+rating排序

10-ALS算法入门与LFM区别和联系

  • LFM-Latent Factor machine隐因子分析模型
    • Y=A*B
    • Y矩阵分解为两个矩阵的乘积的形式,通过随机初始化A矩阵和B矩阵,构建损失函数,利用梯度下降法,近似求解A和B矩阵的最优解
  • ALS是在LFM基础上使用的交替的最小二乘法的方式进行参数的求解
    • 固定U矩阵求解V矩阵
    • 固定V矩阵求解U矩阵

11-ALS算法实战基础推荐

package com.itck.als

import org.apache.spark.metrics.source
import org.apache.spark.{SparkConf, SparkContext}

/**
  * 余弦相似度
  */
object ConsineSimilar {
  val conf = new SparkConf()
    .setAppName("ConsineSimilar")
    .setMaster("local")
  val sc = new SparkContext(conf)
  //实例化环境
  val users = sc.parallelize(Array("aaa", "bbb", "ccc", "ddd", "eee"))
  //设置电影名
  val films = sc.parallelize(Array("smzdm", "yixb", "znh", "nhsc", "fcwr"))
  //使用一个 source 嵌套 map 作为姓名电影名和分值的存储
  var source = Map[String, Map[String, Int]]()
  //设置一个用以存放电影分的 map
  val filmSource = Map[String, Int]()

  /**
    * 设置电影评分
    *
    * @return
    */
  def getSource(): Map[String, Map[String, Int]] = {
    val user1FilmSource = Map("smzdm" -> 2, "yixb" -> 3, "znh" -> 1, "nhsc" -> 0, "fcwr" -> 1)
    val user2FilmSource = Map("smzdm" -> 1, "yixb" -> 2, "znh" -> 2, "nhsc" -> 1, "fcwr" -> 4)
    val user3FilmSource = Map("smzdm" -> 2, "yixb" -> 1, "znh" -> 0, "nhsc" -> 1, "fcwr" -> 4)
    val user4FilmSource = Map("smzdm" -> 3, "yixb" -> 2, "znh" -> 0, "nhsc" -> 5, "fcwr" -> 3)
    val user5FilmSource = Map("smzdm" -> 5, "yixb" -> 3, "znh" -> 1, "nhsc" -> 1, "fcwr" -> 2)
    source += ("aaa" -> user1FilmSource) //对人名进行存储
    source += ("bbb" -> user2FilmSource) //对人名进行存储
    source += ("ccc" -> user3FilmSource) //对人名进行存储
    source += ("ddd" -> user4FilmSource) //对人名进行存储
    source += ("eee" -> user5FilmSource) //对人名进行存储
    source //返回 map
  }

  /**
    * 计算余弦相似性
    *
    * @param user1
    * @param user2
    * @return
    */
  def getCollaborateSource(user1: String, user2: String): Double = {
    //获得第一个用户的评分
    val user1FilmSource = source.get(user1).get.values.toVector
    //获得第二个用户的评分
    val user2FileSource = source.get(user2).get.values.toVector
    //对欧几里得公式分子部分进行计算
    val member =
      user1FilmSource.zip(user2FileSource).map(num => num._1 * num._2).reduce(_ + _).toDouble
    //求出分母第一个变量的值
    val temp1 = math.sqrt(user1FilmSource.map(num => {
      math.pow(num, 2)
    }).reduce(_ + _)).toDouble
    //求出分母第二个变量的值
    val temp2 = math.sqrt(user2FileSource.map(num => {
      math.pow(num, 2)
    }).reduce(_ + _)).toDouble
    //求出分母
    val denominator = temp1 * temp2
    //返回结果
    member / denominator
  }

  def main(args: Array[String]): Unit = {
    //初始化分数
    getSource()
    //设定目标对象
    val name = "bbb"
    //迭代进行计算
    users.foreach(user => {
      println(name + " 相对于 " + user + "的相似性分数为: " + getCollaborateSource(name, user))
    })
    val frist = users.sortBy((user => getCollaborateSource(name, user)), false, 1).first()
    println("-----------------------------------------------------------")
    println("相似度最高的用户为:" + frist)
    /**
      * 计算结果如下:
      * bbb 相对于 aaa 的相似性分数为: 0.7089175569585667
      * bbb 相对于 bbb 的相似性分数为: 1.0000000000000002
      * bbb 相对于 ccc 的相似性分数为: 0.8780541105074453
      * bbb 相对于 ddd 的相似性分数为: 0.6865554812287477
      * bbb 相对于 eee 的相似性分数为: 0.6821910402406466
      */
  }
}
  • 建模
import org.apache.spark.mllib.recommendation.{ALS, Rating}
import org.apache.spark.{SparkConf, SparkContext}

object CollaborativeFilter {
  def main(args: Array[String]): Unit = {
    val conf = new SparkConf()
      .setAppName("CollaborativeFilter")
      .setMaster("local")
    val sc = new SparkContext(conf)
    //设置数据集
    val data = sc.textFile("..\\d.txt")
    //处理数据
    val ratings = data.map(_.split(" ") match {
      case Array(user, item, rate) => //转化数据集
        Rating(user.toInt, item.toInt, rate.toDouble) //将数据集转化为专用的 Rating
    })
    val rank = 2 //设置隐藏因子
    val numIterations = 2 //设置迭代次数
    val model = ALS.train(ratings, rank, numIterations, 0.01) //进行模型训练
    val rs = model.recommendProducts(2, 1) //为用户 2 推荐一个商品
    rs.foreach(println) //打印推荐结果
    val result: Double = rs(0).rating //预测的评分结果
    val realilty = data.map(_.split(" ") match {
      case Array(user, item, rate) =>
        Rating(user.toInt, item.toInt, rate.toDouble)
    }).map(num => {
      if (num.user == 2 && num.product == 15)
        num.rating //返回实际评分结果
      else
        0
    }).foreach(num => {
      if (num != 0)
        println("对 15 号商品预测的准确率为:" + (1 - (math.abs(result - num) / 1)))
    })
  }
}

12-ALS算法原理详解

  • ALS算法利用交替最小二乘法最优解算法结合LFM的矩阵分解方式进行学习其中参数
  • SVD将一个大的评分矩阵分解为了三个矩阵SVD(X)=U*Sigma*VT
  • 注 : 在使用SVD方法前 , 大的评分矩阵需要被补全
    • 算法的时间复杂度较高的
    • SVD算法要求矩阵的数值是填充的
    • Sigma存放奇异值
  • A*Y(Y.T*Y).inv=X

13-ALS算法步骤详解

  • 交替最小二乘法是对最小二乘法处理多个变量时的扩展
  • 算法推导图解

在这里插入图片描述

  • 推导过程

在这里插入图片描述

  • ALS算法思路:固定一个矩阵求解另外一个矩阵的导数,固定一个矩阵求解另外一个矩阵的导数
  • ALS算法步骤:
    • 构建损失函数,Loss=(r-r_pred)**2+lambda1*u+lambda2*v
    • 固定U矩阵求解V矩阵
      • v=M1.inv*M2 其中M1和M2是关于U的矩阵的运算
    • 固定V矩阵求解U矩阵
      • u=M1.inv*M2 其中M1和M2是关于V的矩阵的运算
    • 满足迭代次数停止

14-ALS算法显示反馈与隐式反馈

  • 显式反馈直接通过显式打分进行矩阵分解
  • 隐式反馈从数学层面讲,引入alpha置信参数,R是交互次数
    • 隐式反馈特点
      • 没有负反馈
      • 隐式反馈是内在的噪音
      • 显示反馈的数值表示偏好 , 隐式反馈数值表示信任 ; 一个较大的值并不能表明更多的偏爱 。 但是这个值是有用的 , 它描述了在一个特定观察中的信任度。
      • 评价隐式反馈推荐系统需要合适的手段。
  • 定义隐式反馈的损失函数的参数:C=1+R*alpha ====R表示信任度 , alpha表示置信参数
  • Loss=C*(r-r_pred)**2+lambda1*u+lambda2*v

15-ALS算法源码简介

16.ALS推荐算法在Spark上的优化

  • 参考https://blog.youkuaiyun.com/butterluo/article/details/48271361
  • Spark+Kafka流优化https://blog.youkuaiyun.com/butterluo/article/details/47083773
  • ALS优化场景
    • ALS加载数据
      • 使用Hadoop的 CombineFileInputFormat类进行小文件合并成split在加载到spark中,加快了加载数据速度
    • ALS预测计算
      • 优化JVM中参数,效果不明显
      • 通过源码查看—看到了源码部分中ALS使用了笛卡尔积操作=====>复杂度是指数级别(复杂度极高)
      • 在笛卡尔积的之前进行预处理分block块----420000块
      • 在预分块之前做一个预分区----加快数据分不到不同分区和block块下面进行处理的速度

17.SVD推荐算法简介

  • 参考课件图示理解

18.PySpark基础环境搭建(了解)

  • PySpark环境搭建
  • 准备好大数据环境
    • jdk
    • hadoop2.7.4
    • spark2.3.3
    • 缺少组件
  • 准备好Python环境
    • Anaconda
    • Python原生环境
  • 结合形成Pyspark
    • 复制spark源码包中的python目录下面的pyspark目录到Lib下面的site-packages

19.构建PySpark简单推荐系统(了解)

  • 通过pyspark构建推荐系统
  • 使用python数据科学包有一个pandas的包进行数据科学开发
  • 使用pyspark完成简单推荐系统
    • 使用pandas处理数据格式为-userid+itemid+rating打分
    • 使用pyspark中als算法进行训练模型
    • 使用模型预测5个喜欢的歌手
    • 将喜欢的歌手id和歌手名字进行关联进行输出

20.总结

SparkMLlib&ALS

在这里插入图片描述

推荐系统-基于模型协同过滤理论基础与业务实践 推荐系统-基于模型协同过滤理论基础与业务实践 1.SparkMllib库框架详解 Spark机器学习库 五个组件 ML Algratham算法 Pipelines管道 Featureszation Persistence Utilitiesl Sparkml和Sparkmllib ml基于DatafrmaeAPI mllib基于rdd的API 2.SparkMllib基本数据... 阅读详情

相关推荐

基于协同过滤技术的推荐系统研究与实现

本文研究了基于协同过滤的推荐系统算法,包括用户协同过滤和物品协同过滤两种主要方法。通过实现基于Python的推荐系统原型,分析了不同相似度计算方法和最近邻选择策略对推荐效果的影响。实验结果表明,在MovieLens数据集上,基于皮尔逊相关系数的用户协同过滤算法取得了较好的推荐效果。

Deng945201314的博客 659

推荐系统:协同过滤

上一篇文章我们介绍了,可以根据产品元数据计算的,提供制定推荐的选择,推荐与用户过往购买过的产品相关性最相似的产品,今天我们来聊聊如何通过利用用户和产品之间的相似性提供建议的方法。协同过滤是一种利用用户和产品之间的相似性提供建议的方法。协同过滤分析相似的用户或相似评级的产品,并根据此分析推荐用户。

stone1290的专栏 666

基于Spark的协同过滤推荐系统操作指南

利用Spark构建推荐系统,重点讲解协同过滤算法的操作步骤与实战技巧,帮助快速掌握大规模数据下的推荐模型训练与预测过程。涵盖数据预处理、模型训练与评估等关键环节,适用于推荐系统开发与优化。

weixin_33759613的博客 902

基于协同过滤的推荐算法(用户协同、物品协同、模型协同)

文章目录介绍1.基于用户的协同过滤推荐2.基于项目(物品)的协同过滤推荐3.基于模型的协同过滤推荐实现步骤1.用户协同过滤和物品协同过滤的实现方法1.收集用户偏好2.计算用户或物品的相似度3.推荐2.模型协同过滤的实现方法待补充 介绍 1.基于用户的协同过滤推荐 基于用户的协同过滤推荐的基本原理是,根据所有用户对物品或者信息的偏好,发现与当前用户口味和偏好相似的“邻居”用户群。基于邻居的历史偏好信息,为当前用户进行推荐。 即:归类相似用户ABC,推荐用户BC的物品给用户A 优点:可以间接发现相似用户的潜在兴

什么都干的派森 1万+

高斯混合模型在推荐系统中的应用:如何构建个性化推荐系统

作者:禅与计算机程序设计艺术 什么是推荐系统? 推荐系统是指根据用户的兴趣、偏好、历史行为等信息,推荐其可能喜欢或感兴趣的内容。例如,当用户访问某个网站时,推荐系统会通过分析用户的历史浏览记录、购买习惯、位置信息等,为用户提供一些相关的产品和服务。所以,推荐系统可以帮助用户找到自己感兴趣的商品

AI天才研究院 2755

推荐系统理论与实践:源码实操教程

协同过滤算法是推荐系统中常用的算法之一,其核心思想是利用用户群体的集体智慧来生成个性化推荐。协同过滤可以分为两大类:基于用户的协同过滤和基于项目的协同过滤。基于用户的协同过滤依赖于用户相似性,寻找与目标用户有相似喜好的其他用户,通过他们的喜好来为该用户推荐项目。而基于项目的协同过滤则关注于项目本身的相似性,发现与目标用户已经喜欢的项目相似的其他项目来进行推荐。

weixin_36296444的博客 825

协同过滤推荐算法总结

推荐算法具有非常多的应用场景和商业价值,因此对推荐算法值得好好研究。推荐算法种类很多,但是目前应用最广泛的应该是协同过滤类别的推荐算法,本文就对协同过滤类别的推荐算法做一个概括总结,后续也会对一些典型的协同过滤推荐算法做原理总结。 推荐算法概述     推荐算法是非常古老的,在机器学习还没有兴起的时候就有需求和应用了。概括来说,可以分为以下5种: 1)基于内容的推荐:这一类一般依赖于自然语言处...

kai46385076的专栏 1785

RecommenderSystems:基于模型的推荐系统

基于模型的推荐系统的Tensorflow代码 这是4种不同推荐器模型的Tensorflow实现。 潜在因素模型推荐系统 基于深度神经网络的推荐系统 无需转移学习的潜在因子模型和深度神经网络模型的集成 潜在因子模型与深度神经网络模型与转移学习的集成 依存关系 突出的软件包是: 麻木 scikit学习 张量流1.5.0 熊猫0.23.1 数据集 跑步 mkdir datasets mkdir tf_logs mkdir pretrained_models mkdir tf_logs/ml-100k mkdir tf_logs/ml-1m mkdir tf_logs/ml-20m mkdir pretrained_models/ml-100k mkdir pretrained_models/ml-1m mkdir pretrained_models/ml-20m cd scripts ./

大模型放进推荐系统怎么玩儿?先来聊聊推荐系统

大模型放进推荐系统怎么玩儿?先来聊聊推荐系统 什么是推荐系统 推荐系统解决了哪些问题 推荐系统的应用领域 常用的推荐算法 基于内容的推荐算法 协同过滤算法 如何系统学习推荐系统

m0_75058342的博客 2755

基于云模型的协同过滤推荐算法

协同过滤系统是电子商务系统中最重要的技术之一,用户相似性度量方法是影响推荐算法准确率高低的关键因素

推荐系统中基于深度学习的混合协同过滤模型

推荐系统中基于深度学习的混合协同过滤模型各种算法介绍和应用场景

推荐系统-基于模型协同过滤理论基础与业务实践笔记

推荐系统-基于模型协同过滤理论基础与业务实践 1.SparkMllib库框架详解 Spark机器学习库 五个组件 ML Algratham算法 Pipelines管道 Featureszation Persistence Utilitiesl Sparkml和Sparkmllib ml基于DatafrmaeAPI mllib基于rdd的API 2.SparkMllib基本数据...

weixin_43614188的博客 346

Xilinx Vitis 2020.1中Microblaze SREC SPI Bootloader初始化失败的调试与修复指南

本文详细解析了在Xilinx Vitis 2020.1开发环境中,Microblaze SREC SPI Bootloader初始化失败的常见原因与解决方案。核心问题通常源于Flash上电时序或软件配置,如`serial_flash_family`参数未生效、链接脚本设置不当或BRAM初始化文件选择错误。文章提供了从硬件配置检查、工程设置修正到代码级添加重试机制的完整调试路径,帮助开发者快速定位并修复启动故障,确保系统稳定启动。

weixin_29163857的博客 186

推荐系统:从基础理论到实际应用

1.背景介绍 推荐系统是人工智能和大数据领域的一个重要分支,它涉及到了许多热门的话题,例如机器学习、深度学习、数据挖掘、知识发现等。推荐系统的核心任务是根据用户的历史行为、兴趣和需求,为用户推荐一组相关的物品(如商品、电影、音乐等)。这些物品可能是用户之前没有接触过的,因此推荐系统需要有效地学习用户的喜好和需求,并在大量的物品库中找到最佳的匹配项。 推荐系统的研究历史可以追溯到1990年代末,...

AI天才研究院 1076

lvgl 实现表格table,并且固定表头

嵌入式实现table,lvgl 实现原生表格table组件

m0_61704502的博客 1271

利用CANoe和CAPL实现高效CAN网关设计与仿真

本文详细介绍了如何利用CANoe和CAPL进行高效CAN网关的设计与仿真。通过搭建仿真工程、导入DBC数据库、编写CAPL脚本等步骤,手把手指导读者构建一个连接不同CAN网络的网关模型,实现报文的监听、转发与信号处理,从而在硬件开发前验证逻辑,提升汽车电子开发效率与可靠性。

weixin_29164091的博客 294

推荐系统架构与机器学习基础理论

一、推荐系统架构与机器学习基础理论 1 机器学习发展历程与架构原理 1.1 发展历程 大数据时代: 频率近似为概率 计算机性能 :计算速度提升 时间段 发展时期 主流技术 二十世纪五十年代初至七十年代初 推理期 运用基于符号知识表示的演绎推理技术 二十世纪七十年代中期至八十年代 知识期 基于符号知识表示,通过获取和利用领域知识来建立专家系统 二十世纪八十年代至今 学习期 两大主流技术分别是符号主义学习和基于神经网络的连接主义学习 1.2 优化问题与凸优化问题 任何

学习服务 3029

afe模拟前端的重要性_高性能模拟前端信号链解决方案如何助力医疗超声系统发展...

1942年,奥地利TDussik使用A型超声成像系统穿透性探测颅脑,并于1949年获得头部的超声图像,此举昭示超声系统进入到医疗领域。直到如今,超声系统作为用于人体内部的无创可视化技术,被广泛用于医疗领域。最近一份报告称到2022年,中国医疗超声诊断仪器行业的市场规模预计将达到15.8亿美元,保持6%左右的年均增长率。高性能模拟信号链前端是超声设备的关键组成部分,作为高性能模拟技术主要的提供商AD...

weixin_28799111的博客 1088

推荐系统 | 推荐系统核心原理与架构详解:从理论到工业实践

推荐系统在信息过载时代发挥着关键作用,通过智能匹配用户偏好与内容特征提升信息获取效率。其核心技术包括协同过滤、基于内容和知识的推荐,面临冷启动、数据稀疏性等挑战。典型架构采用分层处理(召回-排序-重排),使用深度学习、图网络等先进算法。评估需兼顾准确性(CTR、NDCG)和多样性,未来发展将聚焦大模型融合、实时化与公平性优化。这一系统工程需要算法创新与业务理解的深度结合,以实现精准推荐与用户体验的平衡。

qq_54965561的博客 9260

OpenGL绘制简单场景,实现旋转缩放平移和灯光效果

本项目实现了用OpenGL绘制一个简单场景,包含正方体、球体和网格,实现了物体的旋转、缩放、平移和灯光效果。附有项目完整代码,有详细注释。适合初学者熟悉opengl使用。

张竞成的博客 1万+

RH850从0搭建Autosar开发环境【6】- Davinci Configurator之CanIf模块配置详解(下)

RH850从0搭建Autosar开发环境【6】- Davinci Configurator之CanIf模块配置详解(下)

weixin_42412049的博客 2584

推荐系统理论知识和基本思路

推荐系统理论 1. 什么是推荐系统 2. 总体架构 2.1 离线推荐 2.2 在线训练 3. 特征数据 4. 协同过滤算法 4.1 基于物品的协同过滤(ItemCF) 4.2 基于用户的协同过滤(UserCF) 4.3 矩阵分解 5. 隐语义模型 5.1 基本思想 5.2 模型理解 6. 排序算法 7. 评估测试 7.1 A/B测试 7.2 其它评估方法 8. 推荐系统冷...

weixin_43788143的博客 2866

29、机器人动力学中的欧拉 - 拉格朗日与哈密顿力学

本文深入探讨了机器人动力学中的欧拉-拉格朗日与哈密顿力学框架,涵盖向量流形上的辛结构、哈密顿方程的几何代数表述、泊松括号与积分不变量等核心概念。文章详细推导了机电系统中拉格朗日量与哈密顿量的构建方法,并结合牛顿-欧拉算法给出了局部哈密顿量和动量导数的迭代计算流程,适用于多关节机器人的动力学建模与控制设计。通过应用案例展示了理论在双关节机器人手臂中的实际运用,最后展望了其在优化控制、鲁棒性提升及智能融合方向的潜力。

perl8的博客 129

离线推荐服务建设——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(七)

系列文章目录 初识推荐系统——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(三) 项目体系架构设计——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(四) 基础环境搭建——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(五) 创建项目并初始化业务数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客

IronmanJay 4197

【TIDB】TiDB认证考试PTCA 练习题 题库

TiDB认证考试PTCA 练习题 题库

DBA之路的博客 4720

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: 推荐系统-经典协同过滤算法【基于记忆的协同过滤算法、基于模型的协同过滤算法】
下一篇: 推荐系统-关联规则理论基础与业务实践
CoderBoom
博客等级 码龄8年 62粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值