用时间序列相关性测量“同步”

机器算法验证 时间序列 相关性
2022-04-07 09:18:25

来自统计新手和具有计算机科学背景的人类学家 StackExchange newb 的问题。在以下情况下,我正在寻找“同步”的适当统计度量:

我有一个全景视频,几个人坐在相机周围的椅子上交谈了一个小时。我按人分割视频并为每个人生成时间序列数据,测量他们随着时间的推移移动了多少、手势等(即连续视频帧之间不同的像素数)。所以我有一张图表,显示一个人在一个多小时内的每个时刻是如何静止或动画的(使用移动平均线来平滑事物)。

我想测量每个时刻组的“同步”,即生成另一个时间序列,显示他们在任何给定时刻的动作是如何“同步”的。什么样的统计测量适合这个?越简单/直观越好。

一些假设:

  • 如果只有一个人在移动,同步应该接近于零。
  • 如果每个人都在移动,同步应该接近最大值。

请注意,这将主要用于视觉检查和分析,以突出显示人们同步的视频部分。

-丹尼尔

4个回答

好的有趣的问题。认为我知道使用 Ramseyer 和 Tsachers 模型/方法(非语言同步或随机巧合?如何区分)的正确答案。

您的数据似乎非常适合它!以下是头部的简短描述,此处可能存在一些错误,因此请同时阅读参考论文。

他们使用运动能量分析(通过一些过滤器以排除高频照明影响后的帧到帧像素差异,例如 Paxton 和 Dale 所做的 Bandworth 过滤器(待发布))

接下来是使用不同时间滞后的 Pearson 互相关(也为您提供有关领先跟随行为的信息)(然后是峰值查找算法)。然后,您可以通过将其与 99 个假(时移二元组)进行比较来进行统计分析。这将为您提供足够的信息来创建同步评级。如果你发布它,请给我一个链接,想知道你会发现什么总是好的,有执行研究的例子。

问题将出在多人位上。我的博士专注于这个和一个用于交互式娱乐系统的实时测量(而不是使用 99time shift 的),还没有找到解决方案,暂时可以使用多重比较。如果您还想了解更多有关 Emilie Delaherche 作品的信息,她提供了一个很好的概述。Boker、Grammer Ramseyer Tsacher,他们都提供了有关峰值选择、互相关等的更多信息。

好吧,有既定的同步措施。甚至还有基于同步的集群。你为什么不直接使用这些措施?

阅读“仓本模型”: http ://en.wikipedia.org/wiki/Kuramoto_model

这是我在 R 代码中的建议。我不知道您正在使用什么软件,但至少您可以免费下载 R 并轻松运行脚本,看看我在说什么,然后创建您自己的版本。如果你在 R 中,很多循环可以用“zoo”包中的“rollapply”函数替换。但是这样代码是自包含的。

我所做的是创建了三个时间序列: 1. 简单信号,点 (i+1) 处的下一个值与前一个值 (i) 相关。2. 基于第一个的信号,因此它们应该高度相关但幅度不同 3. 由高斯噪声制成的随机信号

这确实遗漏了相移,也就是说,如果一个人 a 开始移动,然后人 b 在之后开始移动,但随着时间的推移,这种方法将低估相关性。这可以通过包括多个时间偏移来纠正。或者,可能通过增加滚动平均的时间长度(就像低通滤波器一样)。

当然,还有其他可能更合适的方法,但这些方法基于振荡信号,例如,您可以使用小波进行时频分解,然后计算跨多个频率的人际锁相。然后创建相位和相干图。如果您认为这可能是您所追求的,我也有相应的脚本,但您可能想查看 matlab 或 R 中的专用包。

在申请之前,您可能需要从视频中随机抽取几个样本,或者甚至是“培训”视频,看看哪些参数可以为您提供所需的信息。然后将其应用于您的实际样本。例如,改变滚动平均值的长度,玩相移,调整加权参数。如果你愿意,你甚至可以得到增强的 CI。

这是R脚本:

#highly correlated series
rl<-20                  #rolling average length
x<-5                    #Just a starting value
xvec<-3000
#1st time series, made so that the next value correlates with preceding value
for(i in 1:(xvec-1)) { x[i+1] <- x[i] +rnorm(1, 0, 0.2) }
y<-x+rnorm(xvec, 0, 0.3) #Second series based on 1st series for high correlation
xy<-(x*y)/max(x*y)      #For weighting

#Calculating rolling correlation with 20 values either side
cxy<-sapply((rl+1):(xvec-rl+1), function(i) cor(x[(i-rl):(i+rl)], y[(i-rl):(i+rl)]))
#Smoothed rolling correlation by rolling average
cxym<-sapply((rl+1):(xvec-3*rl+1), function(i) mean(cxy[(i-rl):(i+rl)]))
#Smoothed weighting
xym<-sapply((2*rl+2):(xvec-2*rl+2), function(i) mean(xy[(i-rl):(i+rl)]))

par(mfcol = c(2,2))     #Create plot so that there are 4 figures per plot space
plot(1:xvec, x, type="l"); lines(1:xvec, y, col=2)  #plot 1st and 2nd time series

#Plot correlations
plot((rl+1):(xvec-rl+1), cxy, type="l", xlim=c(0, xvec), ylim=c(-1,1))
lines((2*rl+2):(xvec-2*rl+2), cxym, col=2)      #Smoothed rolling correlation
lines((2*rl+2):(xvec-2*rl+2), cxym*xym, col=3)  #Smoothed weighted correlation

#No correlation between series and plot
y<-rnorm(xvec, 5, 1)
xy<-(x*y)/max(x*y)
cxy<-sapply((rl+1):(xvec-rl+1), function(i) cor(x[(i-rl):(i+rl)], y[(i-rl):(i+rl)]))
cxym<-sapply((rl+1):(xvec-3*rl+1), function(i) mean(cxy[(i-rl):(i+rl)]))
xym<-sapply((2*rl+2):(xvec-2*rl+2), function(i) mean(xy[(i-rl):(i+rl)]))
plot(1:xvec, x, type="l"); lines(1:xvec, y, col=2)
plot((rl+1):(xvec-rl+1), cxy, type="l", xlim=c(0, xvec), ylim=c(-1,1))
lines((2*rl+2):(xvec-2*rl+2), cxym, col=2)
lines((2*rl+2):(xvec-2*rl+2), cxym*xym, col=3)

动态自发同步类型的视觉在这里会很有用。请参阅使用星标模拟萤火虫闪烁的示例。

http://skyeome.net/wordpress/?p=56

http://education.mit.edu/starlogo/

您可以使用成员在帧之间的像素差异的某种度量(强度差异的平均值?)作为个人运动的连续步骤测量;然后在镜头的前几分钟采集一系列训练样本,找到所有个体之间最小和最大运动的绝对范围的合理估计。

从那里,您可以将范围量化为一组级别,其中视觉强度点对应于个人随时间的运动。如附图所示,所有单个成员点都将绘制在一个集群中。从那里您可以生成滚动同步图,如图 2 所示。可能使用与滚动图上每个时间片上每个量化级别的频率相关的某种类型的内核密度。如果所有成员的级别都对齐,则 bin 宽度将最小化,强度将最大化;任何较低的相关性都会导致密度快照的较大分散和较低的最大强度。