Python 在对数图上绘制最佳拟合直线
有一些我在对数图上绘制的数据,现在我想拟合一条穿过这些点的直线。我试过各种各样的方法,但都找不到我想要的。示例代码:Python 在对数图上绘制最佳拟合直线,python,numpy,matplotlib,plot,Python,Numpy,Matplotlib,Plot,有一些我在对数图上绘制的数据,现在我想拟合一条穿过这些点的直线。我试过各种各样的方法,但都找不到我想要的。示例代码: 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),
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')
这给了我一条理想的“直线”,在对数偏移量的基础上加上一个随机数,然后拟合出一个一维多边形。输出为:
所以忽略偏移量,我可以处理,它不是我所需要的,因为它基本上在每个点之间画了一条直线,然后把它们连接起来,而我需要一条穿过它们中间的“最佳拟合线”,这样我就可以测量它的梯度
实现这一目标的最佳方法是什么?一个问题是
y_fit = polynomial(y)
您必须插入x
值,而不是y
,才能获得y\u拟合
此外,您将log10(y)
与log10(x)
进行拟合,因此要计算线性插值器,您必须插入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')
将numpy导入为np
将matplotlib.pyplot作为plt导入
随机输入
x=np.linspace(1100,10)
y=np.log10(x)+np.log10(np.random.uniform(0,10))
系数=np.多元拟合(np.对数10(x),np.对数10(y),1)
多项式=np.poly1d(系数)
log10_y_fit=多项式(np.log10(x))#这看起来正是我想要的,只是当我尝试它时,它不是这样工作的?这就是我所拥有的,这就是结果。它看起来和你的很像,还是我遗漏了一些明显的东西?谢谢。在该代码中,您可以绘制10**np.log10(y\u-fit)
。不要使用y_fit
的log10
;只需绘制10**y_-fit
。嗨,这还没有完全输出您得到的结果-我只是更改了它,所以我没有使用y_-fit
的log10
,而是10**y_-fit
,我得到了。你的答案对我来说很有意义:将一个多项式拟合到x/y的log10值,然后将其拟合到log10x并绘制它。我不太清楚你为什么要在最后策划它的时候把它拍下来?我也不知道为什么我的输出和你的不一样!