3

我找到了一个线性回归的例子: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 的长度不同。它需要一些英特尔来判断缺少哪个位置,所以 rm 它。手头有方法吗,还是我应该自己做?

例如:

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

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

4

3 回答 3

4

恐怕您在制作缺失值的方式上会遇到麻烦:

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

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

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

missing = np.isnan(y)

现在,您可以删除缺少的条目x和缺少的位置,Awhere is :yynp.nan

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

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

~操作员转换您的TrueasFalse反之亦然:您选择的条目ynot np.nan

如果您y实际上是整数,那将不起作用,np.nan仅适用于浮点数。然后,您可以使用该np.ma模块。

my = np.ma.masked_array(y)
my[3] = np.ma.masked

Anew = A[~my.mask]
ynew = my.compressed()

m, c = np.linalg.lstsq(Anew, ynew)[0]
print m, c
于 2012-08-26T14:18:50.143 回答
1

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

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

在概率线性回归公式中,学习分布 p(y|x),事实证明,在去除没有关联 y 的 x 之后,仅通过运行回归得到的答案与转换解决方案之间没有区别。

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

于 2012-08-26T00:41:42.143 回答
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
于 2012-08-25T14:35:33.177 回答