import numpy as np
import matplotlib.pyplot as plt
x_ = np.array([1.0, 2.0, 4.0, 8.0, 16.0, 33.0])
y_ = np.array([0.4, 0.55, 0.62, 0.72, 0.76, 0.8])
我想要拟合y = x ** a
形式的回归模型,其中估算出a
。
目的是推断(更多)更大,看不见的x
值。
NB:我需要强迫我的模型通过
(0, 0)
。
不确定这是否是最好的方法,但到目前为止,我试图将其视为找到最适合log(y) / log(x)
的常量。我有:
x_ = np.array([1.0, 2.0, 4.0, 8.0, 16.0, 33.0])
logx_ = np.log(x_)
y_ = np.array([0.4, 0.55, 0.62, 0.72, 0.76, 0.8])
logy_ = np.log(y_)
y = logy_ / logx_
x = x_
print "y: ", y
z = np.polyfit(x, y, 0)
print "param estimates: ", z
p = np.poly1d(z)
p30 = np.poly1d(np.polyfit(x, y, 30))
xp = np.linspace(0, 35, 6)
_ = plt.plot(x, np.exp(y*np.log(x)), '.', xp, np.exp(p(xp)*np.log(x)), '-')
plt.ylim(0,1.0)
plt.show()
但它似乎并没有起作用。 有人可以解释我做错了什么,并提供答案吗?
答案 0 :(得分:2)
使用:
log(y+1) = a * log(x+1)
通过(0, 0)
f = lambda x, a: (x + 1) ** a - 1
x = np.random.rand(200, 1) * 100
y = f(x, 1.5) + np.random.rand(*x.shape) * 200
plt.plot(x, y, '.')
log_x_plus_1 = np.log(x + 1)
log_y_plus_1 = np.log(y + 1)
a = np.linalg.pinv(log_x_plus_1.T.dot(log_x_plus_1)).dot(log_x_plus_1.T).dot(log_y_plus_1)[0][0]
plt.plot(x, y, '.')
plt.plot(x, f(x, a), 'r.')
答案 1 :(得分:2)
这符合y = x ** a
上的最小正方形的纯logy_ = a * logx_
:
a = np.linalg.lstsq(logx_[:, np.newaxis], logy_)[0][0]