【问题标题】:multiple dimension correlation in c#c#中的多维相关性
【发布时间】:2012-01-15 10:30:31
【问题描述】:

我得到了两个 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# 中..

随时要求进一步澄清或编辑以进一步改进帖子.. =)

编辑:我使用的序列是股票时间序列。我检索最新的 M 个收盘价样本作为序列 A,并开始将其与所有历史数据关联为滑动窗口(数据 [1] 到数据 [M + 1 ]、data[2] 到 data[M+2]、data[1000] 到 data[M+1000] 等等).. 相关性最高的偏移量是价格行为几乎接近的时间点与现在相同..通过分析在该时间实例之后价格是否上涨或下跌,我们可以预测价格在这个时间瞬间会以何种方式移动..但我不只使用收盘价(一维) .. 我想确定一些指标相似的区域,例如 CLOSE、VOLUME 等。所以时间序列不只有每个索引的一个值,而是一个完整的值数组。..

如果我只在相关中使用 CLOSE,我不能保证这些系列的 VOLUME 序列是否也会相似。同样,如果我在相关中使用 VOLUME,我不能保证这些系列的 CLOSE 序列是否也相似。 .所以我需要一个基于某种距离度量的归一化相关公式..类似于a^2 + b^2..如果CLOSE值相似,a^2会很小..如果VOLUME值相似,b^2 会很小.. 现在如果 a^2 + b^2 很小,这意味着 CLOSE 和 VOLUME 都相似..

以前我在做的事情如下:
1.使用CLOSE价格计算相关性。
2.使用VOLUME计算相关性。
3. 将这些值相乘。这将确保高相关值意味着 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 都是一维的。我主要关心的是如何使这些公式适用于多维向量。我希望用它来找到所有价格指标都相似的区域历史..但任何希望关联任何类型的vertors的人都可以使用它..对象的x,y,z坐标等..

【问题讨论】:

  • 相等时加+1,不相等时减-1吗?
  • 这是一道作业题吗?如果是,请添加 [homework] 标签。
  • @matthew.. 不,这不是.. 它是我自过去六个月左右以来一直在做的一个自我强加的个人项目的一部分.. 它涉及确定历史上发生过类似系列的地方目前..并使用该信息来尝试预测接下来的几个数据点..如果需要,我可以提供更多信息..但这会使问题的范围受到限制,因此希望保持一般性以使更多人受益.. =)

标签: c# math correlation


【解决方案1】:

问题并不清楚,但我认为您被要求分别对待每个系列。因此,将只是系列 A 视为来自一对变量 X 和 Y 的样本序列,这两个变量是完全相关的(如果你画了一个散点图,所有的值都将在一条直线上左下角到右上角),所以相关性是 +1。

相比之下,只是将系列 B 视为 X 和 Y 的另一个样本序列,这一次散点图将再次成为从左上角到右下角的直线。增加 X 减少 Y。相关性为 -1。

如果每个系列都包含来自三个变量的样本(例如,随时间变化的三只股票价格的快照),那就更有趣了。这是一个简单的例子:

 X Y Z X Y Z X Y Z X Y Z
系列 C = [0, 0, 0] [1, 1, -1] [2, 2, -2] [3, 3, -3]

在这里,您需要考虑每对变量之间的相关性。在这个简单的例子中,XY之间的相关性是+1,XZ之间的相关性是-1 YZ 之间是-1。

编辑:结合相关性

假设您有来自三个变量的样本 - closehighlow - 两个时间段,并且想知道匹配的好坏这两个时期是。您可以以传统方式计算每个变量的两个时间段之间的相关性。假设这会产生 close-correlation = 0.6、high-correlation = 0.3 和 low-correlation = 0.4。

您需要某种方法将个体相关性组合成拟合优度分数,以使远离零的个体相关性(即高度相关,无论是正相关还是负相关)对分数的贡献比接近零的相关性更大.简单的方法包括乘积 (0.6 * 0.3 * 0.4 = 0.072) 或均方根 (sqrt((0.6^2 + 0.3^2 + 0.4^2) / 3) = 0.4509) - 你必须进行实验以找到能够为您提供最可靠结果的方法。

【讨论】:

  • 你在 matthew 上的表现很不错。这 IS 我正在尝试什么。但我必须考虑所有单个变量的联合影响,而不是单独考虑。 . 例如,如果我只使用相关的 CLOSE 价格,我可以找到一个历史时间序列,其中 CLOSE 价格遵循几乎完全相同的方式.. 但这并不能保证其他重要指标也遵循同样的方式.. 例如 HIGHs 和 LOWs 以及其他市场指标等。所以我也需要一种方法将其纳入相关公式中......
  • 因此,您正在查看两个时间段,并想了解收盘价是否相关高价是否相关 LOW 价格在两者之间是相关的(即,如果历史时期与最新数据非常匹配,那么历史系列中的下一个数据点可能也可以很好地匹配股票的走势做)。大概您正在寻找您能找到的最佳历史匹配。因此,您仍然可以分别计算每个变量的相关性,但您需要一些公式将相关性组合成“拟合优度”?
  • 是的! =)我需要能够将相关性组合成一个单一的值..请查看初始问题的最新编辑..我包含相关性公式,但它们仅适用于一维..我想知道如何将多个维度合并到其中..
  • 嘿,感谢您的编辑.. =).. 我自己也在想同样的思路,但是是的.. 我认为你在相关性的乘法中是对的.. 我自己不久前尝试过,但是仍然没有得到好的结果..做了更多的研究并意识到了错误所在..它在相关公式中是正确的..我在我的后续问题here..中描述了它
【解决方案2】:
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)
}

【讨论】:

  • 我认为需要更多信息 IS.. 我试图使用股票价值时间序列来预测其未来价值.. 这个想法是类似的价格变动会导致类似的行为价格..所以我使用相关性..你将永远在历史上找到完全匹配的..所以如果我们简单地为每个相同的点添加+1,为每个不同的点添加-1,你会得到 -所有历史时间序列的 M 值.. 如果你愿意,我可以提供更多信息.. 但我不相信它像你说的那么简单.. =)
  • 添加了一些关于如何添加允许的方差然后在允许范围内提高相关性分数的更多细节
  • 感谢 mharlin.. 但我认为您稍微误解了这个问题.. =).. pearson 相关性定义如下: stdDevX = Sqrt (Summation ((x - Mean(x))) * (x - 均值 (x)) / N) stdDevY = Sqrt (求和 ((y - 均值 (y)) * (y - 均值 (y)) / N) corrXY = 求和 ((x - 均值 (x) * (y - Mean(y)) / (stdDevX * stdDevY)) / (N - 1) link link 这里 x 和 y 是我想要相互关联的两个系列..但它假设数据系列 (继续)..
  • (续).. 是一维的.. 怎么可能更新这个公式,使其考虑到多维数据.. 希望这次我更清楚.. =)跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-01
  • 2011-05-29
  • 2021-05-23
  • 2015-01-21
  • 1970-01-01
  • 2014-06-15
相关资源
最近更新 更多