zoukankan      html  css  js  c++  java
  • 机器学习系统设计-读书笔记3

    继续第二篇笔记中的例子。

    3.不断的迭代与探索的过程

    从上篇的图看到,直线并不能很好的代表week4以后的趋势。既然一阶函数不行,我们试试二阶函数?

    f(x)= ax**2 + bx + c

    继续使用polyfit这个函数来确定a,b,c的值:

        f2p =sp.polyfit(x,y,2)
        print f2p

    上述代码得到了一个数组

    [ 1.05322215e-02 -5.26545650e+00 1.97476082e+03],这就是a,b,c分别的值。

        f2 = sp.poly1d(f2p)
        print(error(f2,x,y))

    继续计算一下残差平方和是:179983507.878 ,显然要比1次的好。如果阶数越高,效果就越好,我们为什么不进一步增加阶数?

    try一下阶数为3,10,100的情况

    f3 = sp.poly1d(sp.polyfit(x, y, 3))
        f10 = sp.poly1d(sp.polyfit(x, y, 10))
        f100 = sp.poly1d(sp.polyfit(x, y, 100))
    
        print 'd3=' ,(error(f3,x,y))
        print 'd10=' ,(error(f10,x,y))
        print 'd100=' , (error(f100,x,y))

    残差平方和结果为:

    d3=     139350144.032
    d10=   121942326.364
    d100= 109452403.459

    结果是越来越好了,但是100项式的模型是否真的代表了用户真实行为呢?我们继续把图画出来。

    紫色的曲线代表了100阶多项式。看出它的问题了么?抖动的太厉害了!响应了所有数据的要求,但是,里边其实有不少数据算是噪声数据,比如偏离太远的点,没有代表性。这样的拟合被叫做 过度拟合(overfitting),10阶也同样类似的问题(如果数据更多,效果会更加明显)。所以,一味的提高模型的复杂度并不是一个好办法。

    问题在哪里?从建模角度似乎遇上了一些瓶颈。我们返回来看数据,我们真的的理解数据了么?

  • 相关阅读:
    mybatis-cache model
    多线程开发(1)
    正则表达式(3) — 正则表达式库
    正则表达式(2) — 表达式规则
    我在迈瑞工作的两年总结
    正则表达式(1) — 常用的表达式
    C++系列(2) — 智能指针
    C++系列(1) — string
    路径去除前缀
    SIMD性能优化
  • 原文地址:https://www.cnblogs.com/skytraveler/p/3981073.html
Copyright © 2011-2022 走看看