算法问题:平均入睡时间

2019-01-11 17:33:30 +08:00
 ideacco

最新项目有关看起来简单,却挺考验算法的题:

用户 A 23:59 分入睡, 用户 B 0:01 分入睡, 用户 C 0:02 分入睡, 用户 D 23:58 分入睡,

求 4 个人的平均入睡时间。

结题思路: 通过圆形分布把时间换算成角度,算出平均值,再反推回时间。

然而。。。。。要用代码实现出来貌似没那么容易……

3812 次点击
所在节点    程序员
49 条回复
dremy
2019-01-11 18:28:46 +08:00
这种只应该统计正常入睡情况吧,那些很反常的比如早上或者上午睡,下午或者晚上才醒很明显应该作为异常数据排除,定义一个类似的业务规则就好了
across
2019-01-11 18:29:21 +08:00
咦,刚好想做个闹钟 app··· 进来学习学习
ideacco
2019-01-11 18:29:40 +08:00
@Ediacaran 今天 18:00 入睡的,然后第二天你又 18:00 入睡的。。。。转化成时间戳再平均,你确定还是 18:00 ?
Ediacaran
2019-01-11 18:35:11 +08:00
@ideacco 多人同日当然可以时间戳。跨日用 30 小时值换算不就得了
across
2019-01-11 18:38:00 +08:00
设定当天入睡标准时间为 00:00,实际入睡时间是相对于零点的偏移量 X 分钟。
X 范围在 [-24 * 60,24*60] 之间,关键这里应该要进行数据筛选,比如多次入睡取绝对值最小的一个,醒来时间应该在入睡后绝对值最小的那个,或者不需要前后 24 个小时偏移值。
padeoe
2019-01-11 18:38:51 +08:00
多人同日用时间戳算平均,得出特定某日所有人平均的入睡时间 t,再对所有日的 t 加和除以总天数,获得多人多日平均
liprais
2019-01-11 18:39:55 +08:00
回去想明白了怎么定义入睡时间再来问
ahsiu
2019-01-11 18:42:39 +08:00
一共有 24 个人,每一个小时整点都有人入睡,请问这二十四个人的入睡平均时间是几点?
necomancer
2019-01-11 18:43:45 +08:00
circular mean
ideacco
2019-01-11 18:45:11 +08:00
@liprais 入睡时间是根据醒来时间 减去睡眠时长的。 比如醒来时间是 1/11 日 8:00 ,睡眠时长是 9 小时,那么你入睡时间就是 1/10 23:00
laqow
2019-01-11 18:45:34 +08:00
时刻和时长是两个量啊,分两个变量,一个入睡时间,一个睡眠时长存起来不行吗?至于分析,先有一定数据基础以后看看两个量的分布,如果差的很大就聚个类分别分析不就好了
ballshapesdsd
2019-01-11 18:45:53 +08:00
用圆上的点表示,矢量相加后求角度
ideacco
2019-01-11 18:47:27 +08:00
@ballshapesdsd 对的兄弟,这是一个统计学上的问题,求到了角度再反推回去时间才行,然而貌似不知道咋写的。
necomancer
2019-01-11 18:47:28 +08:00
from scipy.stats import circmean
circmean(t, high=12,low=0)
或者 24 小时制:
circmean(t, high=24,low=0)
necomancer
2019-01-11 18:48:35 +08:00
@ideacco 那个东西就叫 circular mean,具体看喂鸡百科。想自己写用 arctan2 函数。
l00t
2019-01-11 18:49:32 +08:00
我觉得你的圆形算角度的做法挺好的啊。后面的三个难点是想多了吧。你不是只要具体的时间点吗,那管它是哪天睡的…… 全部去掉日期,只保留时间点,放到圆上计算就行。每天中午 12 点睡到早上一点,那也是 12 点入睡,为什么要管它是哪天的 12 点呢?第一天早上 10 点睡,第二天下午 14 点睡,平均入睡时间显然应该是 12 点嘛,不然你觉得应该是几点?
ideacco
2019-01-11 18:51:27 +08:00
@l00t 是的是的。
ideacco
2019-01-11 18:51:44 +08:00
@necomancer 感谢,学到了。
necomancer
2019-01-11 18:52:14 +08:00
流程是先投影数据到角度 X->x in (0,2pi),然后求向量集 (sin(x),cos(x)) 的平均,然后用 arctan2 函数返回角度,根据周期再逆投影回数据。
necomancer
2019-01-11 18:54:02 +08:00
抱歉,是向量集 (cos(x), sin(x)), arctan2(mean_sin, mean_cos) 这样调用。写差了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/526137

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX