3、我们第一个(极小的)机器学习应用【画一条直线】

画一条怎样的线?

在回答这个问题之前我们必须要了解另外两个问题:

1.为什么要画这条直线?
2.这条直线要具备怎样的特征?

  其实这两个问题并不好回答,因为这必然会牵扯到机器学习的理论方面,我真的不想扯那么远(其实我不是很懂怕说错了),只从我们现在要处理的这个实际问题问题——“网站每小时的访问量”入手。

  我们要解决的实际问题是:根据现有的访问量变化趋势,来预测未来访问量的变化,看是否会超出现有设备的承受范围,给出时间点,以便网站方能够做好应对方案。

  可以说——总结规律,预测未来——就是我们要做的,其中总结规律也可以说是寻找模型

  最好的模型是什么呢?最好的模型就是能够精确的说出今后的每小时的访问量是多少,这是不可能的,因为有y和x之间并没有必然的逻辑关系,我们要做的就是试图用一种逻辑关系去“解释”y和x之间的关系,当然就不能胡乱给一个函数模型,评判模型好坏的标准,就是看:归纳出来的值与实际值的差(f(x)-y),虽然不能相等,但差值要尽量小才行,用程序表达就是:

1 def error(f,x,y):
2     return sp.sum((f(x)-y)**2)

  留意一下,为什么定义为errer,因为模型与实际值的差的本质就是一个错误——你没有预测正确,与实际值产生误差了;另外为什么用差的平方求和表示,因为误差有正有负,其实取绝对值也可以。

  而现在我们要画的直线就是我们寻找的模型。(其实鬼都知道,这条直线肯定是不行的,不过没有关系先从一维模型开始)


 好了,开始划线了

 f1(x)=ax+b

我们的思路就是,先找到参数(parameters)a,b,再将其带入到上述函数式当中,得到模型 f1 ,然后利用Matplotlib画出该直线。

1.确定参数fp1=[a,b]

  手动一个个的尝试肯定是不行的了。需要用到scipy里面的一个函数——polyfit(),此函数可以从数据丛中快速找到差值最小的模型的参数。

1 fp1=sp.polyfit(x,y,1)

  一句话就可以了,print一下fp1,得到参数列表[2.59619213,989.02487106],即f1(x)=2.59619213x+989.02487106

2.确定模型。

  其实就是fp1这两个数带入函数式就行了。

1 f1=sp.poly1d(fp1)

  注意poly1d()中的是数字1不是字母L,可以print f1,试试看看输出的对不对。

3.开始画图。

1 fx=sp.linspace(0,x[-1],1000) #生成f1(x)=ax+b的x的取值范围,原有的x数组不连续,不能用
2 plt.plot(fx,f1(fx),linewidth=4)
3 plt.legend(["d=%i" % f1.order],loc="upper left")

  效果就是这样的:

  缺图 


  验证该模型

《待续。。。》

原文地址:https://www.cnblogs.com/wffett/p/4684727.html