python 中 polyfit 的意外结果
Unexpected result with polyfit in python
请允许我先介绍一下问题的背景:
我参加了一个小测验,给了我一个数据集和一个Logistic方程:
然后问那个模型是否可以线性化,如果可以,用线性模型评估a
和k
的值。
我试过这样线性化它:
并编码为 python:
t = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
y = np.array([43.65, 109.86, 187.21, 312.67, 496.58, 707.65, 960.25, 1238.75, 1560, 1824.29, 2199, 2438.89, 2737.71])
yAss = np.log(3000/y - 1)
cof = np.polyfit(t, yAss, deg = 1)
a = math.e**(cof[0]);
k = -cof[1];
yAfter = 3000 / (1 + a*math.e**(-k*t))
sizeScalar = 10
fig = plt.figure(figsize = (sizeScalar*1.1, sizeScalar))
plt.plot(t, y, 'o', markersize = sizeScalar*0.75)
plt.plot(t, yAfter, 'r-')
plt.grid(True)
plt.show()
明白了,这显然是不正确的:
然后巧合的是,我更改了部分代码:
t = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
y = np.array([43.65, 109.86, 187.21, 312.67, 496.58, 707.65, 960.25, 1238.75, 1560, 1824.29, 2199, 2438.89, 2737.71])
yAss = np.log(3000/y - 1)
cof = np.polyfit(t, yAss, deg = 1)
a = math.e**(-cof[1]); #<<<===============here. Before: a = math.e**(cof[0])
k = cof[0]; #<<<==========================and here, Before: k = -cof[1]
temp = 3000 / (1 + a*math.e**(-k*t))
yAfter = []
for itera in temp: #<<<=======================add this
yAfter.append(3000 - itera)
sizeScalar = 10
fig = plt.figure(figsize = (sizeScalar*1.1, sizeScalar))
plt.plot(t, y, 'o', markersize = sizeScalar*0.75)
plt.plot(t, yAfter, 'r-')
plt.grid(True)
plt.show()
并收到似乎正确的序列?
但怎么可能呢?我认为 cof[0] 是 beta,cof1 是 -k
,如果是,我之前的代码应该只是概念错误。但是改变系数的顺序和符号,我得到了一个很合适的结果?!这纯粹是巧合吗?
测验的正确答案可能是什么?
np.polyfit
returns最高学历第一:https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html#numpy.polyfit
使用:
k = -cof[0]
a = exp(cof[1])
此外,您可以使用 NumPy 的指数:
yAfter = 3000/(1+a*np.exp(-k*t)))
请允许我先介绍一下问题的背景:
我参加了一个小测验,给了我一个数据集和一个Logistic方程:
然后问那个模型是否可以线性化,如果可以,用线性模型评估a
和k
的值。
我试过这样线性化它:
t = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
y = np.array([43.65, 109.86, 187.21, 312.67, 496.58, 707.65, 960.25, 1238.75, 1560, 1824.29, 2199, 2438.89, 2737.71])
yAss = np.log(3000/y - 1)
cof = np.polyfit(t, yAss, deg = 1)
a = math.e**(cof[0]);
k = -cof[1];
yAfter = 3000 / (1 + a*math.e**(-k*t))
sizeScalar = 10
fig = plt.figure(figsize = (sizeScalar*1.1, sizeScalar))
plt.plot(t, y, 'o', markersize = sizeScalar*0.75)
plt.plot(t, yAfter, 'r-')
plt.grid(True)
plt.show()
明白了,这显然是不正确的:
t = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12])
y = np.array([43.65, 109.86, 187.21, 312.67, 496.58, 707.65, 960.25, 1238.75, 1560, 1824.29, 2199, 2438.89, 2737.71])
yAss = np.log(3000/y - 1)
cof = np.polyfit(t, yAss, deg = 1)
a = math.e**(-cof[1]); #<<<===============here. Before: a = math.e**(cof[0])
k = cof[0]; #<<<==========================and here, Before: k = -cof[1]
temp = 3000 / (1 + a*math.e**(-k*t))
yAfter = []
for itera in temp: #<<<=======================add this
yAfter.append(3000 - itera)
sizeScalar = 10
fig = plt.figure(figsize = (sizeScalar*1.1, sizeScalar))
plt.plot(t, y, 'o', markersize = sizeScalar*0.75)
plt.plot(t, yAfter, 'r-')
plt.grid(True)
plt.show()
并收到似乎正确的序列?-k
,如果是,我之前的代码应该只是概念错误。但是改变系数的顺序和符号,我得到了一个很合适的结果?!这纯粹是巧合吗?
测验的正确答案可能是什么?
np.polyfit
returns最高学历第一:https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html#numpy.polyfit
使用:
k = -cof[0]
a = exp(cof[1])
此外,您可以使用 NumPy 的指数:
yAfter = 3000/(1+a*np.exp(-k*t)))