计算集合的密度

时间:2011-05-06 21:41:06

标签: mysql math

(我希望我的数学词汇更发达)

我有一个网站。在那个网站上是一个视频。当用户观看视频时,一些javascript存储他们到目前为止在视频中获得的距离。当他们停止观看视频时,会存储该秒数。不幸的是,当js执行此操作时,没有任何模式。

因此,如果有人正在观看视频,我们可能会看到以下内容:

3
6
8
10
12
16

另一个人可能会立即感到无聊:

1
3

此数据全部存储在同一个地方,匿名。因此,包含所有这些信息的排序表将如下所示:

1
3
3
6
8
10
12
16

最后,存储视频开始的次数。在这种情况下,它将是2

所以。如何在视频播放的所有时间内获得平均“高时间”(视频中最远的点)?

我知道如果我们每秒都有一个值:

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 个答案:

答案 0 :(得分:2)

为什么不保留上次提供的时间,并保持平均值?如果你要么扔掉,要么只关注最后一个数字,看起来你可能只是对这些数字进行平均。

您可能还想查看术语standard deviation,因为这可能不是最有用的衡量标准。如果你也有标准偏差,它可以帮助你意识到你的平均值为7,但它主要由1和15组成。

如果您必须拥有所有数据,就像您建议的那样,我会尝试更多地考虑这一点。我并不完全确定如何将值与其附带的所有先前值相关联。你总是知道输出数字的顺序吗?如果是这样的话,我想我知道你可以推导出“最后一个”的方法,这可能会有点计算成本。

如果你只有一个整数序列,我想你可以增加每个值(以指数方式?)来“补偿”后来的值'包含'早期值的事实。我仍然在研究这个想法,但也许它会给别人一个种子。如果你对这些总和求平均值,然后取这个平均值的base2 logarithm怎么办?这是否提供任何有用的指标?这应该将后面的值“加权”到它们补偿早期值之和的点。我想。

在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 :(得分:1)

我认为@ 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独立地不一致并且人数很多,则偏差应该相当小。

这是不对的,但它足够接近政府的工作。

答案 2 :(得分:0)

要获得每个用户观看的总时间,您将解析从最小到最大的列表。如果您有4个视图,则会查看列表,直到您发现不再有4个相同的数字,最后一个数字,其中4个相同的数字是第一个视图的最大值。然后你会找到3个相同的数字何时停止,依此类推。例如:

4次观看数据: 1111222233334445566778

4个并排的观点:

1 1 1 1
2 2 2 2
3 3 3 3< - 第一视图最大为3秒
4 4 4 < - 第二视图最大为4秒
5 5
6 6
7 7&lt; - 第三视图最大为7秒
8 < - 第四视图max是8秒

编辑 - 哦,我刚注意到他们不统一。在这种情况下,移动平均线可能是您最好的选择。

答案 3 :(得分:0)

假设增量总是在5左右,有些丢失,有些则更长或更短。那么完全做到这一点并不容易(可能吗?)。我的建议是:计算类似'移动计数'的东西。与moving average类似。

所以,对于第二个7:计算有多少数字是5,6,7,8或9并除以5.这将让你很好地猜测有多少人观看了第7秒。对第二个10做同样的事。差异将接近于第二个7到10之间留下的人数。

答案 4 :(得分:0)

值的数量大致对应于javascript发送值的时间段数(如果视频停止时间附有必须的时间,则减去1/2,因为它的时刻在时间间隔内是随机的)。 / p>

如果所有客户都有类似的间隔并且您知道它们,则可以使用:

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

5.0是这里帖子之间的间隔。

请注意,它甚至不会查看值:您也可以只存储&#34;滴答&#34;。

答案 5 :(得分:-1)

在最长时间内,您可以在字段上使用MAX()。也许就像......

SELECT MAX(play_time) AS maxTime FROM video

哪会给你一个人播放视频的时间最长。

如果您想要其他内容,例如AVG(),那么您将需要更复杂的查询,按用户收集等等。

MySQL还包含一个名为STDDEV()STD()的标准偏差函数,它也可以为您提供帮助。