离线轻量级大数据平台Spark之MLib机器学习协同过滤ALS实例
1、協同過濾
協同過濾(Collaborative Filtering,簡稱CF,WIKI上的定義是:簡單來說是利用某個興趣相投、擁有共同經驗之群體的喜好來推薦感興趣的資訊給使用者,個人透過合作的機制給予資訊相當程度的回應(如評分)并記錄下來以達到過濾的目的,進而幫助別人篩選資訊,回應不一定局限于特別感興趣的,特別不感興趣資訊的紀錄也相當重要。
協同過濾常被應用于推薦系統。這些技術旨在補充用戶—商品關聯矩陣中所缺失的部分。
MLlib 當前支持基于模型的協同過濾,其中用戶和商品通過一小組隱性因子進行表達,并且這些因子也用于預測缺失的元素。MLLib 使用交替最小二乘法(ALS) 來學習這些隱性因子。
用戶對物品或者信息的偏好,根據應用本身的不同,可能包括用戶對物品的評分、用戶查看物品的記錄、用戶的購買記錄等。其實這些用戶的偏好信息可以分為兩類:
l ?顯式的用戶反饋:這類是用戶在網站上自然瀏覽或者使用網站以外,顯式地提供反饋信息,例如用戶對物品的評分或者對物品的評論。
l ?隱式的用戶反饋:這類是用戶在使用網站是產生的數據,隱式地反映了用戶對物品的喜好,例如用戶購買了某物品,用戶查看了某物品的信息,等等。
顯式的用戶反饋能準確地反映用戶對物品的真實喜好,但需要用戶付出額外的代價;而隱式的用戶行為,通過一些分析和處理,也能反映用戶的喜好,只是數據不是很精確,有些行為的分析存在較大的噪音。但只要選擇正確的行為特征,隱式的用戶反饋也能得到很好的效果,只是行為特征的選擇可能在不同的應用中有很大的不同,例如在電子商務的網站上,購買行為其實就是一個能很好表現用戶喜好的隱式反饋。
推薦引擎根據不同的推薦機制可能用到數據源中的一部分,然后根據這些數據,分析出一定的規則或者直接對用戶對其他物品的喜好進行預測計算。這樣推薦引擎可以在用戶進入時給他推薦他可能感興趣的物品。
2、Java開發ALS實例
實例中使用電影評分數據,字段信息包括用戶編號:電影編號:評分:評分時間戳。
見spark-2.0.1-bin-hadoop2.7/data/mllib/als/ sample_movielens_ratings.txt
Java開發上,引入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包并提交執行。
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成做訓練樣本,2成做測試樣本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();} } /** 執行結果:* Root-mean-square error = 1.7215462865151776*/對Spark平臺MLib庫通過三個實例初步了解和掌握,主要還是對算法本身有掌握,才能明確實際場景需要用到的算法。
總結
以上是生活随笔為你收集整理的离线轻量级大数据平台Spark之MLib机器学习协同过滤ALS实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 离线轻量级大数据平台Spark之MLib
- 下一篇: 算法导论之最大流