代码之家  ›  专栏  ›  技术社区  ›  Abdennacer Lachiheb

Python numpy。corrcoef()运行时警告:true\u divide c/=stddev[:,None]中遇到无效值

  •  19
  • Abdennacer Lachiheb  · 技术社区  · 7 年前

    看来 corrcoef 从…起 numpy 运行时警告 当常量列表传递给 corrcoef() 函数,例如,下面的代码抛出警告:

    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]
    

    有谁能解释一下,当其中一个列表是常数时,为什么会抛出这个错误,以及当一个常数列表传递给函数时,如何防止这个错误。

    2 回复  |  直到 7 年前
        1
  •  30
  •   andrew_reece    7 年前

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

    如OP评论所述 formula 对于皮尔逊积矩,相关系数除以 X Y Y 在您的示例中方差为零,其标准差也为零。这就是为什么你得到 true_divide

    注意:从工程的角度来看,简单地在中的一个条目上添加一个非常小的量(例如,刚好高于机器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
  •  1
  •   EHadavi    2 年前

    import pandas as pd
    X = [1.0, 2.0, 3.0, 4.0]
    Y = [2, 2, 2, 2]
    print(pd.Series(X).corr( pd.Series(Y)))
    

    如果你想坚持numpy,那么你可以使用If语句检查序列的标准偏差,并且只有当它们大于零时才进行相关。显然,在这里我们没有有效的输出,因为一个列表没有变化,但这个概念可以应用于其他情况。

    import numpy as np
    X = [1.0, 2.0, 3.0, 4.0]
    Y = [2, 2, 2, 2]
    if np.std(Y)==0 or np.std(X)==0 :
        print ('The correlation could not be computed because the standard deviation of one of the series is equal to zero')
    else:
        print(np.corrcoef(X, Y)[0, 1])