在双对数图上绘制最佳拟合直线。

3

我有一些数据,已经在对数-对数图中绘制出来,现在我想通过这些点拟合一条直线。我已经尝试了各种方法,但是无法得到我想要的结果。以下是示例代码:

import numpy as np
import matplotlib.pyplot as plt
import random

x= np.linspace(1,100,10)
y = np.log10(x)+np.log10(np.random.uniform(0,10))
coefficients = np.polyfit(np.log10(x),np.log10(y),1)
polynomial=np.poly1d(coefficients)
y_fit = polynomial(y)
plt.plot(x,y,'o')
plt.plot(x,y_fit,'-')
plt.yscale('log')
plt.xscale('log')

这使我得到了一条理想的“直线”,在对数-对数图上通过一个随机数进行偏移,然后拟合一个1D多项式。输出结果如下: enter image description here 因此,忽略掉可以处理的偏移量,它并不完全符合我的要求,因为它基本上绘制了每个点之间的直线,然后将它们连接起来,而我需要一条穿过它们中间的“最佳拟合线”,以便我可以测量其斜率。
如何才能达到最佳效果?
1个回答

1
一个问题是:
y_fit = polynomial(y)

要得到y_fit,您必须插入x值而不是y

此外,您要使用log10(x)拟合log10(y),因此要评估线性插值器,您必须插入log10(x),结果将是y值的以10为底的对数。

这是您脚本的修改版本,接下来是它生成的图表。

import numpy as np
import matplotlib.pyplot as plt
import random


x = np.linspace(1,100,10)
y = np.log10(x) + np.log10(np.random.uniform(0,10))

coefficients = np.polyfit(np.log10(x), np.log10(y), 1)
polynomial = np.poly1d(coefficients)
log10_y_fit = polynomial(np.log10(x))  # <-- Changed

plt.plot(x, y, 'o-')
plt.plot(x, 10**log10_y_fit, '*-')     # <-- Changed
plt.yscale('log')
plt.xscale('log')

plot


这看起来就是我想要的东西,但当我尝试时它并没有像这样工作。这是我所拥有的 -链接,这是结果- 链接。它看起来与你的非常相似,或者我错过了一些显而易见的东西吗?谢谢。 - BloodSexMagik
在那段代码中,你要绘制 10**np.log10(y_fit)。不要对 y_fitlog10,只需绘制 10**y_fit - Warren Weckesser
嗨,那仍然没有完全输出您得到的内容-我只是更改了它,所以我没有带上 y_fitlog10,只是用 10 ** y_fit 替换 - 我得到了 link。您的答案对我来说很有道理:将多项式拟合为 x/y 的 log10 值,然后将其拟合为 log10x 并绘制它。但我不确定为什么在最终绘制时要使用 10**,我也不确定为什么我的输出结果与您的不同! - BloodSexMagik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接