某天某人提出想用FastDTW做一些已有统计数据的相关性计算.
FastDTW算是DTW的一个优化方式.
而DTW简单来说,就是计算两组数据的所有组合方式,然后找出一个cost最小的数据X->数据Y的映射关系/路线/矩阵的对角路线.
当想到映射这个词的时候,有种豁然开朗的感觉.
所谓两组数据存在相关性,也就是存在一个变换T,使得Y=T(X)成立.
简单假设这个变换是线性的话.
那么两条曲线是否相似的问题就转化为,线性拟合后的曲线T(X)与Y的误差是否在合理范围内了.
所以,简单地对各条曲线做两两组合的线性拟合,然后看方差就大致可以得出那些曲线是存在相关性/联动的了.
更进一步地,曲线间做个相对序列平移的话(比如X[:-1]与Y平移4位后的Y[4:-1]),也可以做一个类似"因果"关系的拟合.
问题是,由于各组数据间的数量级不尽相同,直接的方差比较就没什么太大的意义了.
一个思路是对方差做normalize,使其规约到同等范围内.
另一个思路是直接对源数据做feature scaling.
对前一种思路并没有想到很好的方法.
直觉上应该都是需要跟源数据/期望做一些运算得出一个相对的scaling function/mapping/transform的.
这样的话,不如直接最开始就采用后者.
而且这个也有比较通常的做法.
对于给定数据X,简单的(X-mean(X))/std(X),源数值减去均值,然后对比标准差做个缩放.
而且由于前提假设是线性换掉拟合,因此,对于任意两组数据,X,Y,scale之后跟之前的差别不过再多一重线性变换而已.
因为mean(X),std(X)都可各自认为是常数.
于是,保证了变换后进行拟合的合理性.
剩下的就是蛮力地对所有可能的组合进行拟合比较方差了.
实际的实验是拿了大概200组各游戏的30天日统计数据.
也就是每组数据大概30个值吧.
组合之后,排除一些无意义的组合(自身跟自身,前后排列重复的),大概就剩下17k左右的拟合结果把.
随意选了一些方差小的来看,结果其实挺尴尬的.
比如有一个结果是某游戏的累计MAU(monthly active user)和另一个游戏的DNU(daily new user).
前者是个每天累计的值,原则上来说是每天递增的.
后者则是一个浮动值.
对于这个结果的解释,大概就是恰好DNU一直在下降吧.
于是就不小心负相关了.
而一些数据则是比较正常的.
比如某游戏的各地区汇总DAU和某主要地区DAU之间的正相关.
所以说,相关性这东西,只能说可能存在关系.
false positive的情况还是比较普遍的.
对于不能解释的相关性,如果硬要拿来作为决策的依据的话,感觉跟掷骰子赌一把没什么区别.
一个简单的例子就是,每次下雨的同时说一句要下雨了.
那么从数据上来说,下雨和说下雨是相关的.
而以观察某人是否说下雨来预报天气的话,多少显得儿戏.
尽管,严格来说,这种"气象预测"是准确的.
因为确实每次说下雨的时候都在下雨.
但矛盾点在于,它颠倒了因果关系.
虽然,用前面的话来说,通过一些平移可以做一些"因果关系"的拟合.
不过始终的,相关性只是说明了一个结论.
对于发生的过程并没有任何信息.
从科学的角度来说,相关并不一定是可"准确"重现的一个结论.
能不能有效,多数时候是"运气"使然.
所谓偶然的相关性.
没有评论:
发表评论