假设我有一些数据,并且可以使用scipy.stats.linregress计算斜率 例如:
import numpy as np
from scipy import stats
data = np.array([1, 2, 3, -1, -2, -7, -8, 6, 11])
x = np.arange(len(data))
slope = stats.linregress(x, data)[:1]
如您所见,我可以得到线性回归的斜率; 但我想在数据上附加一个x值,使斜率等于零 我怎么解决这个x?谢谢
答案 0 :(得分:1)
假设您打算执行以下操作:
import numpy as np
from spicy import stats
y = np.array([1,2,3,-1,-2,-7,-8,6,11])
x = np.array(range(0,len(y)))
slope = stats.linregress(x,y).slope
对于上述设置,您想向y
附加一个值并将x
修改为新的np.array(range(0,len(y)))
,以使回归的新斜率等于到0
。这样,数学实际上非常简单,可以计算出要附加到y
上的附加数字。
对上面链接中提供的斜率(b
)使用公式,并执行以下操作:
n
替换为(n+1)
(n+1)
添加到sum(x)
i
添加到sum(y)
(n+1)i
添加到sum(x*y)
一旦完成,就求解i
的方程式,您将得到计算值所需的方程式。它在起作用:
In [1]: import numpy as np
...: from scipy import stats
In [2]: y = data = np.array([1,2,3,-1,-2,-7,-8,6,11])
In [3]: x = np.array(range(0,len(data)))
In [4]: n = len(data)
In [5]: slope = stats.linregress(x,y).slope
In [6]: slope
Out[6]: 0.4
In [11]: def append_computer(x,y):
...: n = len(x)
...: m = n+1
...: if ((m**2) - sum(x) - m) > 0:
...: num = (-1*m*(sum(x*y))+(sum(x)*sum(y))+m*sum(y))/((m**2) - sum(x) - m)
...: return num
...: else:
...: raise ValueError(f"Solution not possible")
In [12]: stats.linregress(np.append(x,n+1), np.append(y,append_computer(x,y))).slope
Out[12]: 0.0