質問
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を変更することもできますが、モデルを再トレーニングする必要があるため、それも理想的なソリューションではありません。きっともっとエレガントな方法があるに違いない?
私が今いるところ:
新しいベクトルの潜在的な表現を見つける必要があると思います。元の論文によると、次のように計算できます。
私の現在の試み:
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
しかし、これは一致しません。