질문
Spark 교육을받은 ALS 모델에서 신규 사용자의 등급을 어떻게 예측합니까? (신규 = 훈련 시간 동안 보이지 않음)
문제
공식 Spark ALS 튜토리얼을 따르고 있습니다.
http://ampcamp.berkeley.edu/big-data-mini-course/movie-recommendation-with-mllib.html
괜찮은 MSE로 좋은 추천자를 만들 수는 있지만 모델에 새 데이터를 입력하는 방법에 어려움을 겪고 있습니다. 튜토리얼은 교육 전에 첫 번째 사용자의 등급을 변경하지만 이것은 실제로 해킹입니다. 그들은 다음과 같은 힌트를줍니다.
9.2. 매트릭스 요소 보강 :
이 튜토리얼에서는 평가를 훈련 세트에 추가합니다. 권장 사항을 얻는 더 좋은 방법은 먼저 행렬 분해 모델을 학습 한 다음 등급을 사용하여 모델을 보강하는 것입니다. 이것이 흥미 롭다면 MatrixFactorizationModel의 구현을 살펴보고 새로운 사용자와 새로운 영화를 위해 모델을 업데이트하는 방법을 볼 수 있습니다.
구현은 전혀 도움이되지 않습니다. 이상적으로는 다음과 같은 것을 찾고 있습니다.
predictions = model.predictAllNew(newinput)
그러나 그러한 방법은 존재하지 않습니다. 원래 RDD로 가서 수정할 수는 있지만 모델을 재교육해야하므로 이상적인 솔루션이 아닙니다. 더 우아한 방법이 있어야합니까?
내가 지금있는 곳 :
새 벡터의 잠재 표현을 찾아야한다고 생각합니다. 원본 논문 에 따르면 다음과 같이 계산할 수 있습니다.
그러나 종이의 값을 사용하여 계산할 때 모델의 값과 일치하지 않습니다. 알파와 정규화 매개 변수를 수정했지만 MLLIB 함침에는 다른 구현 이 있다고 생각합니다 . 여기에 정의되어 있지만 (1304 행 참조) Scala에서 능숙하지는 않습니다.
내 현재 시도 :
V = model.productFeatures().map(lambda x: (x[1])).collect() #product latent matrix Y
Cui = alpha * np.abs(newinput)
Cui = (1. + Cui) / (Cui)
Cui[np.where(newinput == 0)] = 0
Cui = np.diag(Cui)
lambdaI = len(np.where(newinput!=0)) * regularization_parameter * np.eye(np.shape(V)[1]) #
term = np.dot(np.dot(Vt,Cui),V)+lambdaI
term = np.dot(np.linalg.inv(term),Vt)
term = np.dot(term,Cui)
term = np.dot(term,newinput)
latentinput = term
그러나 이것은 일치하지 않습니다.