[英]Fitting a dataset with a straight line using polyfit on a log-log plot
[英]Plot straight line of best fit on log-log 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),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')
這給了我一個理想的“直線”在log log偏移線上的一個隨機數,然后我擬合了1d poly。 輸出是:
因此忽略我可以處理的偏移量,它不是我需要的,因為它基本上繪制了每個點之間的直線然后將它們連接起來,而我需要在它們中間的“最佳擬合線”所以我可以測量它的梯度。
實現這一目標的最佳方法是什么?
一個問題是
y_fit = polynomial(y)
你必須插入x
值,而不是y
,才能獲得y_fit
。
另外,使用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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.