离线轻量级大数据平台Spark之MLib机器学习协同过滤ALS实例
1、協(xié)同過濾
協(xié)同過濾(Collaborative Filtering,簡(jiǎn)稱CF,WIKI上的定義是:簡(jiǎn)單來說是利用某個(gè)興趣相投、擁有共同經(jīng)驗(yàn)之群體的喜好來推薦感興趣的資訊給使用者,個(gè)人透過合作的機(jī)制給予資訊相當(dāng)程度的回應(yīng)(如評(píng)分)并記錄下來以達(dá)到過濾的目的,進(jìn)而幫助別人篩選資訊,回應(yīng)不一定局限于特別感興趣的,特別不感興趣資訊的紀(jì)錄也相當(dāng)重要。
協(xié)同過濾常被應(yīng)用于推薦系統(tǒng)。這些技術(shù)旨在補(bǔ)充用戶—商品關(guān)聯(lián)矩陣中所缺失的部分。
MLlib 當(dāng)前支持基于模型的協(xié)同過濾,其中用戶和商品通過一小組隱性因子進(jìn)行表達(dá),并且這些因子也用于預(yù)測(cè)缺失的元素。MLLib 使用交替最小二乘法(ALS) 來學(xué)習(xí)這些隱性因子。
用戶對(duì)物品或者信息的偏好,根據(jù)應(yīng)用本身的不同,可能包括用戶對(duì)物品的評(píng)分、用戶查看物品的記錄、用戶的購(gòu)買記錄等。其實(shí)這些用戶的偏好信息可以分為兩類:
l ?顯式的用戶反饋:這類是用戶在網(wǎng)站上自然瀏覽或者使用網(wǎng)站以外,顯式地提供反饋信息,例如用戶對(duì)物品的評(píng)分或者對(duì)物品的評(píng)論。
l ?隱式的用戶反饋:這類是用戶在使用網(wǎng)站是產(chǎn)生的數(shù)據(jù),隱式地反映了用戶對(duì)物品的喜好,例如用戶購(gòu)買了某物品,用戶查看了某物品的信息,等等。
顯式的用戶反饋能準(zhǔn)確地反映用戶對(duì)物品的真實(shí)喜好,但需要用戶付出額外的代價(jià);而隱式的用戶行為,通過一些分析和處理,也能反映用戶的喜好,只是數(shù)據(jù)不是很精確,有些行為的分析存在較大的噪音。但只要選擇正確的行為特征,隱式的用戶反饋也能得到很好的效果,只是行為特征的選擇可能在不同的應(yīng)用中有很大的不同,例如在電子商務(wù)的網(wǎng)站上,購(gòu)買行為其實(shí)就是一個(gè)能很好表現(xiàn)用戶喜好的隱式反饋。
推薦引擎根據(jù)不同的推薦機(jī)制可能用到數(shù)據(jù)源中的一部分,然后根據(jù)這些數(shù)據(jù),分析出一定的規(guī)則或者直接對(duì)用戶對(duì)其他物品的喜好進(jìn)行預(yù)測(cè)計(jì)算。這樣推薦引擎可以在用戶進(jìn)入時(shí)給他推薦他可能感興趣的物品。
2、Java開發(fā)ALS實(shí)例
實(shí)例中使用電影評(píng)分?jǐn)?shù)據(jù),字段信息包括用戶編號(hào):電影編號(hào):評(píng)分:評(píng)分時(shí)間戳。
見spark-2.0.1-bin-hadoop2.7/data/mllib/als/ sample_movielens_ratings.txt
Java開發(fā)上,引入spark-mllib_2.11-2.0.1.jar、spark-mllib-local_2.11-2.0.1.jar、spark-catalyst_2.11-2.0.1.jar。
參考spark的example案例的代碼,輸出skals.jar包并提交執(zhí)行。
bin/spark-submit --class sk.mlib.ALSDemo --master local /tmp/skals.jar
代碼如下:
package sk.mlib;import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession;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 class ALSDemo {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);}}public static void main(String[] args) {SparkSession spark = SparkSession.builder().appName("ALSDemo").getOrCreate();JavaRDD<Rating> ratingsRDD = spark.read().textFile("/tmp/sample_movielens_ratings.txt").javaRDD().map(new Function<String, Rating>() {public Rating call(String str) {return Rating.parseRating(str);}});Dataset<Row> ratings = spark.createDataFrame(ratingsRDD, Rating.class);Dataset<Row>[] splits = ratings.randomSplit(new double[]{0.8, 0.2});//8成做訓(xùn)練樣本,2成做測(cè)試樣本Dataset<Row> training = splits[0];Dataset<Row> 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<Row> 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);spark.stop();} } /** 執(zhí)行結(jié)果:* Root-mean-square error = 1.7215462865151776*/對(duì)Spark平臺(tái)MLib庫(kù)通過三個(gè)實(shí)例初步了解和掌握,主要還是對(duì)算法本身有掌握,才能明確實(shí)際場(chǎng)景需要用到的算法。
總結(jié)
以上是生活随笔為你收集整理的离线轻量级大数据平台Spark之MLib机器学习协同过滤ALS实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离线轻量级大数据平台Spark之MLib
- 下一篇: 算法导论之最大流