【问题标题】:Python - Scipy linear regression with nan valuesPython - 具有 nan 值的 Scipy 线性回归
【发布时间】:2016-07-18 01:53:50
【问题描述】:

我想获得我的数据的线性回归的斜率,但是 Y 包含一些 nan 值......因此它扰乱了 linregress 函数...... 例如:

from scipy import stats
import numpy as np

X = np.array([0,1,2,3,4,5])
Y = np.array([np.NaN,4, 5, 10, 2, 5])
stats.linregress(X,Y)

但是,我得到 : (nan, nan, nan, nan, nan) 因此,我尝试屏蔽无效值,如您所见:

import numpy.ma as ma
stats.linregress((X),ma.masked_invalid(Y))

但它是一样的......我不明白我必须做什么......

【问题讨论】:

    标签: python scipy linear-regression


    【解决方案1】:

    要删除 y 为 naninf 的 (x, y) 对,您可以这样做:

    finiteYmask = np.isfinite(Y)
    Yclean = Y[finiteYmask]
    Xclean = X[finiteYmask]
    

    如果您只为linregress 使用这些“清理过的”数组,您可以这样做:

    finiteYmask = np.isfinite(Y)
    

    然后拨打linregress(X[finiteYmask], Y[finiteYmask])

    【讨论】:

    • 一个建议:如果将掩码更改为np.isfinite([X, Y]).all(axis=0),它也可以处理X数组中的nan值。
    • @ayhan 这也有助于屏蔽 xNaNinf 但不是 y 的实例;对吗?
    • @Dataman 是的,通过使用.all(),您强制 x 和 y 都是有限的。
    【解决方案2】:

    尝试以下方法:

    Y=Y[np.logical_not(np.isnan(Y))]
    X=X[np.logical_not(np.isnan(Y))]
    

    更新:正如 Warren 所注意到的,Y 将被更新,所以 nans 消失了。您可以将Y[np.logical_not(np.isnan(Y))]X=X[np.logical_not(np.isnan(Y))] 直接输入线性回归。或者通过np.isfinite查看沃伦的回答

    【讨论】:

    • 感谢您的帮助,但我想我也有无限的数字会激怒 nan……这种情况下有相同的功能吗?
    • 该解决方案存在问题。第一行改变了Y,所以它不再有任何nans。那么,在第二行中,np.logical_not(np.isnan(Y)) 永远都是 True 值,如果原来Y 中有nan,那么布尔数组的长度会小于X 的长度,所以它将简单地丢弃 X 末尾的值。用问题中给出的例子进行测试,你会发现它并没有达到你想要的效果。
    • 没错,但你明白了,你可以将Y[np.logical_not(np.isnan(Y))]X[np.logical_not(np.isnan(Y))] 输入线性回归。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    相关资源
    最近更新 更多