Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何提高我的推荐结果?我用的是spark_Apache Spark_Recommendation Engine_Apache Spark Mllib - Fatal编程技术网

Apache spark 如何提高我的推荐结果?我用的是spark

Apache spark 如何提高我的推荐结果?我用的是spark,apache-spark,recommendation-engine,apache-spark-mllib,Apache Spark,Recommendation Engine,Apache Spark Mllib,首先,我有一些用户应用程序的使用历史 例如: 用户1、应用程序1、3(启动时间) user2,app2,2(启动时间) 用户3,应用程序1,1(启动时间) 我基本上有两个要求: 为每个用户推荐一些应用程序 为每个应用推荐类似的应用 所以我在spark上使用MLLib的ALS(隐式)来实现它。首先,我只是使用原始数据来训练模型。结果很糟糕。我认为这可能是由发射时间范围造成的。发射时间从1到数千。所以我处理原始数据。我认为分数能反映真实情况,更加正规化 分数=lt/uMlt+lt/aMlt 分数是训

首先,我有一些用户应用程序的使用历史

例如:
用户1、应用程序1、3(启动时间)
user2,app2,2(启动时间)
用户3,应用程序1,1(启动时间)

我基本上有两个要求:

  • 为每个用户推荐一些应用程序
  • 为每个应用推荐类似的应用 所以我在spark上使用MLLib的ALS(隐式)来实现它。首先,我只是使用原始数据来训练模型。结果很糟糕。我认为这可能是由发射时间范围造成的。发射时间从1到数千。所以我处理原始数据。我认为分数能反映真实情况,更加正规化

    分数=lt/uMlt+lt/aMlt

    分数是训练模型的过程结果。
    它是原始数据中的启动时间。
    uMlt是原始数据中用户的平均启动时间。uMlt(用户的所有启动时间)/(该用户曾经启动过的应用程序数量)
    aMlt是原始数据中应用程序的平均启动时间。aMlt(应用程序的所有启动时间)/(曾经启动此应用程序的用户数)
    下面是一些处理后的数据示例

    评级(9578820992,0.14167073369026184)
    评级(9869620992,5.92363166809082)
    评级(16002011264,2.26153850554199)
    评级(6790411264,2.26153850554199)
    评级(26843011264,0.13846154510974884)
    评级(20136911264,1.7999959523162842)
    评级(18085711264,2.2720916271209717)
    评级(21769211264,1.369230747229004)
    评级(18627428672,2.4250855445861816)
    评级(12082028672,0.4422124922275543)
    评级(22114628672,1.0074234008789062)

    在我完成这项工作后,聚合具有不同包名的应用程序,结果似乎更好。但仍然不够好。
    我发现用户和产品的特性非常小,而且大多数都是负面的

    以下是3行产品功能示例,每行10个尺寸:

    ((-4.798973236574966E-7,-7.641608021913271E-7,6.04085240492017E-7,2.82689171626771E-7,2.82689171626771E-7,-4.255948056197667E-7,1.815822798789686E-7,5.0000471167413868E-7,2.02206664654134E-7,6.3867634082E-28927E-7],<2892727 ((-4.769295992446132E-5,-1.7072002810891718E-4,2.1351299074012786E-4,1.6345139010809362E-4,-1.4456869394052774E-4,2.3657752899453044E-4,-4.508546771830879E-5,2.08951858286378E-4,2.968782797852E-4,1.948453E-4))< ((CompactBuffer(com.tern.rest.pron)),(-1.219763362314552E-5,-2.8371430744300596E-5,2.9869115678593516E-5,2.074762347275764E-5,-2.05554715648875916E-5,2.63292938765144E-5,2.934047643066151E-6,2.296348611707799E-5,3.807561370948896E-5,1.2197551625E-5))

    以下是用户功能的3行示例,每行10个维度:

    (96768,(-0.0010857731103897095,-0.001926362863741815,0.0013726564357057214,6.345533765852451E-4,-9.04880813329613E-4,-4.1544197301846E-5,0.001442175940104684,-9.77902309386991E-5,0.001035551307229261,--0.001787825133881079))
    (97280,(-0.0022841691970825195,-0.0017134940717369318,0.0010273650988707378,9.4370559828877E-4,-0.0011165080359205604,0.0017137592658400536,9.713359759189188E-4,8.947265450842679E-4,0.0014328152174130082,-.7389045832868E-4))
    (97792,(-0.0017802991205826402,-0.003464450128376484,0.002837196458131075,0.00157256932057724,-0.0018932095263153315,9.185600210912526E-4,0.00189719546243548,7.2504504350944535E-4,0.0027060359716415405,-.0017731896488419))

    所以你们可以想象,当我得到特征向量的点积来计算用户项矩阵的值时,会有多小

    我的问题是:

  • 有没有其他方法可以改善推荐结果
  • 我的特征看起来是对的,还是出了什么问题
  • 我处理原始启动时间(转换为分数)的方法正确吗 我在这里放了一些代码。这绝对是一个程序问题。但也许几行代码无法解决这个问题

    val model = ALS.trainImplicit(ratings, rank, iterations, lambda, alpha)
    print("recommendForAllUser")
    val userTopKRdd = recommendForAllUser(model, topN).join(userData.map(x => (x._2._1, x._1))).map {
      case (uid, (appArray, mac)) => {
        (mac, appArray.map {
          case (appId, rating) => {
            val packageName = appIdPriorityPackageNameDict.value.getOrElse(appId, Constants.PLACEHOLDER)
            (packageName, rating)
          }
        })
      }
    }
    HbaseWriter.writeRddToHbase(userTopKRdd, "user_top100_recommendation", (x: (String, Array[(String, Double)])) => {
      val mac = x._1
      val products = x._2.map {
        case (packageName, rating) => packageName + "=" + rating
      }.mkString(",")
      val putMap = Map("apps" -> products)
      (new ImmutableBytesWritable(), Utils.getHbasePutByMap(mac, putMap))
    })
    
    print("recommendSimilarApp")
    println("productFeatures ******")
    model.productFeatures.take(1000).map{
      case (appId, features) => {
        val packageNameList = appIdPackageNameListDict.value.get(appId)
        val packageNameListStr = if (packageNameList.isDefined) {
          packageNameList.mkString("(", ",", ")")
        } else {
          "Unknow List"
        }
        (packageNameListStr, features.mkString("(", ",", ")"))
      }
    }.foreach(println)
    println("productFeatures ******")
    model.userFeatures.take(1000).map{
      case (userId, features) => {
        (userId, features.mkString("(", ",", ")"))
      }
    }.foreach(println)
    val similarAppRdd = recommendSimilarApp(model, topN).flatMap {
      case (appId, similarAppArray) => {
        val groupedAppList = appIdPackageNameListDict.value.get(appId)
        if (groupedAppList.isDefined) {
          val similarPackageList = similarAppArray.map {
            case (destAppId, rating) => (appIdPriorityPackageNameDict.value.getOrElse(destAppId, Constants.PLACEHOLDER), rating)
          }
          groupedAppList.get.map(packageName => {
            (packageName, similarPackageList)
          })
        } else {
          None
        }
      }
    }
    HbaseWriter.writeRddToHbase(similarAppRdd, "similar_app_top100_recommendation", (x: (String, Array[(String, Double)])) => {
      val packageName = x._1
      val products = x._2.map {
        case (packageName, rating) => packageName + "=" + rating
      }.mkString(",")
      val putMap = Map("apps" -> products)
      (new ImmutableBytesWritable(), Utils.getHbasePutByMap(packageName, putMap))
    })  
    
    更新:
    读了这篇论文后,我发现了一些关于我的数据的新东西(“隐性反馈数据集的协作过滤”)。与本文中描述的IPTV数据集相比,我的数据过于稀疏

    论文:30万(用户)17000(产品)3200万(数据)
    矿山:30万(用户)31000(产品)70万(数据)

    因此,论文数据集中的用户项目矩阵已填充为0.00627=(32000000/300000/17000)。我的数据集的比率是0.0000033。我认为这意味着我的用户项目矩阵比报纸的稀疏2000倍。

    这会导致坏结果吗?有什么办法可以改进吗?

    有两件事你应该试试:

  • 标准化数据,使每个用户向量的平均值和单位方差为零。这是许多机器学习中的常见步骤。它有助于减少异常值的影响,这些异常值会导致您看到的值接近零
  • 删除只有一个应用程序的所有用户。你从这些用户身上学到的唯一一件事就是应用程序分数的“平均”值稍微好一点。但是,它们不会帮助你学习任何有意义的关系,这才是你真正想要的

  • 从模型中删除用户后,通过提供用户ID,您将无法直接从模型中获取该用户的推荐。但是,他们仍然只有一个应用程序评级。因此,您可以在产品矩阵上运行KNN搜索,以查找与用户apps=recommendations最相似的应用程序。

    您的问题是否有任何更新?我有一个类似的问题。为什么要删除只有一个应用程序的用户?不理解你的理性只有一个应用程序的用户(标准化后,如上所述)将有100%或一列的最大值,所有其他列的条目将为0。这不会