我找到了一个线性回归的例子:
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 这可能是关于特殊领域的问题
答案 0 :(得分:3)
我担心你制造缺失值的方式会遇到麻烦:
y=[i*3+5 for i in x]
y.pop(3) #make a missing
你特别想让第3个元素丢失,但现在会发生什么?您应该如何告诉您的脚本实际上,缺少最初的第3个元素?
我建议将您的缺失值标记为np.nan
(前提是它们都是浮点数)。然后,找到缺少的值很容易:
missing = np.isnan(y)
现在,您可以删除x
和A
缺少y
的条目,即 y
为np.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