非負行列分解を使用してレコメンデーション システムを構築しようとしています。モデルとしてscikit-learn NMFを使用して、データを適合させた結果、特定の損失 (つまり、再構成エラー) が発生しました。次に、 inverse_transformメソッドを使用して、新しいデータのレコメンデーションを生成します。
TensorFlow で構築した別のモデルを使用して同じことを行います。トレーニング後の再構築エラーは、以前に sklearn のアプローチを使用して得られたエラーに近いものです。ただし、潜在的な要因は互いに類似しておらず、最終的な推奨事項もありません。
私が認識している 2 つのアプローチの 1 つの違いは次のとおりです。sklearn では Coordinate Descent ソルバーを使用していますが、TensorFlow では Gradient Descent に基づく AdamOptimizer を使用しています。他のすべては同じようです:
- 使用される損失関数はフロベニウス ノルムです
- どちらの場合も正規化なし
- 同じ数の潜在次元を使用して同じデータでテスト
私が使用している関連コード:
1. scikit-learn アプローチ:
model = NMF(alpha=0.0, init='random', l1_ratio=0.0, max_iter=200,
n_components=2, random_state=0, shuffle=False, solver='cd', tol=0.0001,
verbose=0)
model.fit(data)
result = model.inverse_transform(model.transform(data))
2. TensorFlow アプローチ:
w = tf.get_variable(initializer=tf.abs(tf.random_normal((data.shape[0],
2))), constraint=lambda p: tf.maximum(0., p))
h = tf.get_variable(initializer=tf.abs(tf.random_normal((2,
data.shape[1]))), constraint=lambda p: tf.maximum(0., p))
loss = tf.sqrt(tf.reduce_sum(tf.squared_difference(x, tf.matmul(w, h))))
私の質問は、これら 2 つのアプローチによって生成された推奨事項が一致しない場合、どちらが正しいかをどのように判断できるかということです。私のユースケースに基づくと、sklearn の NMF は良い結果をもたらしていますが、TensorFlow の実装はそうではありません。カスタム実装を使用して同じことを達成するにはどうすればよいですか?