mysql / stats: взвешивание среднего значения, чтобы подчеркнуть разницу со средним - PullRequest
1 голос
/ 15 марта 2010

Это для новой функции на http://cssfingerprint.com (см. / О для общей информации).

Функция просматривает сайты, которые вы посетили, в базе данных по демографии сайтов и пытается угадать, на чем основана ваша демографическая статистика.

Все мои демографические данные представлены в формате вероятности 0..1, а не в соотношениях, абсолютных числах и т. П.

По сути, у вас есть большое количество точек данных, каждая из которых склоняет вас к своей демографии. Тем не менее, просто брать среднее значение плохо, потому что это означает, что при добавлении большого количества общих данных число уменьшается.

Например, предположим, что вы посетили сайты S0..S50. Все, кроме S0, составляют 48% женщин; S0 на 100% мужской. Если я угадываю ваш пол, я хочу, чтобы значение было близко к 100%, а не только к 49%, которые дало бы прямое среднее значение.

Кроме того, учтите, что большинство демографических данных (т.е. все, кроме пола) не имеют среднего в 50%. Например, средняя вероятность рождения детей в возрасте 0-17 лет составляет ~ 37%. Чем больше демография данного сайта отличается от этого среднего показателя (например, может быть, это сайт для родителей или людей, не имеющих детей), тем больше он должен учитываться в моем предположении о вашем статусе.

Какой лучший способ рассчитать это?

Для дополнительного кредита: каков лучший способ рассчитать это, что также дешево и легко сделать в MySQL?

ETA: Я думаю, что что-то приближает к тому, что я хочу, это Φ(AVG(z-score ^ 2, sign preserved)). Но я не уверен, что это хорошая весовая функция.

(Φ - стандартная функция нормального распределения - http://en.wikipedia.org/wiki/Standard_normal_distribution#Definition)

Ответы [ 4 ]

2 голосов
/ 15 марта 2010

Наивная байесовская формула для вашего случая выглядит так:

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
2 голосов
/ 15 марта 2010

Хорошей основой для такого рода расчетов является байесовский вывод. У вас есть предварительное распределение демографических данных - например, 50% мужчин, 37% бездетных и т. Д. Предпочтительно, вы будете иметь это многовариантно: 10% мужчин бездетных 0-17 кавказских ..., но вы можете начать с одного на одного -время.
После этого предварительного просмотра каждый сайт предоставляет новую информацию о вероятности демографической категории, и вы получаете последующую оценку, которая сообщает ваше окончательное предположение. Используя некоторые предположения о независимости, формула обновления выглядит следующим образом:

задние шансы = (предыдущие шансы) * (отношение правдоподобия сайта),

где odds = p / (1-p), а отношение правдоподобия является множителем, изменяющим шансы после посещения сайта. Существуют различные формулы для этого, но в этом случае я бы просто использовал вышеуказанную формулу для общего населения и населения сайта для его расчета.

Например, для сайта, который имеет 35% посетителей в возрастной группе "до 20 лет", что составляет 20% населения, отношение правдоподобия сайта будет LR = (0,35 / 0,65) / (0,2 / 0,8) = 2,154 таким образом, посещение этого сайта увеличило бы вероятность того, что оно будет "меньше 20" в 2,154 раза.

У сайта, который на 100% мужской, будет бесконечный LR, но вы, вероятно, захотите ограничить его, скажем, используя только 99,9% мужчин. Сайт, на 50% состоящий из мужчин, будет иметь LR 1, поэтому он не будет предоставлять никакой информации о распределении по полу.

Предположим, вы начинаете ничего не знать о человеке - его или ее шансы быть «младше 20 лет» составляют 0,2 / 0,8 = 0,25. Предположим, что для первого сайта LR = 2,154 для этого результата - теперь вероятность того, что он будет "меньше 20", станет 0,25 * (2,154) = 0,538 (что соответствует вероятности 35%). Если второй сайт имеет тот же LR, задние шансы становятся 1,16, что уже составляет 54% и т. Д. (Вероятность = шансы / (1 + шансы)). В конце вы бы выбрали категорию с наибольшей апостериорной вероятностью.

Есть множество предостережений с этими расчетами - например, предположение о независимости, вероятно, ошибочно, но оно может обеспечить хорошее начало.

1 голос
/ 15 марта 2010

Quick 'n' dirty: получить мужскую оценку путем умножения мужской вероятности и женскую оценку путем умножения женской вероятности. Прогнозировать больше. (На самом деле, не умножайте; вместо этого суммируйте логарифм каждой вероятности.) Я думаю, что это максимальная оценка вероятности, если вы сделаете правильные (крайне нереалистичные) предположения.

0 голосов
/ 15 марта 2010

Стандартная формула для расчета средневзвешенного значения приведена в этом вопросе и этом вопросе

Я думаю, что вы могли бы рассмотреть эти подходы и затем выяснить, какВы рассчитываете свой вес.

В приведенном выше примере с полами вы можете принять что-то в соответствии с набором весов {1, ..., 0, ..., 1}, что представляет собой линейное уменьшение от 0 до 1 для гендерных значенийот 0% мужчин до 50%, а затем соответствующее увеличение до 100%.Если вы хотите, чтобы эффект был перекошен в пользу исходящих значений, вы легко получите экспоненциальную или тригонометрическую функцию, которая предоставляет другой набор весов.Если вы хотите, то и нормальная кривая распределения тоже подойдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...