【问题标题】:Python numpy.corrcoef() RuntimeWarning: invalid value encountered in true_divide c /= stddev[:, None]Python numpy.corrcoef() RuntimeWarning: true_divide c /= stddev[:, None] 中遇到无效值
【发布时间】:2018-02-04 10:12:03
【问题描述】:

当常量列表传递给corrcoef() 函数时,numpy 中的corrcoef 似乎会抛出 RuntimeWarning,例如下面的代码会抛出警告:

import numpy as np
X = [1.0, 2.0, 3.0, 4.0]
Y = [2, 2, 2, 2]
print(np.corrcoef(X, Y)[0, 1])

警告:

/usr/local/lib/python3.6/site-packages/numpy/lib/function_base.py:3003: RuntimeWarning: invalid value encountered in true_divide
  c /= stddev[:, None]

谁能解释为什么当其中一个列表为常量时会引发此错误,以及当将常量列表传递给函数时如何防止此错误。

【问题讨论】:

  • 这个错误可能是因为常量列表Y的标准差(stddev)是0。我不确定计算某事物相对于恒定事物的协方差是否有意义......
  • @JoshKarpel 所以常量变量的协方差是未定义的?
  • quick Google(协方差规则 #4)表示随机变量相对于常数的协方差为零。所以它不是未定义的,但任何计算协方差的算法都可能假设它不会为零。

标签: python numpy correlation


【解决方案1】:

相关性是衡量两个向量在变化时相互跟踪的程度。当一个向量不变时,您无法跟踪相互的变化。

如 OP cmets 中所述,Pearson 积矩相关系数的formulaXY 的协方差除以它们的标准差的乘积。由于Y 在您的示例中方差为零,因此其标准差也为零。这就是您收到 true_divide 错误的原因 - 您正在尝试除以零。

注意:从工程的角度来看,在Y 中的一个条目上简单地添加一个非常小的数量(例如,一个略高于机器 epsilon 的值)似乎很诱人,以绕过零-分工问题。但这在统计上是不可行的。即使添加1e-15 也会严重破坏您的相关系数,具体取决于您将其添加到哪个值。

考虑这两种情况的区别:

X = [1.0, 2.0, 3.0, 4.0]

tiny = 1e-15

# add tiny amount to second element
Y1 = [2., 2.+tiny, 2., 2.]
np.corrcoef(X, Y1)[0, 1] 
-0.22360679775

# add tiny amount to fourth element
Y2 = [2., 2., 2., 2.+tiny]
np.corrcoef(X, Y2)[0, 1]
0.67082039325

这对统计学家来说可能是显而易见的,但考虑到问题的性质,这似乎是一个相关的警告。

【讨论】:

    【解决方案2】:

    这是我尝试过的;使用 if 语句,您可以检查系列的标准偏差并仅在它们大于零时进行相关性

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    • 请尽量避免发布多个问题的“相同”答案,如here
    • 那么问题重复出现的解决方法是什么?需要或能够合并问题的答案相似。
    猜你喜欢
    • 2020-11-11
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-10
    • 1970-01-01
    • 2015-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多