如何在python中进行线性回归,缺少元素

时间:2012-08-25 13:31:53

标签: python numpy linear-regression

我找到了一个线性回归的例子:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.lstsq.html#numpy.linalg.lstsq

x = np.array([0, 1, 2, 3])
y = np.array([-1, 0.2, 0.9, 2.1])
A = np.vstack([x, np.ones(len(x))]).T
m, c = np.linalg.lstsq(A, y)[0]
print m, c

我的情况是:y的某些元素缺失,因此x和y的长度不同。 它需要一些英特尔来判断哪个位置缺失,所以它。 有手头的方法,还是我应该自己做?

e.g:

x=range(10)
y=[i*3+5 for  i in x]
y.pop(3) #make a missing

我不知道哪个位置丢失了。但是考虑平均值的斜率变化,可能缺少y的位置4 这可能是关于特殊领域的问题

3 个答案:

答案 0 :(得分:3)

我担心你制造缺失值的方式会遇到麻烦:

y=[i*3+5 for  i in x]
y.pop(3) #make a missing

你特别想让第3个元素丢失,但现在会发生什么?您应该如何告诉您的脚本实际上,缺少最初的第3个元素?

我建议将您的缺失值标记为np.nan(前提是它们都是浮点数)。然后,找到缺少的值很容易:

missing = np.isnan(y)

现在,您可以删除xA缺少y的条目, ynp.nan }:

Anew = A[~missing]
ynew = y[~missing]

m, c = np.linalg.lstsq(Anew, ynew)[0]
print m, c

~运算符会将您的True转换为False,反之亦然:您选择y {的条目{1}})

如果您的np.nan实际上是整数,那将无效,因为y仅适用于花车。然后,您可以使用np.nan模块。

np.ma

答案 1 :(得分:1)

我假设您知道哪些x与y的缺失元素相关联。

在这种情况下,你有一个转导学习问题,因为你想估计x的已知位置的y值。

在概率线性回归公式中,学习分布p(y | x),结果表明,转换解决方案与通过回归去除x后没有关联的y得到的答案之间没有差异。

所以答案是 - 只需删除没有关联y的x,并对减少的问题进行线性回归。

答案 2 :(得分:0)

我在下面有一个粗略的解决方案:

def slope(X,Y,i):
    res = (Y[i]-Y[0])*1.0/(X[i]-X[0])
    return res

len_thold=0.2

def notgood(lst1,lst2):
    if len(lst1)<2 or len(lst2)<2:
        return True
    return  False

def adjust_miss(X,Y):
    slope_thold=1.1
    if len(X)==len(Y):
        return
    newlen=min(len(X),len(Y))  
    if len(Y)-len(X)<0:
        aim=X
    else:
        aim=Y
    difflen=abs(len(Y)-len(X))
    roughk=slope(X,Y,newlen-1)
    for i in xrange(1,newlen):
        if difflen==0:
            break
        k=slope(X,Y,i)
        if (len(Y)<len(X) and k>slope_thold*roughk) or (len(Y)>len(X) and k<1.0/(slope_thold*roughk)):
            aim.pop(i)
            difflen-=1
    if difflen>0:
        for i in xrange(difflen):
            aim.pop(-1) 
    assert len(X) == len(Y)

def test_adjust():
    X=range(10)
    Y=range(10)
    Y.pop(3)
    adjust_miss(X,Y)
    print X,Y