mllib协同过滤 java实现_协同过滤(ALS)算法介绍及Spark MLlib调用实例(Scala/Java/Python)...

协同过滤

算法介绍:

协同过滤常被用于推荐系统。这类技术目标在于填充“用户-商品”联系矩阵中的缺失项。Spark.ml目前支持基于模型的协同过滤,其中用户和商品以少量的潜在因子来描述,用以预测缺失项。Spark.ml使用交替最小二乘(ALS)算法来学习这些潜在因子。

*注意基于DataFrame的ALS接口目前仅支持整数型的用户和商品编号。

显式与隐式反馈

基于矩阵分解的协同过滤的标准方法中,“用户-商品”矩阵中的条目是用户给予商品的显式偏好,例如,用户给电影评级。然而在现实世界中使用时,我们常常只能访问隐式反馈(如意见、点击、购买、喜欢以及分享等),在spark.ml中我们使用“隐式反馈数据集的协同过滤“来处理这类数据。本质上来说它不是直接对评分矩阵进行建模,而是将数据当作数值来看待,这些数值代表用户行为的观察值(如点击次数,用户观看一部电影的持续时间)。这些数值被用来衡量用户偏好观察值的置信水平,而不是显式地给商品一个评分。然后,模型用来寻找可以用来预测用户对商品预期偏好的潜在因子。

正则化参数

我们调整正则化参数regParam来解决用户在更新用户因子时产生新评分或者商品更新商品因子时收到的新评分带来的最小二乘问题。这个方法叫做“ALS-WR”它降低regParam对数据集规模的依赖,所以我们可以将从部分子集中学习到的最佳参数应用到整个数据集中时获得同样的性能。

参数:

alpha:

类型:双精度型。

含义:隐式偏好中的alpha参数(非负)。

checkpointInterval:

类型:整数型。

含义:设置检查点间隔(>=1),或不设置检查点(-1)。

implicitPrefs:

类型:布尔型。

含义:特征列名。

itemCol:

类型:字符串型。

含义:商品编号列名。

maxIter:

类型:整数型。

含义:迭代次数(>=0)。

nonnegative:

类型:布尔型。

含义:是否需要非负约束。

numItemBlocks:

类型:整数型。

含义:商品数目(正数)。

numUserBlocks:

类型:整数型。

含义:用户数目(正数)。

predictionCol:

类型:字符串型。

含义:预测结果列名。

rank:

类型:整数型。

含义:分解矩阵的排名(正数)。

ratingCol:

类型:字符串型。

含义:评分列名。

regParam:

类型:双精度型。

含义:正则化参数(>=0)。

seed:

类型:长整型。

含义:随机种子。

userCol:

类型:字符串型。

含义:用户列名。

调用示例:

下面的例子中,我们从MovieLens dataset读入评分数据,每一行包括用户、电影、评分以及时间戳。我们默认其排序是显式的来训练ALS模型。我们通过预测评分的均方根误差来评价推荐模型。如果评分矩阵来自其他信息来源,也可将implicitPrefs设置为true来获得更好的结果。

Scala:

import org.apache.spark.ml.evaluation.RegressionEvaluator

import org.apache.spark.ml.recommendation.ALS

case class Rating(userId: Int, movieId: Int, rating: Float, timestamp: Long)

def parseRating(str: String): Rating = {

val fields = str.split("::")

assert(fields.size == 4)

Rating(fields(0).toInt, fields(1).toInt, fields(2).toFloat, fields(3).toLong)

}

val ratings = spark.read.textFile("data/mllib/als/sample_movielens_ratings.txt")

.map(parseRating)

.toDF()

val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))

// Build the recommendation model using ALS on the training dataval als = new ALS()

.setMaxIter(5)

.setRegParam(0.01)

.setUserCol("userId")

.setItemCol("movieId")

.setRatingCol("rating")

val model = als.fit(training)

// Evaluate the model by computing the RMSE on the test dataval predictions = model.transform(test)

