zoukankan      html  css  js  c++  java
  • 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")

      效果就是这样的:

      缺图 


      验证该模型

    《待续。。。》

  • 相关阅读:
    到底该不该熟悉掌握struts2的ONGL呢?
    struts2 request内幕 为什么在struts2用EL表达式可以取值
    struts2 权限拦截器 拦截没有登陆的请求
    tomcat context 配置 项目部署
    tomcat 设置默认编码格式
    工作记录1
    javascript 的学习笔记(第一天)
    JavaScript for...in 循环
    indexof方法区分大小写
    java 和 IntelliJ IDEA 的一些配置
  • 原文地址:https://www.cnblogs.com/wffett/p/4684727.html
Copyright © 2011-2022 走看看