Partage
  • Partager sur Facebook
  • Partager sur Twitter

Coefficient de corrélation

Algo de recommandation

    24 mai 2011 à 19:33:37

    Bonjour à tous !

    Je suis en train d'implémenter un algorithme de recommandation, et pour cela j'ai besoin de calculer des coefficients de corrélation entre des variables.

    La formule du coeff de corrélation est ici : http://fr.wikipedia.org/wiki/Corr%C3%A9lation_(statistiques)


    Cependant, si l'écart type d'une des deux variables est nul, on arrive à une division par 0 ... Donc dans ce cas là, comment fait on pour estimer la corrélation entre les deux variables ?

    Merci d'avance !
    • Partager sur Facebook
    • Partager sur Twitter
      24 mai 2011 à 20:09:32

      Si l'écart type d'une V.A. est nul, ça veut dire que ta V.A. est constante. Tes deux seront donc très fortement corrélés, et tu peux prendre r=1 ou r=-1.

      Pour comprendre, va voir la partie "Interprétation Géométrique" dans la page wiki que t'as donné. En reprenant les même notations, si tu as une série de valeurs à écart type nul (disons X), cela revient à dire que X est le vecteur :<math>\((\bar{x},\bar{x},\bar{x},...,\bar{x})\)</math>.

      Et le vecteur centré est le vecteur nul, qui est colinéaire à tous les vecteurs.

      PS : Safou va bien ?
      • Partager sur Facebook
      • Partager sur Twitter
        24 mai 2011 à 20:23:23

        Merci pour la réponse, mais ça me semble très bizarre mon algo alors.

        En gros, je me base sur ce post :

        Algo de recommandation

        Et aussi sur un livre.

        Mais ça me parrait bizarre parce que mon algo est fait pour trouver les gens qui ont des goûts proches de toi. Et en gros la technique est d'attribuer une notre -1, 0 ou 1 aux films aimés par les gens (-1 on aime pas, 0 on a pas vu et 1 on aime).
        Et si les coeff de corrélation sont proches de 1, cela veut dire qu'on a des chances d'avoir les mêmes goûts que la personne.
        Et donc un mec qui mettrait toujours la même note à un film aurait à tous les coups des goûts proches de moi ? Ca me parait bizarre ... Je dois louper quelque chose ...

        PS : Oui elle va bien, même si je l'ai plus en prof :p (Comment tu la connais ?)
        • Partager sur Facebook
        • Partager sur Twitter
          24 mai 2011 à 20:55:25

          Calculer le coefficient de corrélation linéaire me semble étrange : c'est comme si tu cherchais à exprimer linéairement les notes de Jérôme en fonction des notes de Bob.

          Calculer la distance entre deux personnes me semble plus naturel (c'est suggéré aussi dans le post sur Hardware fofo) : considérons que tu as n films dans db, numérotés de 1 à n. Soit A et B deux personnes, qui ont visionné toutes les deux les films <math>\(J\subset \{1,...,n\}\)</math>, et qui pour chaque film j dans J ont attribué respectivement les notes <math>\(a_j \textrm{~et~} b_j\)</math>.

          La distance entre A et B est donnée par :
          <math>\(d(A,B) = \frac{1}{|J|}\sum_{j\in J} |a_j - b_j|\)</math>
          On peut aussi choisir :
          <math>\(d(A,B) = \frac{1}{|J|}\sqrt{\sum_{j\in J} (a_j - b_j)^2}\)</math>
          pour avoir la distance euclidienne.

          Cela te permettra classer les personnes "proches" de toi.

          PS : Arf, tu sais l'EMN ... ce fut une épopée formidable (ou pas)

          EDIT : rajouté 1/|J| pour être cohérent dans les formules, et il faudrait dire <math>\(d(A,B) = \infty\)</math> si <math>\(J=\emptyset\)</math>

          Remarque, ce n'est pas vraiment une "distance" au sens topologique, même si on considère qu'une personne est simplement déterminée par les films qu'elle a vus et les notes qu'elle a données :p

          RE-EDIT : Ne même pas vérifier l'axiome de séparation (à savoir d(A,B)=0 ssi A=B) me chagrine trop. Soit D le nombre de films vus (par A mais pas par B) ou (par B mais pas par A).
          (il s'agit du cardinal de la différence symétrique des ensembles de film vus par A et B).

          Je te propose la distance suivante :
          <math>\(d(A,B) = \frac{1}{|J|}\sum_{j\in J} |a_j - b_j| + cD\)</math>
          où c est un coefficient (>0) à déterminer suivant le poids qu'on veut donner au critère "A et B ont vu les mêmes films".
          Comme cela, on aura bien d(A,B)=0 ssi A=B . Par contre, on n'aura toujours pas l'inégalité triangulaire (damned!).
          • Partager sur Facebook
          • Partager sur Twitter
            24 mai 2011 à 21:40:02

            Oui effectivement, ça semble peut être plus pertinent !

            Mais du coup, il y a un changement, ici le score le plus bas indique l'utilisateur ayant les gouts les plus proches. Du coup, comment j'essaie d'adapter ça en un score de similitude ? (où le mec qui a le coeff de similitude le plus proche de 1 est le plus adapté à mes gouts) ?

            • Partager sur Facebook
            • Partager sur Twitter
              24 mai 2011 à 21:50:49

              Tu te démerdes pour trouver le maximum M de la distance entre 2 gus, et pour la similitude, tu prends (au hasard):

              <math>\(s=\frac{M-d(A,B)}{M}\)</math>

              Ou n'importe quelle fonction f décroissante tq f(M)=0 et f(0)=1 !


              (encore une fois, si d(A,B)=infini, s=0 )
              • Partager sur Facebook
              • Partager sur Twitter
                24 mai 2011 à 23:05:41

                Hum, en fait je crois que l'algo du mec est quand même assez étrange.

                Quand on créé la table de recommandation, si une personne a vu au moins un film en commun avec moi et qu'elle est également la seule à avoir vu le film A, et bien forcément, on aura ce film qui me sera toujours recommandé en premier...

                Edit : en gros ça marche que si y'a déjà une base de données utilisateur importante et qu'on ne tombe jamais dans le cas où un nouveau film n'a été vu que par une personne.
                • Partager sur Facebook
                • Partager sur Twitter
                  24 mai 2011 à 23:53:36

                  Citation : pandore75

                  Hum, en fait je crois que l'algo du mec est quand même assez étrange.

                  Quand on créé la table de recommandation, si une personne a vu au moins un film en commun avec moi et qu'elle est également la seule à avoir vu le film A, et bien forcément, on aura ce film qui me sera toujours recommandé en premier...

                  Edit : en gros ça marche que si y'a déjà une base de données utilisateur importante et qu'on ne tombe jamais dans le cas où un nouveau film n'a été vu que par une personne.



                  Euh ... en fait, même en prenant un grand nombre d'utilisateur, son calcul est foireux. Si je traduis bien en termes matheux ce qu'a dit Flaie sur Hardware fofo:
                  Tu as N personnes <math>\(A_1, ...,A_N\)</math> que l'on code par des vecteur de dimension n (le nombre de films de ta bd). La note de la personne A_3 au film 5 sera donné par : <math>\(A_{3,5}\)</math>.

                  Tu as aussi calculé les similarité avec toi : <math>\(S_1, ..., S_N\)</math>.

                  Le poids (note, score ...) p_i que tu auras pour le film i sera donné par :
                  <math>\(p_i = \frac{\sum_{j\in {E_i}} S_j A_{j,i}} {\sum_{j\in E_i} S_j}\)</math>

                  où <math>\(E_i \subset\{1,...,N\}\)</math> est l'ensemble des personnes ayant vu le film i.


                  Prenons le cas où 15 personnes qui toute une similiraté avec toi très faible (mettons 0.1 pour tout le monde pour simplifier), et qui ont toute surkiffé le film 42 et lui ont donc mis la note max, à savoir 10. On a alors :
                  <math>\(p_{42} =\frac{15\times 0.1 \times 10}{15 \times 0.1} = 10\)</math>.

                  Alors qu'à priori, on devrait avoir un <math>\(p_{42}\)</math> très faible ! Je pense qu'il vaudrai le coup d'essayer en divisant non pas par la somme des "similiratés" qui donne à priori des résultat pas cohérent avec tout simplement le nombre de personnes. La formule serait donc :
                  <math>\(p_i = \frac{\sum_{j\in {E_i}} S_j A_{j,i}} {|E_i|}\)</math>
                  • Partager sur Facebook
                  • Partager sur Twitter
                    25 mai 2011 à 17:21:46

                    Oui j'avoue que j'avais pas non plus pensé à ce cas là ...
                    C'est quand même dingue parce que cet algo est tiré d'un livre qui semble être assez recommandé par les gens ... J'ai peur d'avoir loupé un truc ...

                    Voilà une image qui est un exemple de déroulement de l'algo : Algo

                    En attendant de trouver autre chose, je vais faire la division par le nombre de personnes ayant vu le film.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      25 mai 2011 à 18:17:22

                      Ma formule ne marche pas non plus : en effet si 10 personnes ayant une similarité très faible avec moi donne une note de 1 au film et qu'une seule personne ayant une forte similarité avec moi donne une note de 9, le résultat sera de 5 ... alors qu'à priori, le film me plairait beaucoup !

                      Quid de virer purement et simplement les gens qui ne sont pas assez similaires avec toi (genre s<0.6) et faire une moyenne classique sur les notes ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 mai 2011 à 20:20:05

                        Ouais mais faut quand même prendre en compte l'avis de tout le monde.
                        Si 1000 personnes avec une similarité faible me disent qu'un film est nul, et qu'une avec une similarité forte l'aime bien, faut quand même se dire qu'il y a des chances que ce soit nul.

                        J'suis pas un gros fan de mettre un critère arbitraire comme l'exclusion de certaine donnée. C'est là tout le problème de trouver l'algo :(
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Coefficient de corrélation

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown