0.3.1 关键书籍

  • 2012.李航.统计学习方法.pdf
    • 第1章 统计学习方法概论
    • 第2章 感知机
    • 第3章 k近邻法
    • 第4章 朴素贝叶斯法
    • 第5章 决策树
    • 第6章 逻辑斯谛回归与最大熵模型
    • 第7章 支持向量机
    • 第8章 提升法
    • 第9章 EM算法及其推广
    • 第10章 隐马尔可夫模型
    • 第11章 条件随机场
    • 第12章 统计学习方法总结
    • 附录A 梯度下降法
    • 附录B 牛顿法与拟牛顿法
    • 附录C 拉格朗日对偶性

0.3.2 学习示例

以下风险定价中求解无约束最优化问题时,为加快收敛速度所用牛顿法为例:

0.3.2.1 牛顿法原理

截屏2020-12-01 下午10.39.21.png

0.3.2.2 计算过程

构建示例:
0.3 统计学习⽅法 - 图2
据上述牛顿法,下一个0.3 统计学习⽅法 - 图3取值0.3 统计学习⽅法 - 图4为:
0.3 统计学习⽅法 - 图5%7D%7Bf%5E%60(x_0)%7D%5C%5C%0Ax_1%20%3D%20x_0%20-%20%5Cfrac%7Bx_0%5E2-2%7D%7B2x_0%7D%20%3D%20(x_0%20%2B%202%2Fx_0)%2F2%5C%5C%0A#card=math&code=x_1%20%3D%20x_0%20-%20%5Cfrac%7Bf%28x_0%29%7D%7Bf%5E%60%28x_0%29%7D%5C%5C%0Ax_1%20%3D%20x_0%20-%20%5Cfrac%7Bx_0%5E2-2%7D%7B2x_0%7D%20%3D%20%28x_0%20%2B%202%2Fx_0%29%2F2%5C%5C%0A&id=S02k6)

  • 代码明细(SAS)
  1. %macro fcal(x=,t=,);
  2. data &t.;
  3. &t. = (&x.) ** 2 - 2;
  4. run;
  5. %mend;
  6. %macro fcal_x(b=,fl=0.000001);
  7. %let bf = 1;
  8. %do i = 0 %to 100;
  9. %fcal(x=&b., t=f);
  10. %fcal(x=&b.-&fl., t=f_0);
  11. %fcal(x=&b.+&fl., t=f_1);
  12. data f_all;
  13. merge f f_0 f_1;
  14. x0 = &b.;
  15. f_ = (f_1 - f_0)/(&fl.*2); # 导函数模拟
  16. /* f_ = 2 * x0; */
  17. x1 = x0 - f/f_;
  18. run;
  19. data _null_;
  20. set f_all;
  21. call symput("bb", x1);
  22. run;
  23. %fcal(x=&bb., t=f1);
  24. data _null_;
  25. set f1;
  26. f1_ = f1 < 0.01;
  27. /* f1_ = abs(&bb. - &b.) < 0.01; */
  28. call symput("brf", f1);
  29. call symput("bf", f1_);
  30. run;
  31. %put --------------------------- &bb. &brf. &bf.;
  32. %if &bf. = 1
  33. %then %let i = 100;
  34. %else %let b = &bb.;
  35. %end;
  36. %mend;
  37. %fcal_x(b=4);
  38. /*
  39. --------------------------- 2.2500000001 3.0625000005 0
  40. --------------------------- 1.5694444446 0.4631558647 0
  41. --------------------------- 1.4218903638 0.0217722067 0
  42. --------------------------- 1.4142342859 0.0000586154 1
  43. */
  • 代码明细(Python)
  1. def sqrt_by_bisection(n):
  2. low, last = 0, 0
  3. up = n
  4. mid = (low + up)/2
  5. while abs(mid - last) > eps:
  6. if mid * mid > n:
  7. up = mid
  8. else:
  9. low = mid
  10. last = mid
  11. mid = (up + low)/2
  12. return mid
  13. print(sqrt_by_bisection(2))
  14. %timeit sqrt_by_bisection(2)
  15. # 1.4142135605216026
  16. # 6.26 µs ± 6.98 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

如上,快速计算0.3 统计学习⽅法 - 图6.