Notice
Recent Posts
Recent Comments
Link
250x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
Tags
- CDC
- UI for kafka
- kafka
- spring boot
- k9s
- docker
- 크롤링
- Materializations
- 쿠버네티스
- 모바일
- 윈도우
- 카프카
- KubernetesPodOperator
- 도커
- 파이썬
- numpartitions
- freshness
- polars
- Java
- ksql
- spark
- mysql
- query history
- dbt_project
- Python
- proerty
- DBT
- 동적 차트
- bar cahrt
- airflow
Archives
- Today
- Total
데이터 엔지니어 이것저것
ALS 알고리즘 본문
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 |