如何调整方程系数以获得 y 和 x_i 之间的高相关性



给定一组变量,x的。我想找到这个等式的系数值:

y = a_1*x_1 +... +a_n*x_n + c

a_1,a_2,...,a_n都是未知数。从数据框的角度考虑这一点,我想为数据中的每一行创建y值。

我的问题是:对于y, a_1...a_nc都是未知的,有没有办法让我找到一组a_1,...,a_n corr(y,x_1), corr(y,x_2) .... corr(y,x_n)都大于 0.7 的解。为简单起见,将这里的相关性作为皮尔逊相关性。我知道不会有独特的解决方案。但是,如何为a_1,...,a_n构建一组解决方案来满足此条件呢?

花了一天时间搜索这个想法,但无法从中获取任何信息。欢迎任何解决此问题的编程语言,或者至少为此提供一些参考。

不,这在一般情况下是不可能的。在某些特殊情况下可能是可能的。

给定 x₁, x₂, ...你想要找到 y = a₁x₁ + a₂x₂ + ... + c,以便 y 和 x 之间的所有相关性都大于某个目标 R。由于相关性是

Corr(y, xi) = Cov(y, xi) / Sqrt[ Var(y) * Var(xi) ]

您的约束是

Cov(y, xi) / Sqrt[ Var(y) * Var(xi) ] > R

可以重新排列为

Cov(y, xi)² > R² * Var(y) * Var(xi)

这需要对我所有人来说都是如此。

考虑只有两列 x₁ 和 x₂ 的简单情况,并进一步假设它们都具有均值零(因此您可以忽略常量 c(和方差 1,并且它们不相关。在这种情况下,y = a₁x₁ + a₂x₂,协方差和方差为

Cov(y, x₁) = a₁
Cov(y, x₂) = a₂
Var(x₁)    = 1
Var(x₂)    = 1
Var(y)     = (a₁)² + (a₂)²

所以你需要同时满足

(a₁)² > R² * ((a₁)² + (a₂)²)
(a₂)² > R² * ((a₁)² + (a₂)²)

将这些不平等加在一起,你会得到

(a₁)² + (a₂)² > 2 * R² * ((a₁)² + (a₂)²)

这意味着为了满足这两个不等式,你必须有 R

对于n列(每列的均值为零、方差为 1 和列之间的相关性为零(的更一般情况,您无法同时实现大于 1 / sqrt(n) 的相关性(如 @kazemakase 注释中所述(。

一般来说,自变量越多,y 和 x 之间的相关性就越低。另外(虽然我上面没有提到(x物质之间的相关性。如果它们通常呈正相关,您将能够在 y 和 x 之间实现更高的目标相关性。如果它们通常不相关或负相关,则只能在 y 和 x 之间实现低相关性。

我不是这个领域的专家,所以带着极端的偏见阅读!

  1. 我对你的y有点困惑

    您的y是一个常量,您希望> 0.7它与所有x_i值之间的相关性?我不是数学/统计专家,但我对此的感觉是,只有当x_i,x_j之间的相关性支持相同的条件时,这才能实现。在这种情况下,您可以简单地像这样对x_i进行平均值:

    y=(x_1+x_2+x_3+...+x_n)/n
    

    所以a_i=1.0/nc=0.0 但问题仍然是:

    只有 2 个数字之间有什么相关性?

  2. 更合理的是,如果y是一个依赖于x的函数

    例如像这样:

    y(x) = a_1*(x-x_1)+... +a_n*(x-x_n) + c
    

    或任何其他方程式(在不知道它来自哪里和出于什么目的的情况下很难做出任何等式(。然后,您可以计算两个集合之间的相关性

    X = {   x_1 ,  x_2 ,..., x_n  }
    Y = { y(x_1),y(x_2),...y(x_n) }
    

    在这种情况下,我会尝试近似搜索c,a_i常数以最大化X,Y之间的相关性,但整个事情的结果复杂性将是疯狂的。因此,我只会调整一个常数。当时

    1. 设置一些安全的c,a_1,a_2,...常量
    2. 调整a_1

      因此,计算(a_1-delta)(a_1+delta)的相关性,然后选择有利于相关性的方向。 然后继续朝那个方向前进,直到相关系数开始下降。

      然后,您可以使用较小的增量再次递归到此。顺便说一句,这正是我的approx类从上面的链接中所做的。

    3. 循环 #2 贯穿所有a_i

    4. 循环几次以提高精度

    也许您可以在每次运行后计算c,以最小化X,Y集之间的距离。

最新更新