我有两个N维系列的点,每个长度为M ..目标是将它们相关并计算相关系数。使用方差,协方差和标准差的公式,可以计算相关系数..
我不明白的是如何使算法适应所有N维度而不仅仅是一个...考虑以下内容..
series A = [0, 0] [1, 1] [2, 2] [3, 3]
series B = [0, 0] [1, -1] [2, -2] [3, -3]
如果我们只使用第一个维度进行相关,我们将获得+1.00 ..如果我们使用第二个维度,我们将获得-1.00 ..但我们可以看到,如果我们考虑两个维度的相关性,答案不会像+1.00或-1.00那么简单。
所以我想知道如何制定这种多维相关,最好是在c#..
随时请求进一步澄清或编辑以进一步改进帖子.. =)
编辑:我使用的系列是库存时间序列..我检索CLOSE价格的最新M样本作为系列A并开始将其与所有历史数据相关联作为滑动窗口(数据[1]到数据[M + 1] ],数据[2]到数据[M + 2],数据[1000]到数据[M + 1000],等等)..相关性最高的偏移是价格行为差不多的时间点与现在相同..通过分析价格是否在该时间实例之后上涨或下跌,我们可以预测价格可能在此时刻以何种方式进行预测..但我不仅仅使用CLOSE价格(1维) ..我想确定一些指标相似的区域,例如CLOSE,VOLUME等。所以时间序列对于每个索引只有一个值,而是整个数组值。如果我在关联中只使用CLOSE,我不能保证这些系列的VOLUME序列是否也相似。同样如果我在相关中使用VOLUME,我也不能保证这些序列的CLOSE序列也是相似的。所以我需要一个基于某种距离度量的归一化相关的公式......类似于^ 2 + b ^ 2 ..如果CLOSE值相似,则^ 2将很小..如果VOLUME值是相似的,b ^ 2会很小..现在如果^ 2 + b ^ 2很小,那就意味着CLOSE和VOLUME都很相似..
之前我正在做的事情如下:编辑:
stdDevX = Sqrt (Summation ((x - Mean(x)) * (x - Mean(x)) / N)
stdDevY = Sqrt (Summation ((y - Mean(y)) * (y - Mean(y)) / N)
corrXY = Summation ((x - Mean(x) * (y - Mean(y)) / (stdDevX * stdDevY)) / (N - 1)
http://en.wikipedia.org/wiki/Standard_deviation
http://en.wikipedia.org/wiki/Pearson_product-moment_correlation_coefficient
以上公式假设x和y系列都是一维的..我主要关心的是如何使这些公式适用于多维向量..我希望用它来找到所有价格指标相似的区域历史..但任何想要关联任何类型的顶点的人都可以使用它..对象的x,y,z坐标等。
答案 0 :(得分:2)
问题尚不清楚,但我认为你被要求分别处理每个系列。因此,考虑只是 A系列作为来自一对变量X和Y的样本序列,这两个变量是完全相关的(如果您绘制了一个散点图,所有值都将在一条直线上从左下角到右上角,所以相关性为+1。
相比之下,将只是系列B视为来自X和Y的另一个样本序列,此时散点图将再次是从左上角到右下角的直线。增加X会减少Y.相关性为-1。
如果每个系列包含来自三个变量的样本(例如,三个股票的价格随时间变化的快照),则会变得更有趣。这是一个简单的例子:
X Y Z X Y Z X Y Z X Y Z series C = [0, 0, 0] [1, 1, -1] [2, 2, -2] [3, 3, -3]
在这里,您需要考虑每对变量之间的相关性。在这种简单的情况下, X 和 Y 之间的相关性为+1, X 和 Z 之间的相关性为-1在 Y 和 Z 之间是-1。
假设您有三个变量的样本 - 关闭,高和低 - 两个时间段,并想知道匹配的好坏这两个时期是。您可以用传统方式计算每个变量的两个时间段之间的相关性。假设这产生密切相关 = 0.6,高相关 = 0.3,低相关 = 0.4。
你需要一些方法将各个相关性组合成一个拟合优度得分,使得个体相关性远离零(即高度相关,正面或负面)对得分的贡献大于接近于零的那些。 。简单的方法包括取产品(0.6 * 0.3 * 0.4 = 0.072)或均方根(sqrt((0.6 ^ 2 + 0.3 ^ 2 + 0.4 ^ 2)/ 3)= 0.4509) - 你必须试验找到能给你最可靠结果的方法。
答案 1 :(得分:0)
int GetCorrelationScore(Array[,] seriesA, Array[,] seriesB)
{
int correlationScore = 0;
for (var i = 0, i < seriesA.Length; i++)
{
if (areEqual(seriesA[i][0], seriasB[i][0], 0.5m) && areEqual(seriesA[i][1], seriasB[i][1], 0.5m))
correlationScore++;
else
correlationScore--;
}
}
bool areEqual(decimal value1, decimal value2, decimal allowedVariance)
{
var lowValue1 = value1 - allowedVariance;
var highValue1 = value1 + allowedVariance;
return (lowValue1 < value2 && highValue1 > value2)
}