我想對 x 和 y 給出的資料進行線性回歸。當我使用線性圖時,一切似乎都很好,但是當我想以對數比例繪制它時,這條線看起來并不直。我想我應該把間隔分成更細的網格,而不是只有六個點。但我不能那樣做。
如何為以下腳本在對數刻度上進行線擬合?
import numpy as np
import matplotlib.pyplot as plt
x = np.array([1560., 526., 408., 226., 448., 288.])
y = np.array([0.118, 0.124, 0.131, 0.160, 0.129, 0.138])
f = np.multiply(x,y**2)
coefs = np.polyfit(x, f, 1)
pred_f = coefs[1] np.multiply(sorted(x), coefs[0])
fig, ax1 = plt.subplots(1, 1, figsize=(8,6))
ax1.scatter(x, f)
ax1.plot(sorted(x), pred_f, 'k--')
ax1.set_xscale('log')
ax1.set_yscale('log')
plt.show()
先感謝您。
uj5u.com熱心網友回復:
事實上,“直線”(線性函式)在對數圖上看起來并不直:
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0.1, 10)
y = 2*x 3 # LINEAR!
plt.plot(x, y)
plt.xscale('log')
plt.yscale('log')
plt.show()
結果:

要適應對數刻度,請對原始資料的對數進行回歸:
coefs = np.polyfit(np.log(x), np.log(f), 1)
# Now work with logarithms everywhere!
pred_f = coefs[1] np.multiply(sorted(np.log(x)), coefs[0])
fig, ax1 = plt.subplots(1, 1, figsize=(8,6))
ax1.scatter(np.log(x), np.log(f)) # logs here too!
ax1.plot(sorted(np.log(x)), pred_f, 'k--') # pred_f is already in logs
plt.show()
陰謀:

或者讓 Matplotlib 繪制日志刻度。然后,您需要取冪pred_f以將其置于與資料相同的比例:
fig, ax1 = plt.subplots(1, 1, figsize=(8,6))
ax1.scatter(x, f) # original scale!
ax1.plot(sorted(x), np.exp(pred_f), 'k--') # exponentiate pred_f
ax1.set_xscale('log')
ax1.set_yscale('log')
plt.show()
該圖是相同的,但它現在使用資料的原始比例:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/433200.html
標籤:Python 麻木的 matplotlib
