데이터 엔지니어 이것저것

ALS 알고리즘 본문

개발

ALS 알고리즘

pastime 2023. 2. 16. 23:24
728x90

ALS 알고리즘이란?

  • ALS(alternating least squares)은 행렬 분해 알고리즘
  • 사용자들이 평가한 평점 데이터를 이용하여 유사한 취향의 아이템을 추천하는 추천 시스템에 사용.
  • 모든 쌍의 유사성을 계산하는 것은 지나치게 많은 비용이 발생.
    이를 두 개의 행으로 분해하여, 병렬 방식으로 처리.
  • 대규모 데이터 셋에서도 높은 정확도
  • 평가하지 않은 아이템에 대한 예측 평점을 계산하고, 이를 실제 평점 사이의 오차 최소화하는 방식

 

사용자와 아이템간의 유사도는 벡타 간의 코사인 유사도를 사용하여 계산.

 

cosine_similarity(u, v) = dot(u, v) / (norm(u) * norm(v))

 

dot(u, v)는 u와 v의 내적값, norm(u)는 u의 노름(norm) 또는 길이(length)를 의미합니다. 이렇게 계산된 유사도를 사용하여 사용자와 아이템 간의 상호작용(예: 평점)을 예측하는데 사용할 수 있습니다.

 

ALS 알고리즘에서는 사용자와 아이템 간의 유사도를 계산할 때, 유사도를 구하는 대상인 u와 v의 벡터값이 잠재요인 벡터이기 때문에, 이 벡터들의 실제 값을 알 수 없습니다. 따라서, ALS 알고리즘에서는 이러한 잠재요인 벡터들을 추정(estimation)하는 과정을 거쳐, 최종적으로 사용자와 아이템 간의 유사도를 계산합니다.

 

라는데 아직 무슨말인지 모르겠다


 

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 data
val 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 data
// Note we set cold start strategy to 'drop' to ensure we don't get NaN evaluation metrics
model.setColdStartStrategy("drop")
val 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")

// Generate top 10 movie recommendations for each user
val userRecs = model.recommendForAllUsers(10)
// Generate top 10 user recommendations for each movie
val movieRecs = model.recommendForAllItems(10)

출처 : https://spark.apache.org/docs/2.2.0/ml-collaborative-filtering.html

728x90

'개발' 카테고리의 다른 글

OLTP vs OLAP  (0) 2023.02.27
pre-commit  (1) 2023.02.20
함수형 프로그래밍  (0) 2022.10.23
쿠키, 세션, 토큰의 차이점  (0) 2021.09.27
ORM(Object Relational Mapping)  (0) 2021.09.10