使用Python进行线性回归

时间:2018-02-13 11:44:01

标签: python python-3.x machine-learning linear-regression web-traffic

我正在研究“用Python构建机器学习系统(第二版)”。 我在第一章的回答部分有一个愚蠢的疑问。 根据这本书,根据我的观察,我总是得到二阶多项式作为最佳拟合曲线。 每当我使用训练数据集训练我的系统时,我会得到不同的多项式函数的不同测试误差。 因此,我的方程参数也不同。 但令人惊讶的是,我每次都在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 个答案:

答案 0 :(得分:0)

不要那样做。 线性回归比您想像的更“取决于您”。

首先获取直线的斜率(#1)平均值((f(x2)-f(x))/(x2-x))

然后将该答案用作M来表示(#2)平均值(f(x)-M * x)。

现在您将(#1)和(#2)作为回归。

对于类似于此多项式(例如多项式)的任何回归类型

您需要通过将f(x)的n个超增量与delta(x)一起使用来减去A因子(第一因子)。例如delta(ax ^ 2 + bx + c)/ delta(x)为您提供一个带有a和b的方程,从那里开始。这样做时,如果有更多条目,则每次取平均值。做起来就像滑落在纸上的窗户一样。例如您选择条目1-10,然后选择2-11、3-12,以进行一些疯狂的令人敬畏的回归。您可能要创建一个矩阵API。处理它的最佳方法是,首先创建一个API,该API首先删除一行和一列。然后,您到处游玩以使其自动化。仅剩下2列的进出条目的比率是平均值,是系数的解。然后制作一个程序以取出行,但是例如保留第1行和第5行(输出),然后保留第2行,第5行...第4行和第5行。我不建议使用python对此进行编码。我建议使用C编程,因为它可以防止创建不记得的脏数组。系统理论,您需要了解。您必须逐个系统地创建。没有建立经过仔细测试的自动化子系统,对矩阵进行编码是很疯狂的。直到我在C中进行了工作,我才失败,所以我已经做了一个经过仔细测试的1倍收缩函数,然后构建了自动获得1系数的系统,对其进行了测试,然后自动执行该程序的重​​复来解决该问题。您将无法使用python或类似的快捷方式来理解这些内容。在意识到它们的真正含义之后,便可以使用它们。这就是我学到的。我仍然喜欢如何编码?我仍然很惊讶。问题是,在4x4(实际上是4x5)矩阵之上,它是不稳定的。

祝你好运, 米莎·泰勒(Misha Taylor)