Que se passe-t-il lorsque vous appliquez SVD à un problème de filtrage collaboratif? Quelle est la différence entre les deux?


21

Dans le filtrage collaboratif, nous avons des valeurs qui ne sont pas remplies. Supposons qu'un utilisateur n'a pas regardé un film, alors nous devons y mettre un «na».

Si je vais prendre un SVD de cette matrice, je dois y mettre un certain nombre - disons 0. Maintenant, si je factorise la matrice, j'ai une méthode pour trouver des utilisateurs similaires (en trouvant quels utilisateurs sont plus proches les uns des autres dans l'espace dimensionnel réduit). Mais la préférence prédite elle-même - pour un utilisateur à un élément sera nulle. (parce que c'est ce que nous avons entré dans les colonnes inconnues).

Je suis donc coincé avec le problème du filtrage collaboratif vs SVD. Ils semblent être presque les mêmes, mais pas tout à fait.

Quelle est la différence entre eux et que se passe-t-il lorsque j'applique un SVD à un problème de filtrage collaboratif? Je l'ai fait, et les résultats semblent acceptables en termes de recherche d'utilisateurs à proximité, ce qui est génial, mais comment?

Réponses:


25

Ok, quand vous dites SVD, vous parlez probablement de SVD tronqué (où vous ne gardez que les plus grandes valeurs singulières). Il existe deux façons différentes de regarder la SVD tronquée d'une matrice. L'une est la définition standard:k

D'abord, vous faites le SVD: , où et sont des matrices de rotation, et a les valeurs singulières le long de la diagonale. Ensuite, vous choisissez les premières valeurs singulières, mettez à zéro les autres et piratez les lignes et colonnes non pertinentes pour faire une approximation de rang par rapport à l'original:Xn×m=Un×nΣn×mVTm×mUVΣkkXX~=U~n×kΣ~k×kV~Tk×m

C'est très bien et dandy (et facile à implémenter dans R ou matlab), mais cela n'a pas de sens lorsque l'on parle de matrices avec des valeurs manquantes. Cependant, il y a une propriété intéressante du SVD tronqué - C'est la meilleure approximation de rang à l'original! C'est:kk

X~=argminB:rank(B)=ki,j(XijBij)2

Cette propriété semble facile à généraliser au cas de valeur manquante. Fondamentalement, vous recherchez une matrice -rank qui minimise l'erreur quadratique moyenne par élément à travers les entrées connues de la matrice d'origine. Autrement dit, lorsque vous entraînez le système, vous ignorez toutes les valeurs manquantes. (Pour obtenir des conseils sur la façon dont vous pourriez réellement aller de trouver un approximation -rank, ici sont quelques endroits à regarder).kkk

Ensuite, une fois que vous avez trouvé une approximation -rank "proche" de l'original, vous l'utilisez pour remplir les valeurs manquantes. Autrement dit, si était manquant, vous remplissez . Tada! Vous avez maintenant terminé.X i j ˜ X i jkXijX~ij


3

Il semble qu'il existe de nombreuses approches sur la façon de traiter les valeurs manquantes. Le document suivant , révisé à la section 1.3, peut être un bon point de départ.


0

J'ai besoin de plus de réputation pour commenter la réponse de Stumpy Joe Pete, donc je poste ceci comme réponse.

Merci pour la réponse, bien que je pense qu'elle ait besoin d'un peu de clarification. En particulier, je veux dire cette phrase:

Fondamentalement, vous recherchez une matrice de rang k qui minimise l'erreur quadratique moyenne par élément à travers les entrées connues de la matrice d'origine.

Premièrement - le rang le plus élevé ne minimiserait-il pas toujours cela ou ne reconstruirait-il pas réellement la matrice X d'origine? Deuxièmement - Pourquoi ne prendriez-vous que les entrées connues . Intuitivement, cela a du sens, mais la procédure correspond également aux emplacements vides qui ont été remplacés par des nombres raisonnables.

Mon approche serait de réaliser quelque chose comme une validation croisée:

  1. Remplissez les espaces vides avec des 0 ou des moyens ou un autre nombre raisonnable.
  2. Remplacez l'un des n éléments connus par 0 ou un nombre raisonnable
  3. Effectuer la reconstruction SVD du rang k
  4. Vérifiez la valeur de l' élément reconstruit connu .
  5. répéter pour tous les éléments connus possibles et calculer MSE
  6. répéter pour tous les k possibles et choisir celui avec le MSE le plus bas.

1. Vous voulez choisir un k faible pour éviter un sur-ajustement (bien inférieur à toutes les dimensions de X). C'est essentiellement pour la même raison que la régression linéaire est un meilleur choix qu'une quintique pour ajuster un ensemble de données de 6 points. 2. Vous ne savez pas quelles sont les entrées inconnues, vous ne pouvez donc pas mesurer "le MSE par élément" à travers elles. Ma procédure remplit les valeurs manquantes avec des nombres qui ont été dérivés en minimisant l'erreur par rapport aux valeurs connues (et en contraignant que la matrice doit être de bas rang).
Stumpy Joe Pete
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.