val evaluator = new RegressionEvaluator()

.setMetricName("rmse")

.setLabelCol("rating")

.setPredictionCol("prediction")

val rmse = evaluator.evaluate(predictions)

println(s"Root-mean-square error =$rmse")

Java:

import java.io.Serializable;

import org.apache.spark.api.java.JavaRDD;

import org.apache.spark.api.java.function.Function;

import org.apache.spark.ml.evaluation.RegressionEvaluator;

import org.apache.spark.ml.recommendation.ALS;

import org.apache.spark.ml.recommendation.ALSModel;

public static class Rating implements Serializable {

private int userId;

private int movieId;

private float rating;

private long timestamp;

public Rating() {}

public Rating(int userId, int movieId, float rating, long timestamp) {

this.userId = userId;

this.movieId = movieId;

this.rating = rating;

this.timestamp = timestamp;

}

public int getUserId() {

return userId;

}

public int getMovieId() {

return movieId;

}

public float getRating() {

return rating;

}

public long getTimestamp() {

return timestamp;

}

public static Rating parseRating(String str) {

String[] fields = str.split("::");

if (fields.length != 4) {

throw new IllegalArgumentException("Each line must contain 4 fields");

}

int userId = Integer.parseInt(fields[0]);

int movieId = Integer.parseInt(fields[1]);

float rating = Float.parseFloat(fields[2]);

long timestamp = Long.parseLong(fields[3]);

return new Rating(userId, movieId, rating, timestamp);

}

}

JavaRDD ratingsRDD = spark

.read().textFile("data/mllib/als/sample_movielens_ratings.txt").javaRDD()

.map(new Function() {

public Rating call(String str) {

return Rating.parseRating(str);

}

});

Dataset ratings = spark.createDataFrame(ratingsRDD, Rating.class);

Dataset[] splits = ratings.randomSplit(new double[]{0.8, 0.2});

Dataset training = splits[0];

Dataset test = splits[1];

// Build the recommendation model using ALS on the training dataALS als = new ALS()

.setMaxIter(5)

.setRegParam(0.01)

.setUserCol("userId")

.setItemCol("movieId")

.setRatingCol("rating");

ALSModel model = als.fit(training);

// Evaluate the model by computing the RMSE on the test dataDataset predictions = model.transform(test);

RegressionEvaluator evaluator = new RegressionEvaluator()

.setMetricName("rmse")

.setLabelCol("rating")

.setPredictionCol("prediction");

Double rmse = evaluator.evaluate(predictions);

System.out.println("Root-mean-square error = " + rmse);

Python:

from pyspark.ml.evaluation import RegressionEvaluator

from pyspark.ml.recommendation import ALS

from pyspark.sql import Row

lines = spark.read.text("data/mllib/als/sample_movielens_ratings.txt").rdd

parts = lines.map(lambda row: row.value.split("::"))

ratingsRDD = parts.map(lambda p: Row(userId=int(p[0]), movieId=int(p[1]),

rating=float(p[2]), timestamp=long(p[3])))

ratings = spark.createDataFrame(ratingsRDD)

(training, test) = ratings.randomSplit([0.8, 0.2])

# Build the recommendation model using ALS on the training data

als = ALS(maxIter=5, regParam=0.01, userCol="userId", itemCol="movieId", ratingCol="rating")

model = als.fit(training)

# Evaluate the model by computing the RMSE on the test data

predictions = model.transform(test)

evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating",

predictionCol="prediction")

rmse = evaluator.evaluate(predictions)

print("Root-mean-square error = " + str(rmse))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/550592.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java编程启蒙_程序设计入门—Java语言

第一周:做点计算1.1 第一个程序如何下载、安装Eclipse和JRE,并且简单介绍一下这个软件的几个主要部分;如何在Eclipse中编辑、编译和运行程序;详解第一个程序:程序框架、输出、出错怎么办;做点计算&#xff…

python中什么是关键字参数_Python中的关键字参数

