2016-11-10 110 views
0

例如,這裏是一個數據集:在python中,如何在指定的x值範圍內將線性斜率擬合到圖形中?

X:1,2,3,4,5,6,7,8,9,10

Y:20,21,22,26, 32,41,39,36,29,23

我想我應該使用numpy polyfit函數,但不能確定。 例如,我如何獲得x(3)x(6)之間的線性擬合?

就在我的頭上來計算,這應該是這樣的:rise/run = (41-22)/(6-3) = 6.3333333...

我處理不同的數據每次我讀爲.txt文件時間設置,所以我會很感激,如果有人給我看了一般方法來做到這一點,然後我可以應用於所有未來的數據集。

回答

1

我假設你想要一個最小二乘擬合,這是polyfit會給你的。

爲了實現這一點,您只需將兩個列表傳遞給polyfit,x值和y值,並且必須設置所需多項式的階數。因此,對於你的榜樣,這會變成是

import numpy as np 

x = [3, 6] 
y = [22, 41] 
coeffs = np.polyfit(x, y, 1) 

# get the y values of the resulting line 
x = np.arange(1,11) 
y_line = x * coeffs[0] + coeffs[1] 

關於你的其他問題,您需要考慮polyfit的輸出。

numpy.polyfit文檔說

的解決方案最小化的平方誤差

E = \ sum_ {J = 0}^K | P(x_j) - y_j |^2

在等式:

X [0] ** N * p [0] + ... + X [0] * p [N-1] + p [N] = Y [0]

x 1 ** N * P [0] + ... + X 1 * P [N-1] + P [N] = Y 1

...

X [k]的** N * p [0] + ... + x [k] * p [n-1] + p [n] = y [k]

我們使用了一個非常簡單的情況,線,我們有一階多項式,即n=1

這意味着在我們的例子中,y的公式僅僅是y[k] = x[k]*p[0]+p[1]。將其與行方程y = k*x+d的一般形式進行比較。你會看到你的線的斜率只是coeffs[0]

至於繪圖,請看下面的例子

import numpy as np 
from matplotlib import pyplot as plt 

x = np.arange(1, 11) 
y = [20, 21, 22, 26, 32, 41, 39, 36, 29, 23] 

poly = np.polyfit(x, y, 1) 

y_line = x * poly[0] + poly[1] 

print poly[0] 

plt.scatter(x, y) 
plt.plot(x, y_line) 
plt.show() 

導致輸出

$ python test.py 
1.21818181818 

enter image description here

+0

是有道理的,但我怎麼然後繪製線(得到它出現在我的圖上)以及顯示線的斜率? – nikhar

+0

@nikhar在你的問題中包括這個會有些好處,不是嗎?我已經相應地更新了我的答案。 – sobek

+0

@nikhar如果這符合你的問題,請隨時接受我的答案。 – sobek