расчет плотности набора - PullRequest
2 голосов
/ 07 мая 2011

(хотелось бы, чтобы мой математический словарь был более развит)

У меня есть веб-сайт. На этом сайте есть видео. Когда пользователь смотрит видео, немного javascript хранит информацию о том, как далеко они продвинулись в видео. Когда они прекращают смотреть видео, это количество секунд сохраняется. К сожалению, нет никакой картины, когда js сделает это.

Так что, если один человек смотрит видео, мы можем увидеть этот набор:

3
6
8
10
12
16

А другому человеку может сразу скучно:

1
3

Все эти данные хранятся в одном и том же месте анонимно. Таким образом, отсортированная таблица со всей этой информацией будет выглядеть так:

1
3
3
6
8
10
12
16

Наконец, количество раз, когда видео запускается вообще сохраняется. В этом случае это будет 2.

Итак. Как получить среднее значение 'high-time' (самая дальняя точка в видео) за все время воспроизведения видео?

Я знаю, что если бы у нас было значение для каждой секунды:

1
2
3
4
5
6
7
...
14
15
16

1
2
3

Тогда мы могли бы подсчитать значения и поделить на количество игр:

(19) / 2 = 9.5

Или, если бы данные были иным образом однородными, скажем, с шагом 5, мы могли бы подсчитать это и умножить на 5 (в этом примере мы потеряли бы точность, но это нормально):

5
10
15

5

(4) * 5 / 2 = 10

Похоже, у меня есть общая функция, которая будет работать:

count * 1/d = avg

где d - плотность чисел (в приведенном выше примере с шагом 5 секунд 1/5).

Есть ли способ получить плотность, d, из набора эффективно случайных чисел?

Ответы [ 6 ]

2 голосов
/ 07 мая 2011

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

Возможно, вы также захотите проверить термин стандартное отклонение , поскольку необработанное среднее значение может быть не самым полезным измерением.Если у вас также есть стандартное отклонение, это может помочь вам понять, что у вас в среднем 7, но оно состоит в основном из 1 и 15.

Если вам нужно иметь все данные, как вы предлагали, я постараюсь подумать об этом немного подробнее.Я не совсем уверен, как вы можете связать значение со всеми предыдущими значениями, которые пришли с ним.Вы ВСЕГДА знаете последовательность, по которой выводятся числа?Если это так, я думаю, я знаю способ, которым вы могли бы получить «последний», который может быть немного вычислительно дорогим.

Если у вас есть только последовательность целых чисел, я думаю, что вы сможете увеличить каждыйзначение (экспоненциально?), чтобы «компенсировать» тот факт, что более позднее значение «содержит» более ранние значения.Я все еще работаю над этой идеей, но, возможно, она даст кому-то еще семя.Что если вы усредните их по сумме, а затем возьмете base2 логарифм от этого среднего?Предоставляет ли это какой-либо полезный показатель?Это должно «взвешивать» более поздние значения до точки, где они компенсируют сумму более ранних значений.Я думаю.

В python-esk:

sum = 0
numberOf = 0  
for node in nodes:
   sum = sum + node.value ^ 2
   numberOf = numberOf + 1
weightedAverage = log(sum/numberOf, 2) 
print weightedAverage
print "Thanks Brian"
1 голос
/ 07 мая 2011

Я думаю, что @ brian-stiner находится на правильном пути в одном из своих комментариев.

Начните с чего-то вроде:

1
3
3
6
8
10
12
16

Превратите это в числа и цифры.

1, 1
3, 2
6, 1
8, 1
10, 1
12, 1
16, 1

А затем, читая с конца вниз, найдите все точки, которые случались чаще, чем какие-либо оставшиеся.

3, 2
16, 1

Считайте различия в счетах.

3, 1
16, 1

И у вас есть приблизительная оценка мест остановки.

Это будет не непредвзятой оценкой.Но если JavaScript независимо друг от друга несовместим и число людей велико, предвзятость должна быть довольно небольшой.

Это не будет правильным, но оно будет достаточно близко для работы правительства.

0 голосов
/ 07 мая 2011

Количество значений примерно соответствует количеству периодов времени, в которые ваш javascript отправляет значения (минус 1/2, если остановка видео сопровождается обязательным размещением времени, поскольку его момент является случайным в пределах интервала).

Если у всех клиентов одинаковые интервалы и вы их знаете, вы можете просто использовать:

SELECT  (COUNT(*) - 0.5) * 5.0 / (SELECT counter FROM countertable)
FROM    ticktable

5.0 - это интервал между сообщениями здесь.

Обратите внимание, что ондаже не смотрит на значения: вы можете просто хранить «галочки».

0 голосов
/ 07 мая 2011

Предполагается, что приращения всегда составляют около 5, некоторые отсутствуют, некоторые немного длиннее или короче.Тогда не будет легко (возможно?) Сделать это точно.Мое предложение: вычислить что-то вроде «скользящего счета».Похоже на скользящее среднее .

Итак, для секунды 7: посчитайте, сколько чисел 5,6,7,8 или 9, и разделите на 5. Это даст вам довольно хорошую оценкусколько людей смотрели 7-ю секунду.Сделайте то же самое для секунды 10. Разница будет близка к числу людей, которые ушли между вторыми 7 и 10.

0 голосов
/ 07 мая 2011

Чтобы получить общее время просмотра для каждого пользователя, вам придется анализировать список от наименьшего к наибольшему.Если у вас есть 4 просмотра, вы будете просматривать список до тех пор, пока не обнаружите, что у вас больше нет 4 одинаковых номеров, последнее число, где у вас было 4 одинаковых номера, является максимальным значением первого просмотра.Затем вы будете искать, когда 3 одинаковых номера прекратятся, и так далее.Например:

4 просмотра данных: 1111222233334445566778

4 просмотра бок о бок:

1 1 1 1
2 2 2 2
3 3 3 3 3<- максимальный просмотр первого просмотра составляет 3 секунды <br>4 4 4 <- максимальный просмотр первого просмотра составляет 4 секунды <br>5 5
6 6
7 7 <- максимальный просмотр третьего просмотра составляет 7 секунд <br>8 <- Четвертое представление макс составляет 8 секунд <br>

РЕДАКТИРОВАТЬ- О, я только что заметил, что они не являются одинаковыми.В этом случае скользящая средняя, ​​вероятно, будет вашим лучшим выбором.

0 голосов
/ 07 мая 2011

В течение максимального времени вы можете использовать MAX() на своем поле. Возможно, что-то вроде ...

SELECT MAX(play_time) AS maxTime FROM video

Что даст вам самый длинный раз, когда кто-то проигрывал видео.

Если вам нужны другие вещи, например AVG(), вам понадобятся более сложные запросы для сбора данных для каждого пользователя и т. Д. И т. Д.

MySQL также содержит функцию стандартного отклонения, называемую STDDEV() и STD(), которая также может вам помочь.

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