Deeplearning Algorithms tutorial

谷歌的人工智能位于全球前列,在图像识别、语音识别、无人驾驶等技术上都已经落地。而百度实质意义上扛起了国内的人工智能的大旗,覆盖无人驾驶、智能助手、图像识别等许多层面。苹果业已开始全面拥抱机器学习,新产品进军家庭智能音箱并打造工作站级别Mac。另外,腾讯的深度学习平台Mariana已支持了微信语音识别的语音输入法、语音开放平台、长按语音消息转文本等产品,在微信图像识别中开始应用。全球前十大科技公司全部发力人工智能理论研究和应用的实现,虽然入门艰难,但是一旦入门,高手也就在你的不远处! AI的开发离不开算法那我们就接下来开始学习算法吧!

弹性网络(Elastic Net)

弹性网络是一种使用 L1,L2范数作为先验正则项训练的线性回归模型.这种组合允许学习到一个只有少量参数是非零稀疏的模型,就像 Lasso一样,但是它仍然保持一些像Ridge的正则性质。我们可利用 l1_ratio 参数控制L1和L2的凸组合。弹性网络是一不断叠代的方法。

弹性网络(Elastic Net) - 图1 弹性网络(Elastic Net) - 图2

弹性网络最妙的地方是它永远可以产生有效解。由于它不会产生交叉的路径,所以产生的解都相当不错。举例来说,对一个随机产生的50个城市的推销员问题,弹性网络的解只有比德宾和威尔萧的论文中所提的最具竞争力的演算法长2%(什么是最具竞争力的演算法?有人说是林-克尼根(Lin-Kernighan)演算法,也有人说是SA+OP)。但是弹性网络最吸引人的地方不在它的有效解,而在它收敛的速度。许多人试着去改善弹性网络收敛的速度,都有不错的结果。举例来说,柏尔(Burr)所提出的改良版可令50个城市的推销员问题的收敛次数由1250大幅降为30次。一个最佳化的弹性网络的速度会比林-克尼根快两倍。 弹性网络在很多特征互相联系的情况下是非常有用的。Lasso 很可能只随机考虑这些特征中的一个,而弹性网络更倾向于选择两个。 在实践中,Lasso 和 Ridge 之间权衡的一个优势是它允许在循环过程(Under rotate)中继承 Ridge 的稳定性。 在这里,最小化的目标函数是:

弹性网络(Elastic Net) - 图3

应用案例

  1. print(__doc__)
  2. # Author: Alexandre Gramfort <alexandre.gramfort@inria.fr>
  3. # License: BSD 3 clause
  4. from itertools import cycle
  5. import numpy as np
  6. import matplotlib.pyplot as plt
  7. from sklearn.linear_model import lasso_path, enet_path
  8. from sklearn import datasets
  9. diabetes = datasets.load_diabetes()
  10. X = diabetes.data
  11. y = diabetes.target
  12. X /= X.std(axis=0) # Standardize data (easier to set the l1_ratio parameter)
  13. # Compute paths
  14. eps = 5e-3 # the smaller it is the longer is the path
  15. print("Computing regularization path using the lasso...")
  16. alphas_lasso, coefs_lasso, _ = lasso_path(X, y, eps, fit_intercept=False)
  17. print("Computing regularization path using the positive lasso...")
  18. alphas_positive_lasso, coefs_positive_lasso, _ = lasso_path(
  19. X, y, eps, positive=True, fit_intercept=False)
  20. print("Computing regularization path using the elastic net...")
  21. alphas_enet, coefs_enet, _ = enet_path(
  22. X, y, eps=eps, l1_ratio=0.8, fit_intercept=False)
  23. print("Computing regularization path using the positive elastic net...")
  24. alphas_positive_enet, coefs_positive_enet, _ = enet_path(
  25. X, y, eps=eps, l1_ratio=0.8, positive=True, fit_intercept=False)
  26. # Display results
  27. plt.figure(1)
  28. ax = plt.gca()
  29. colors = cycle(['b', 'r', 'g', 'c', 'k'])
  30. neg_log_alphas_lasso = -np.log10(alphas_lasso)
  31. neg_log_alphas_enet = -np.log10(alphas_enet)
  32. for coef_l, coef_e, c in zip(coefs_lasso, coefs_enet, colors):
  33. l1 = plt.plot(neg_log_alphas_lasso, coef_l, c=c)
  34. l2 = plt.plot(neg_log_alphas_enet, coef_e, linestyle='--', c=c)
  35. plt.xlabel('-Log(alpha)')
  36. plt.ylabel('coefficients')
  37. plt.title('Lasso and Elastic-Net Paths')
  38. plt.legend((l1[-1], l2[-1]), ('Lasso', 'Elastic-Net'), loc='lower left')
  39. plt.axis('tight')
  40. plt.figure(2)
  41. ax = plt.gca()
  42. neg_log_alphas_positive_lasso = -np.log10(alphas_positive_lasso)
  43. for coef_l, coef_pl, c in zip(coefs_lasso, coefs_positive_lasso, colors):
  44. l1 = plt.plot(neg_log_alphas_lasso, coef_l, c=c)
  45. l2 = plt.plot(neg_log_alphas_positive_lasso, coef_pl, linestyle='--', c=c)
  46. plt.xlabel('-Log(alpha)')
  47. plt.ylabel('coefficients')
  48. plt.title('Lasso and positive Lasso')
  49. plt.legend((l1[-1], l2[-1]), ('Lasso', 'positive Lasso'), loc='lower left')
  50. plt.axis('tight')
  51. plt.figure(3)
  52. ax = plt.gca()
  53. neg_log_alphas_positive_enet = -np.log10(alphas_positive_enet)
  54. for (coef_e, coef_pe, c) in zip(coefs_enet, coefs_positive_enet, colors):
  55. l1 = plt.plot(neg_log_alphas_enet, coef_e, c=c)
  56. l2 = plt.plot(neg_log_alphas_positive_enet, coef_pe, linestyle='--', c=c)
  57. plt.xlabel('-Log(alpha)')
  58. plt.ylabel('coefficients')
  59. plt.title('Elastic-Net and positive Elastic-Net')
  60. plt.legend((l1[-1], l2[-1]), ('Elastic-Net', 'positive Elastic-Net'),
  61. loc='lower left')
  62. plt.axis('tight')
  63. plt.show()