关键字参数与函数调用有关。在函数调用中使用关键字参数时,调用者通过参数名称标识参数。由于Python解释器能够使用提供的关键字来将值与参数进行匹配,因此您可以跳过参数或将其乱序放置。您还可以通过以下方式对printme()函数进行关键字调用-示例#!/usr…

java 任意代码执行漏洞_php-fpm在nginx特定环境下的任意代码执行漏洞(CVE-2019-11043)...

目录0x01 漏洞介绍0x02 漏洞影响0x03 漏洞复现0x01 漏洞介绍在长亭科技举办的 Real World CTF 中,国外安全研究员 Andrew Danau 在解决一道 CTF 题目时发现,向目标服务器 URL 发送%0a符号时,服务返回异常,疑似存在漏洞。在nginx上…

c enum能像java一样吗_不一样的Java Enum

Emum是在Java5中引入的新特性,从那开始,它被广泛的用在不同的Java应用中,相比于C和C的Enum,Java的Enum功能更加强大。但是很多开发人员暂时还没意识到它的强大之处,在Enum的一些细节问题上把握的还不到位。Enum的特性及…

java se 9.0.4_jre 9下载(Java SE Runtime Environment)下载

JRE9官方下载是运行JAVA程序不可缺少的环境。JRE中由ClassLoader负责查找和加载程序引用到的类库,基础类库ClassLoader会到rt.jar中自动加载,其它的类库,ClassLoader在环境变量CLASSPATH指定的路径中搜索,按照先来先到的原则&…

php+数组存放文件名_php将数组存储为文本文件的三种方法

本篇文章主要介绍php将数组存储为文本文件的三种方法&#xff0c;感兴趣的朋友参考下&#xff0c;希望对大家有所帮助。(1)利用serialize 将数组序列化存储为文本文件&#xff0c;调用时候再使用unserialize 还原<?php $file./cache/phone.php;$arrayarray(color> array…

php 屏蔽ctrl c,ctrl+c用不了怎么回事

解决办法&#xff1a;首先在运行里输入clipbrd打开剪贴板查看器看看里面是什么东西如果是剪贴板卡死了的话重启可解决问题如果不是复制个别的东西还是那个那么需要杀毒了&#xff01;(可能是灰鸽子病毒&#xff0c;冲击、震荡、狙击等都有可能导致不能复制粘贴剪切)方法一&…

php生日计算年龄,php根据生日计算年龄的方法

摘要&#xff1a;本文实例讲述了php根据生日计算年龄的方法。分享给大家供大家参考。具体如下&#xff1a;<?php function birthday($birthday){$age strtotime($birthday);if($age false){return false;本文实例讲述了php根据生日计算年龄的方法。分享给大家供大家参考。…

jq php异步上传图片,php+jquery Ajax异步上传图片(ajaxSubmit)实例_PHP教程

$photo_typesarray(image/jpg, image/jpeg,image/png,image/pjpeg,image/gif,image/bmp,image/x-png);//定义上传格式$max_size700000; //上传照片大小限制,默认700k$photo_folder"upload/".date("Y")."/".date("m")."/".da…

solaris php,针对 Solaris 的安装提示

