2013-02-20 2 views
0

J'essaie de mettre en place un système de classification comparative et j'ai des difficultés à trouver la meilleure façon de gérer cela, surtout du point de vue de la base de données.Meilleure façon de gérer un système de classification

Utilisons la nourriture pour un exemple.

L'utilisateur reçoit des images de deux aliments différents et choisit celui qu'il préfère. Il est ensuite montré deux autres aliments (un pourrait être le même ou ils pourraient tous deux être différents) et l'utilisateur sélectionne à nouveau. Il continue à le faire encore et encore et, ce faisant, l'application indiquera à l'utilisateur quelle est sa nourriture préférée, en se fondant uniquement sur lui en disant lesquels il préfère plus que d'autres et en comparant toutes ces comparaisons et en affichant les résultats. J'ai pensé à simplement garder une trace du total des goûts/dégoûts de chaque élément, et j'ai également envisagé de garder une trace de chaque choix dans une base de données massive. Je suis certain que j'ai négligé un moyen efficace pour ce genre de système.

Fondamentalement, je cherche non seulement un algorithme efficace mais aussi le meilleur moyen de stocker cela dans une base de données.

Merci pour l'aide.

+1

Mais que se passe-t-il lorsque vous montrez à un développeur une image de pizza et une de beignets? Comment est-il censé faire un choix? –

+0

Et quelle est exactement la question? –

+0

Je considère de montrer aux gens des images d'animaux pour déterminer quel travail il a actuellement, combien d'enfants il aura et s'il aime les Beatles. Comment dois-je faire cela? (Désolé pour le sarcasme, je ne pouvais pas résister.) –

Répondre

2

Je voudrais juste garder une base de données de triplets (user_id, preferred_id, dispreferred_id) correspondant à chaque choix.

EDIT: Avons un peu de temps pour jouer avec ça. Ce qui suit serait lent pour des millions d'évaluations, et engloutir la mémoire, aussi, mais pourrait vous donner des idées. Si vous y parvenez, vous devriez probablement exécuter de manière asynchrone à partir de crontab, plutôt à la demande.

require 'set'                                                      

choices = [ 
    [1, 4], 
    [1, 5], 
    [2, 3], 
    [2, 4], 
    [3, 1], 
    [4, 2], 
    [4, 3], 
    [5, 1], 
    [6, 7], 
    [8, 4], 
] 

dominates = Hash.new { |hash, key| hash[key] = Set.new } 
choices.each do |p, d| 
    dominates[p].add(d) 
end 

prev_dominates = nil 
while dominates != prev_dominates 
    prev_dominates = Hash.new 
    dominates.each { |big, smalls| prev_dominates[big] = smalls.clone } 
    prev_dominates.each do |big, smalls| 
    smalls.each do |small| 
     if prev_dominates.include?(small) 
     prev_dominates[small].each do |smaller| 
      if smaller != big and !prev_dominates[smaller].include?(big) 
      dominates[big] << smaller 
      end 
     end 
     end 
    end 
    end 
end 

top = dominates.max_by { |big, smalls| smalls.size }[0] 

puts dominates.inspect 
puts "BEST: #{top}" 

Le nœud supérieur est celui qui finit par dominer le plus d'autres nœuds. Cependant, étant donné que le graphique peut être cyclique, nous coupons le cycle si un autre nœud aurait terminé le cycle plus tôt.

+0

@Mitch - il y aurait des catégories pour les types de nourriture. Comme plat principal, désert, etc. –

+0

@JonathanPlumb: Je ne suis pas Mitch: p – Amadan

+0

Que se passe-t-il si ce n'est pas de la nourriture et qu'il y a des célébrités, et il y a des millions ou même des milliards de comparaisons entre plusieurs utilisateurs? ? –

Questions connexes