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

具体的には3番目の要素を欠落させたいのですが、今はどうなりますか?実際、最初の3番目の要素が欠落していることをスクリプトにどのように伝える必要がありますか?

欠落している値にフラグを立てることをお勧めしますnp.nan(もちろん、すべてが浮動小数点である場合)。次に、不足している値を見つけるのは簡単です。

missing = np.isnan(y)

これで、のエントリxと欠落しているA場所、つまり、次の場所を削除できます。yynp.nan

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

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

~演算子はあなたのTrueasFalseを変換し、その逆も同様です:あなたyはそうでない np.nanエントリを選択しています)

あなたが実際に整数である場合、floatの場合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 に答える