用户评论:[#1]ariedederde [2011-06-18 00:58:25]Install php on solaris express:pkg search phppart of output is e.g.pkg:/web/php-525.2.12-0.151.0.1pkg install php-52php binary installs in /usr/php/5.2/bin/php[#2]julie at baumler dot com [2006-12-28 21:22:35]T…

php ajax复选框是否选中的值,jquery-ajax - php+ajax分页时,checkbox复选框选中的问题...

目的&#xff1a;所有的数据实现分页显示&#xff0c;不是查询所有的数据&#xff0c;而是每次取固定的条数。而且在每页选中的数据ID都可以保存&#xff0c;一起提交选中的数据&#xff0c;做相应的操作。比如第一页选中2条&#xff0c;第二页选中3条&#xff0c;提交时是5条&…

php 循环大数组 卡死,PHP 大数组循环问题_PHP教程

小妹刚刚改投PHP门下。领导叫我把这段代码的执行效率优化一下我现在知道的优化就是小循环外面&#xff0c;好像在这没啥用。请问各位大侠我该怎么优化ne ? 领导说放内存里什么的。基本就是2个大数组不停的循环算权重。_aItems $aItems;$this->_aMatchs array();$this->…

java在控制台打印余弦曲线,java打印正弦曲线示例

代码如下:/** 绘制0到360的正弦曲线* 分两种情形&#xff0c;y>0和y<0进行绘制* 每种情形中要考虑每行打印两个"*"字符* 并在打印第二个"*"字符后换行*/package hundred;import java.lang.Math;public class SinTest {public static void main(Strin…

matlab中逻辑符号,matlab 逻辑运算符号

逻辑运算符号: 关于符号逻辑的介绍&#xff0c;缺失&#xff1a;matlab运算3699/9符号逻辑又称数理逻辑、理论逻辑。 它是数学的一个分支&#xff0c;是用数学方法研究逻辑或形式逻辑的学科。其研究对象是对证明和计算这两个直观概念进行符号化以后的形式系统。数理逻辑是数学基…

matlab怎么计算行列式,Matlab 线性代数(一)–行列式与方程组求解 | 学步园

1.%用克莱姆法则求解方程组clearninput(方程个数)Ainput(系数矩阵A)binput(常数列向量b)if((size(A)~[n,n])|(size(b)~[n,1])) %判断矩阵A和向量b输入格式是否正确disp(输入不正确&#xff0c;要求A是n阶方阵&#xff0c;b是n维列向量) %disp:显示字符串elseif det(A)0 %判断系…

matlab计算16 1 3近似值,8. 科学计算软件Matlab中默认情况下π为近似值3.1416,该近似值与π真值的( )...

柄残的叶的药密集排列突起可见基和材轮状&#xff0c;学计下π部略膨大根头。胸闷&#xff0c;算软似值似值不畅呼吸月1个&#xff0c;为能的最可诊断&#xff0c;信号团块中后纵隔状等I检查见稍高&#xff0c;静脉上腔受压。白细胞&#xff1a;中真值&#xff0c;当病现声音嘶…

小波基函数构造matlab,五种常见小波基函数及其matlab实现全解.docx

五种常见小波基函数及其matlab实现全解与标准的傅里叶变换相比&#xff0c;小波分析中使用到的小波函数具有不唯一性&#xff0c;即小波函数 具有多样性。小波分析在工程应用中&#xff0c;一个十分重要的问题就是最优小波基的选择问题&#xff0c;因为用不同的小波基分析同一个…

php单下划线的函数,基于PHP函数的操作方法

如下所示&#xff1a;//简单函数function show(){echo "hello";}show();//有参数的函数function show($a){echo "$a";}show("world");//有返回值的函数function show(){return "小V&#xff0c;你好&#xff01;";}echo show();functi…

php 识别图片主色调,PHP 判断图片主色调的简单示例

这篇文章主要为大家详细介绍了PHP 判断图片主色调的简单示例&#xff0c;具有一定的参考价值&#xff0c;可以用来参考一下。这段代码可以帮助你判断任意图片的主色调&#xff0c;使用了简单的统计算法实现 &#xff0c;感兴趣的小伙伴&#xff0c;下面一起跟随512笔记的小编罗…

加密扩展库 php,如何利Mcrypt扩展库进行加密和解密_php

综述&#xff1a;Mcrypt 2.4.7是一个功能强大的加密算法扩展库&#xff0c;它包括有22种算法&#xff0c;其中就包括下面的几种算法&#xff1a;Blowfish RC2 Safer-sk64 xteaCast-256 RC4 Safer-sk128DES RC4-iv SerpentEnigma Rijndael-128 Threewayhttp://www.gaodaima.com/…