2010-03-15 14 views
1

Ceci est pour une nouvelle fonctionnalité sur http://cssfingerprint.com (voir/à propos de l'information générale). La fonctionnalité recherche les sites que vous avez visités dans une base de données de données démographiques du site et tente de deviner quelles sont vos statistiques démographiques.mysql/stats: Pondérer une moyenne pour accentuer les différences par rapport à la moyenne

Toutes mes données démographiques sont au format de probabilité 0..1, pas des rapports ou des nombres absolus ou similaires. Essentiellement, vous avez un grand nombre de points de données qui vous tendent chacun vers leurs propres données démographiques. Cependant, il suffit de prendre la moyenne, car cela signifie qu'en ajoutant beaucoup de données génériques, le nombre diminue. Par exemple, supposons que vous ayez visité les sites S0..S50. Par exemple, supposons que vous ayez visité les sites S0..S50. Tous sauf S0 sont 48% de femmes; S0 est 100% mâle. Si je devine votre sexe, je veux avoir une valeur proche de 100%, pas seulement les 49% qu'une moyenne normale donnerait. En outre, considérons que la plupart des données démographiques (c'est-à-dire tout ce qui n'est pas le sexe) n'ont pas la moyenne de 50%. Par exemple, la probabilité moyenne d'avoir des enfants de 0 à 17 ans est d'environ 37%. Plus la démographie d'un site est différente de cette moyenne (par exemple, c'est peut-être un site pour les parents, ou pour les personnes sans enfant), plus cela devrait compter dans mon estimation de votre statut.

Quelle est la meilleure façon de le calculer?

Pour un crédit supplémentaire: quelle est la meilleure façon de calculer cela, qui est également bon marché & facile à faire dans mysql? ETA: Je pense que quelque chose qui correspond à ce que je veux est Φ(AVG(z-score^2, sign preserved)). Mais je ne suis pas sûr que ce soit une bonne fonction de pondération.

(Φ est la fonction de distribution normale - http://en.wikipedia.org/wiki/Standard_normal_distribution#Definition)

Répondre

2

Un bon cadre pour ce genre de calculs est l'inférence bayésienne. Vous avez une distribution préalable de la démographie - par exemple 50% d'hommes, 37% sans enfants, etc. De préférence, vous l'auriez multivariée: 10% d'hommes sans enfant 0-17 Caucasiens ..., mais vous pouvez commencer par un-à-un -temps.
Après cela, chaque site apporte de nouvelles informations sur la probabilité d'une catégorie démographique, et vous obtenez l'estimation postérieure qui informe votre estimation finale.En utilisant des hypothèses d'indépendance de la formule de mise à jour est la suivante:

cotes postérieures = (odds antérieur) * (place du rapport de vraisemblance),

où cotes = p/(1-P) et le rapport de vraisemblance est un multiplicateur modifier les chances après avoir visité le site. Il y a plusieurs formules pour cela, mais dans ce cas, j'utiliserais simplement la formule ci-dessus pour la population générale et la population du site pour la calculer. Par exemple, pour un site qui compte 35% de visiteurs dans le groupe des moins de 20 ans, ce qui représente 20% de la population, le rapport de vraisemblance du site serait LR = (0,35/0,65)/(0,2 /0.8) = 2.154 donc visiter ce site augmenterait les chances d'être «de moins de 20» 2.154 fois.

Un site qui est 100% mâle aurait un LR infini, mais vous voudrez probablement le limiter quelque peu, disons, en utilisant seulement 99,9% de mâles. Un site qui est à 50% masculin aurait un LR de 1, donc il ne fournirait aucune information sur la répartition par sexe. Supposons que vous commenciez à ne rien savoir d'une personne - ses chances d'être «de moins de 20 ans» sont de 0,2/0,8 = 0,25. Supposons que le premier site ait un RL = 2,154 pour ce résultat - maintenant, la probabilité d'être «de moins de 20 ans» devient 0,25 * (2,154) = 0,538 (correspondant à la probabilité de 35%). Si le deuxième site a le même LR, les cotes postérieures deviennent 1,16, ce qui est déjà 54%, etc. (probabilité = cote/(1 + cote)). À la fin, vous choisissez la catégorie avec la probabilité la plus élevée postérieure.

Il y a beaucoup de mises en garde avec ces calculs - par exemple, l'hypothèse d'indépendance est probablement erronée, mais cela peut constituer un bon début.

+0

Donc, 'prob (utilisateur est stat X) = (population problème antérieur X) * produit (problème de site X, sur tous les sites utilisateurs touchés)' (en supposant que tous les sites ont la même pondération)? Hmm. Je pense que pour le faire efficacement, je vais avoir besoin d'une transformation qui me permette d'utiliser 'SUM()' car mysql n'a pas de 'PROD()' analogue. :/ – Sai

+0

er, s/prob/prob * (1-prob)/pour les main droite – Sai

+1

@Sai: 'PROD (x) = EXP (SUM (LN (x)))', bien que la formule actuelle pour cette cas est beaucoup plus complexe et nécessite une récursivité. – Quassnoi

1

rapide « n » sale: obtenir un score mâle en multipliant les probabilités de sexe masculin, et une note féminine en multipliant les probabilités femmes. Prédire le plus grand. (En fait, ne multipliez pas, additionnez plutôt le log de chaque probabilité.) Je pense que c'est un estimateur du maximum de vraisemblance si vous faites les bonnes hypothèses (très irréalistes).

0

La formule standard pour le calcul de la moyenne pondérée est donnée dans this question et this question

Je pense que vous pouvez regarder dans ces approches et déterminer comment calculer votre poids. Dans votre exemple de genre ci-dessus, vous pourriez adopter quelque chose dans le sens d'un ensemble de poids {1, ..., 0, ..., 1} qui est une diminution linéaire de 0 à 1 pour des valeurs de genre de 0. % mâle à 50% puis une augmentation correspondante jusqu'à 100%. Si vous voulez que l'effet soit faussé en faveur des valeurs extrêmes, vous pouvez facilement créer une fonction exponentielle ou trigonométrique qui fournit un ensemble de poids différent. Si vous le souhaitez, une courbe de distribution normale fera également l'affaire.

+0

Je sais comment calculer des moyens pondérés. ;-) Le problème est que je ne suis pas sûr de savoir quelle est la fonction de pondération appropriée, qui ne présume pas que la valeur en question est distribuée uniformément (comme le genre l'est à peu près). Une bonne réponse sera probablement basée sur les z-scores. – Sai

2

La formule bayésienne naïve pour vous le cas ressemble à ceci:

SELECT probability 
FROM (
     SELECT @apriori := CAST(@apriori * ratio/(@apriori * ratio + (1 - @apriori) * (1 - ratio)) AS DECIMAL(30, 30)) AS probability, 
       @step := @step + 1 AS step 
     FROM (
       SELECT @apriori := 0.5, 
         @step := 0 
       ) vars, 
       (
       SELECT 0.99 AS ratio 
       UNION ALL 
       SELECT 0.48 
       UNION ALL 
       SELECT 0.48 
       UNION ALL 
       SELECT 0.48 
       UNION ALL 
       SELECT 0.48 
       UNION ALL 
       SELECT 0.48 
       UNION ALL 
       SELECT 0.48 
       UNION ALL 
       SELECT 0.48 
       ) q 
     ) q2 
ORDER BY 
     step DESC 
LIMIT 1