簡體   English   中英

使用 Python 進行線性回歸

[英]Linear regression with Python

我正在學習“使用 Python 構建機器學習系統(第 2 次)”。 我在第一章的回答部分有一個愚蠢的疑問。 根據這本書和我的觀察,我總是得到二階多項式作為最佳擬合曲線。 每當我用訓練數據集訓練我的系統時,不同的多項式函數都會得到不同的測試誤差。 因此,我的方程參數也不同。 但令人驚訝的是,我每次都在 9.19-9.99 范圍內得到大致相同的答案。 我的最終假設函數每次都有不同的參數,但我得到的答案大致相同。 誰能告訴我背后的原因? [僅供參考:我正在尋找 y=100000 的答案] 我正在分享代碼示例和每次迭代的輸出。

以下是錯誤和相應的答案:

提前致謝!

def error(f, x, y):
    return sp.sum((f(x)-y)**2)
import scipy as sp
import matplotlib.pyplot as mp
data=sp.genfromtxt("web_traffic.tsv",delimiter="\t")
x=data[:,0]
y=data[:,1]
x=x[~sp.isnan(y)]
y=y[~sp.isnan(y)]
mp.scatter(x,y,s=10)
mp.title("web traffic over the month")
mp.xlabel("week")
mp.ylabel("hits/hour")
mp.xticks([w*24*7 for w in range(10)],["week %i"%i for i in range(10)])
mp.autoscale(enable=True,tight=True)
mp.grid(color='b',linestyle='-',linewidth=1)
mp.show()
infletion=int(3.5*7*24)
xa=x[infletion:]
ya=y[infletion:]
f1=sp.poly1d(sp.polyfit(xa,ya,1))
f2=sp.poly1d(sp.polyfit(xa,ya,2))
f3=sp.poly1d(sp.polyfit(xa,ya,3))
print(error(f1,xa,ya))
print(error(f2,xa,ya))
print(error(f3,xa,ya))
fx=sp.linspace(0,xa[-1],1000)
mp.plot(fx,f1(fx),linewidth=1)
mp.plot(fx,f2(fx),linewidth=2)
mp.plot(fx,f3(fx),linewidth=3)
frac=0.3
partition=int(frac*len(xa))
shuffled=sp.random.permutation(list(range(len(xa))))
test=sorted(shuffled[:partition])
train=sorted(shuffled[partition:])
fbt1=sp.poly1d(sp.polyfit(xa[train],ya[train],1))
fbt2=sp.poly1d(sp.polyfit(xa[train],ya[train],2))
fbt3=sp.poly1d(sp.polyfit(xa[train],ya[train],3))
fbt4=sp.poly1d(sp.polyfit(xa[train],ya[train],4))
print ("error in fbt1:%f"%error(fbt1,xa[test],ya[test]))
print ("error in fbt2:%f"%error(fbt2,xa[test],ya[test]))
print ("error in fbt3:%f"%error(fbt3,xa[test],ya[test]))
from scipy.optimize import fsolve
print (fbt2)
print (fbt2-100000)
maxreach=fsolve(fbt2-100000,x0=800)/(7*24)
print ("ans:%f"%maxreach)

不要那樣做。 線性回歸比您想象的更“由您決定”。

首先獲取直線的斜率,(#1) average((f(x2)-f(x))/(x2-x))

然后將該答案用作 M to (#2) average(f(x)-M*x)。

現在你有 (#1) 和 (#2) 作為你的回歸。

對於任何類似於這個例子的回歸,多項式,

您需要通過使用 f(x) 的 n 個超 delta 減去 A 因子(第一因子),其中每個都與 delta(x) 有關。 例如。 delta(ax^2+bx+c)/delta(x) 給你一個帶有 a 和 b 的方程,然后它就可以工作了。 這樣做時,如果有更多條目,則每次取平均值。 像紙上的窗戶滑下來一樣去做。 例如。 您選擇條目 1-10,然后是 2-11,3-12 等以進行一些瘋狂的令人敬畏的回歸。 您可能想要創建一個矩陣 API。 處理它的最佳方法是首先創建一個 API,首先取出一行和一列。 然后你就用它來自動化它。 僅保留 2 列的輸入輸出條目的比率取平均值並且是系數的解。 然后制作一個程序來取出行,但例如保留第 1 行和第 5 行(輸出),然后是第 2 行、第 5 行...第 4 行和第 5 行。我不建議使用 python 進行編碼。 我推薦 C 編程,因為它可以防止你創建你不記得的臟數組。 您需要了解的系統理論。 您必須逐個系統地創建。 在沒有構建經過仔細測試的自動化子系統的情況下對矩陣進行編碼是很瘋狂的。 我失敗了,直到我用 C 語言處理它,所以我已經做了一個經過仔細測試的 1 倍收縮函數,然后構建系統來自動獲取 1 個系數,測試它,然后自動重復該程序來解決它。 使用 python 或類似的快捷方式,你不會理解這些。 在您了解它們的真正含義后使用它們。 我就是這樣學習的。 我仍然喜歡我是如何編碼的? 我還是很驚訝。 但問題是,它在 4x4(實際上是 4x5)矩陣之上不穩定。

祝你好運,米莎泰勒

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM