我想找出最适合给定数据的方法。我所做的是循环遍历n的各种值,并使用公式(y_-fit-y_-actual)/y_-actual)x 100计算每个p的残差。然后我计算每个n的平均值,然后找到最小剩余平均值和相应的n值,并使用该值进行拟合。可复制代码包括:
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
x = np.array([12.4, 18.2, 20.3, 22.9, 27.7, 35.5, 53.9])
y = np.array([1, 50, 60, 70, 80, 90, 100])
y_residual = np.empty(shape=(1, len(y)))
residual_mean = []
n = np.arange(0.01, 10, 0.01)
def fit(x, a, b):
return a * x + b
for i in range (len(n)):
x_fit = 1 / np.log(x) ** n[i]
y_fit = y
fit_a, fit_b = optimize.curve_fit(fit, x_fit, y_fit)[0]
y_fit = (fit_a * x_fit) + fit_b
y_residual = (abs(y_fit - y) / y) * 100
residual_mean = np.append(residual_mean, np.mean(y_residual[np.isfinite(y_residual)]))
p = n[np.where(residual_mean == residual_mean.min())]
p = p[0]
print p
x_fit = 1 / np.log(x) ** p
y_fit = y
fit_a, fit_b = optimize.curve_fit(fit, x_fit, y_fit)[0]
y_fit = (fit_a * x_fit) + fit_b
y_residual = (abs(y_fit - y) / y) * 100
fig = plt.figure(1, figsize=(5, 5))
fig.clf()
plot = plt.subplot(111)
plot.plot(x, y, linestyle = '', marker='^')
plot.plot(x, y_fit, linestyle = ':')
plot.set_ylabel('y')
plot.set_xlabel('x')
plt.show()
fig_1 = plt.figure(2, figsize=(5, 5))
fig_1.clf()
plot_1 = plt.subplot(111)
plot_1.plot(1 / np.log(x) ** p, y, linestyle = '-')
plot_1.set_xlabel('pow(x, -p)' )
plot_1.set_ylabel('y' )
plt.show()
fig_2 = plt.figure(2, figsize=(5, 5))
fig_2.clf()
plot_2 = plt.subplot(111)
plot_2.plot(n, residual_mean, linestyle = '-')
plot_2.set_xlabel('n' )
plot_2.set_ylabel('Residual mean')
plt.show()
用n绘制剩余平均值,这就是我得到的:
我需要知道这个方法是否正确,以确定最适合。如果可以用SciPy或任何其他包中的其他函数来实现的话。实质上,我想要的是从数量上知道哪一个最合适。我已经通过了Goodness of fit tests in SciPy但没什么帮助。
可能最常用的拟合优度度量是coefficient of determination(也称为R2值)。
公式是:
其中:
这里,yi表示输入的y值,fi表示拟合的y值,表示平均输入的y值。
很容易计算:
相关问题 更多 >
编程相关推荐