我有各种各样的时间序列,我想要相互关联 - 或者更确切地说,相互关联 - 以找出相关因子最大的时滞.
我找到了各种 问题和答案/链接,讨论如何用numpy来做,但那些意味着我必须把我的数据帧变成numpy数组.由于我的时间序列经常涵盖不同的时期,我担心我会陷入混乱.
编辑
我遇到的所有numpy/scipy方法的问题是,他们似乎缺乏对数据时间序列性质的认识.当我将1940年开始的时间序列与1970年开始的时间序列相关联时,熊猫corr知道这一点,而np.correlate只产生1020个条目(长序列的长度),这个数组充满了nan.
关于这个主题的各种Q表明应该有一种方法来解决不同长度的问题,但到目前为止,我没有看到如何在特定时间段内使用它的迹象.我只需要以1为增量移动12个月,以便在一年内查看最大相关时间.
EDIT2
一些最小样本数据:
import pandas as pd
import numpy as np
dfdates1 = pd.date_range('01/01/1980', '01/01/2000', freq = 'MS')
dfdata1 = (np.random.random_integers(-30,30,(len(dfdates1)))/10.0) #My real data is from measurements, but random between -3 and 3 is fitting
df1 = pd.DataFrame(dfdata1, index = dfdates1)
dfdates2 = pd.date_range('03/01/1990', '02/01/2013', freq = 'MS')
dfdata2 = (np.random.random_integers(-30,30,(len(dfdates2)))/10.0)
df2 = pd.DataFrame(dfdata2, index = dfdates2)
Run Code Online (Sandbox Code Playgroud)
由于各种处理步骤,这些dfs最终变为df,从1940年到2015年被索引.这应该重现:
bigdates = pd.date_range('01/01/1940', '01/01/2015', freq = 'MS') …Run Code Online (Sandbox Code Playgroud) 我正在Matlab中的傅里叶域中进行模板匹配.这是我的图像(艺术家是DeviantArt上的RamalamaCreatures):
我的目标是在负鼠的耳朵周围放置一个边界框,就像这个例子(我使用normxcorr2执行模板匹配):
这是我正在使用的Matlab代码:
clear all; close all;
template = rgb2gray(imread('possum_ear.jpg'));
background = rgb2gray(imread('possum.jpg'));
%% calculate padding
bx = size(background, 2);
by = size(background, 1);
tx = size(template, 2); % used for bbox placement
ty = size(template, 1);
%% fft
c = real(ifft2(fft2(background) .* fft2(template, by, bx)));
%% find peak correlation
[max_c, imax] = max(abs(c(:)));
[ypeak, xpeak] = find(c == max(c(:)));
figure; surf(c), shading flat; % plot correlation
%% display best match
hFig = figure;
hAx = axes;
position = [xpeak(1)-tx, …Run Code Online (Sandbox Code Playgroud) matlab fft image-processing template-matching cross-correlation
我有一个双打数组,大约200,000行乘100列,我正在寻找一种快速算法来查找包含与给定模式最相似的序列的行(模式可以是10到100个元素的任何位置).我正在使用python,所以蛮力方法(下面的代码:遍历每一行和开始列索引,并计算每个点的欧几里德距离)大约需要三分钟.
numpy.correlate函数有望更快地解决这个问题(在不到20秒的时间内在同一个数据集上运行).然而,它只是计算整个行上的模式的滑点产品,这意味着为了比较相似性,我必须首先将结果标准化.规范化互相关需要计算每个数据切片的标准偏差,这立即抵消了首先使用numpy.correlate的速度提升.
是否可以在python中快速计算规范化的互相关?或者我是否必须采用C语言编写蛮力方法?
def norm_corr(x,y,mode='valid'):
ya=np.array(y)
slices=[x[pos:pos+len(y)] for pos in range(len(x)-len(y)+1)]
return [np.linalg.norm(np.array(z)-ya) for z in slices]
similarities=[norm_corr(arr,pointarray) for arr in arraytable]
Run Code Online (Sandbox Code Playgroud) 我得到了两张图片,显示了相同的内容:2D高斯形斑点.我把这两个16位的png文件称为"left.png"和"right.png".但是,通过稍微不同的光学设置获得它们,相应的斑点(物理上相同)出现在略微不同的位置.意味着右边以非线性方式略微拉伸,扭曲或左右.因此,我希望从左到右进行转换.
因此,对于左侧的每个像素,其x和y坐标,我想要一个函数,给出位移矢量的分量,指向右侧的相应像素.
在前一种方法中,我试图获得相应斑点的位置以获得相对距离deltaX和deltaY.然后我将这些距离拟合到taylor扩展到T(x,y)的二阶,给出了左边每个像素(x,y)的位移矢量的x和y分量,指向相应的像素(x',y')在右边.
为了得到更一般的结果,我想使用归一化的互相关.为此,我将左边的每个像素值与右边的相应像素值相乘,并将这些乘积相加.我正在寻找的转换应该连接最大化总和的像素.因此,当总和最大化时,我知道我将相应的像素相乘.
我真的尝试了很多,但没有管理.我的问题是,如果你们中的某个人有想法或做过类似的事情.
import numpy as np
import Image
left = np.array(Image.open('left.png'))
right = np.array(Image.open('right.png'))
# for normalization (http://en.wikipedia.org/wiki/Cross-correlation#Normalized_cross-correlation)
left = (left - left.mean()) / left.std()
right = (right - right.mean()) / right.std()
Run Code Online (Sandbox Code Playgroud)
如果我能更清楚地说明这个问题,请告诉我.我仍然需要查看如何使用乳胶发布问题.
非常感谢您的投入.

[left.png] http://i.stack.imgur.com/oSTER.png [right.png] http://i.stack.imgur.com/Njahj.png
我担心,在大多数情况下,16位图像看起来只是黑色(至少在我使用的系统上):(但当然有数据存在.
我试着澄清我的问题.我正在寻找一个矢量场,其位移矢量从left.png中的每个像素指向right.png中的相应像素.我的问题是,我不确定我的约束.
import numpy as np
import Image
left = np.array(Image.open('left.png'))
right = np.array(Image.open('right.png'))
# for normalization (http://en.wikipedia.org/wiki/Cross-correlation#Normalized_cross-correlation)
left = (left - left.mean()) / left.std()
right = (right - right.mean()) / right.std()
Run Code Online (Sandbox Code Playgroud)
其中向量r(分量x和y)指向left.png中的像素,向量r-prime(分量x-prime和y-prime)指向right.png中的对应像素.每个r都有一个位移矢量.
我之前做的是,我发现了矢量场d的手动组件并将它们拟合到第二度的多项式:
import numpy …Run Code Online (Sandbox Code Playgroud) 在参考Chelton(1983)后,我一直在努力计算两对向量(x和y)的自由度,这是:
并且我找不到使用np.correlate计算归一化互相关函数的正确方法,我总是得到一个不在-1,1之间的输出.
为了计算两个向量的自由度,有没有简单的方法来对互相关函数进行归一化?
在我之前关于在更大的音频样本中找到参考音频样本的问题中,有人建议我应该使用卷积.
使用DSPUtil,我能够做到这一点.我玩了一下,尝试了不同的音频样本组合,看看结果是什么.为了可视化数据,我只是将原始音频作为数字转储到Excel并使用这些数字创建了一个图表.一个高峰是可见的,但我真的不知道这对我有什么帮助.我有这些问题:
任何帮助都非常感谢.
以下图片是使用Excel进行分析的结果:
更新和解决方案:
感谢Han的广泛帮助,我实现了目标.
在我没有FFT的情况下推出自己的慢速实现后,我发现alglib提供了快速实现.我的问题有一个基本假设:其中一个音频样本完全包含在另一个中.
因此,以下代码返回两个音频样本中较大者中的样本中的偏移量以及该偏移量处的归一化互相关值.1表示完全相关,0表示根本没有相关,-1表示完全负相关:
private void CalcCrossCorrelation(IEnumerable<double> data1,
IEnumerable<double> data2,
out int offset,
out double maximumNormalizedCrossCorrelation)
{
var data1Array = data1.ToArray();
var data2Array = data2.ToArray();
double[] result;
alglib.corrr1d(data1Array, data1Array.Length,
data2Array, data2Array.Length, out result);
var max = double.MinValue;
var index = 0;
var i = 0;
// Find the maximum …Run Code Online (Sandbox Code Playgroud) 我有两个信号,我希望其中一个响应另一个,但是有一定的相移.
现在我想计算相干性或归一化的交叉谱密度,以估计输入和输出之间是否存在任何因果关系,以找出这种相干性出现在哪个频率上.
例如,参见此图像(来自此处),它在频率10处似乎具有高相干性:

现在我知道我可以使用互相关来计算两个信号的相移,但是如何使用相干性(频率为10)来计算相移?
图像代码:
"""
Compute the coherence of two signals
"""
import numpy as np
import matplotlib.pyplot as plt
# make a little extra space between the subplots
plt.subplots_adjust(wspace=0.5)
nfft = 256
dt = 0.01
t = np.arange(0, 30, dt)
nse1 = np.random.randn(len(t)) # white noise 1
nse2 = np.random.randn(len(t)) # white noise 2
r = np.exp(-t/0.05)
cnse1 = np.convolve(nse1, r, mode='same')*dt # colored noise 1
cnse2 = np.convolve(nse2, r, mode='same')*dt # colored noise 2
# …Run Code Online (Sandbox Code Playgroud) python signal-processing matplotlib spectral-density cross-correlation
如何以分布式方式计算大(> 10TB)数据集的皮尔森互相关矩阵?任何有效的分布式算法建议将不胜感激.
更新:我读了apache spark mlib相关的实现
Pearson Computaation:
/home/d066537/codespark/spark/mllib/src/main/scala/org/apache/spark/mllib/stat/correlation/Correlation.scala
Covariance Computation:
/home/d066537/codespark/spark/mllib/src/main/scala/org/apache/spark/mllib/linalg/distributed/RowMatrix.scala
Run Code Online (Sandbox Code Playgroud)
但对我来说,看起来所有的计算都发生在一个节点上,而且它并没有真正意义上的分布.
请点亮这里.我也尝试在3节点火花簇上执行它,下面是截图:
正如你从第二张图片中看到的那样,在一个节点上提取数据然后正在进行计算.我在这里吗?
algorithm distributed distributed-computing cross-correlation apache-spark
有人可以告诉我们如何在MATLAB中对两个语音信号(每个40,000个样本)进行互相关,而不使用内置函数xcorr和相关系数?
提前致谢.
我想找到两个时间戳数组之间的偏移量.它们可以代表两个音轨中的哔哔声.
注意:两个轨道中可能有额外或缺少的开始.
我找到了一些关于互相关的信息(例如https://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similar)看起来很有希望.
我假设每个音轨的持续时间为10秒,并将哔哔声表示为"方波"的峰值,采样率为44.1 kHz:
import numpy as np
rfft = np.fft.rfft
irfft = np.fft.irfft
track_1 = np.array([..., 5.2, 5.5, 7.0, ...])
# The onset in track_2 at 8.0 is "extra," it has no
# corresponding onset in track_1
track_2 = np.array([..., 7.2, 7.45, 8.0, 9.0, ...])
frequency = 44100
num_samples = 10 * frequency
wave_1 = np.zeros(num_samples)
wave_1[(track_1 * frequency).astype(int)] = 1
wave_2 = np.zeros(num_samples)
wave_2[(track_2 * frequency).astype(int)] = 1
xcor = irfft(rfft(wave_1) * np.conj(rfft(wave_2)))
offset …Run Code Online (Sandbox Code Playgroud) python ×6
correlation ×2
fft ×2
matlab ×2
numpy ×2
.net ×1
algorithm ×1
apache-spark ×1
c# ×1
convolution ×1
distributed ×1
image ×1
matplotlib ×1
pandas ×1
waveform ×1