支持向量机(SVM): 从理论到实践的指南(1)

打印 上一主题 下一主题

主题 565|帖子 565|积分 1695

支持向量机(SVM)被誉为数据科学领域的重量级算法,是呆板学习中不可或缺的工具之一。SVM以其精良的泛化本领和对高维数据的管理而备受推崇。本文旨在梳理SVM的焦点概念以及其在现实场景中的应用。
SVM的焦点理念

SVM专注于为二分类题目找到最佳决定边界,即超平面,该平面能最大化两类数据之间的清闲或间隔。线性SVM假设用一个直线(或高维空间中的超平面)足以有效地分隔数据。当碰到重叠或乱七八糟散布的数据时,软间隔SVM答应某些点位于错误的边界一侧,这通过引入松懈变量与罚项系数C来实现,从而提供一个妥当的平衡方案。
算法实现

SVM通过转化优化题目为其对偶情势并使用拉格朗日乘子法来办理。这不仅简化了求解过程,还能自然地加入核技巧(Kernel trick)来处理非线性可分的数据集。
具体算法描述>>>>
一个经典案例

为了具体说明SVM的应用,我们考虑了一个著名的数据集。

  • 鸢尾花分类:鸢尾花数据集由三个品种的鸢尾花构成,每一种都有50个样本和4个特征。对于二分类使命,我们专注于将Setosa从Versicolour中区分出来。
实践应用

使用MindOpt APL,一种强大的代数建模语言和求解器,我们可以更高效地构建和办理SVM优化题目。在练习阶段,算法学习数据的模式,并找到分隔差别类别的最优决定边界。一旦模型确定,我们便可用其做出预测并评估其在未见数据上的性能。
  1. clear model;
  2. ####################################################
  3. #
  4. #   Vectorization Modeling Example
  5. #   Linear SVM
  6. #
  7. ####################################################
  8. option modelname svm_02; #定义存储文件名
  9. # ----------建模--------Start----
  10. # svm_02.mapl
  11. # 1.读取iris的用于构建SVM模型的训练数据
  12. param data_dir = "./data/iris_data-train.csv";
  13. param X = read_csv( data_dir, use_col="0,1,2,3",skip=1);
  14. param y = read_csv( data_dir, use_col=4,skip=1);
  15. param dataNum = X.row;
  16. param dataDim = X.col;
  17. print "总共有{}个数据,每个数据有{}维"%dataNum,dataDim;
  18. # 2.LinearSVM问题建模
  19. param C_rho = 0.2;
  20. print "Param C is :{}"%C_rho;
  21. print "Start modeling-------";
  22. var w(dataDim) >= -1 <= 1; # Bounded Model Parameter
  23. var b; #
  24. var eps(dataNum) >= 0;
  25. minimize 1/2 * w' * w + C_rho * sum(eps); #'是转置,目标函数
  26. subto constraint:
  27.         eps >= 1 - (X*w +b).*y; #注意是向量化建模,因此相当于多条维度的约束
  28. # 3.调用求解器求解
  29. print "Start solving-------";
  30. option solver mindopt;
  31. solve;
  32. # 4. 超平面的w取值
  33. print "- Optimal w is:";
  34. print w;
  35. print "- Optimal b is:";
  36. print b;
  37. print "- eps is:";
  38. forall { i in 0..dataNum-1 with eps[i] > 0.001}
  39.     print "  - eps[{}] = {} "%i,eps[i];
  40. param obj_total_loss =  1/2 * w' * w + C_rho * sum(eps); #'是转置
  41. print "- obj of total loss is : {}"%obj_total_loss;
  42. # 5.验证并分析结果
  43. print "";
  44. print "验证结果:-----";
  45. param correctNum = sum{i in 0..dataNum-1} if((sum{j in 0..dataDim-1}w[j]*X[i, j]) +b )* y[i] > 0 then 1 else 0 end;
  46. param precision = correctNum / dataNum;
  47. print "- Precision for train data is : {:.2f}" % precision;
  48. #
  49. print "";
  50. print "导入测试数据验证效果:-----";
  51. param data_dir_test = "./data/iris_data-test.csv";
  52. param X_test = read_csv( data_dir_test, use_col="0,1,2,3",skip=1);
  53. param y_test = read_csv( data_dir_test, use_col=4,skip=1);
  54. param dataNum_test = X_test.row;
  55. param dataDim_test = X_test.col;
  56. print "- 总共有{}个数据,每个数据有{}维"%dataNum_test,dataDim_test;
  57. print "|测试数据ID|实际标签|SVM预测标签是|";
  58. print "|--|--|--|";
  59. forall {i in 0..dataNum_test-1}
  60. print "|{}|{}|{}|"%i,y_test[i], if((sum{j in 0..dataDim_test-1}w[j]*X_test[i, j]) +b ) > 0 then 1 else -1 end;
复制代码
运行上述代码结果如下:
  1. 总共有80个数据,每个数据有4维
  2. Param C is :0.2
  3. Start modeling-------
  4. Start solving-------
  5. Running mindoptampl
  6. wantsol=1
  7. MindOpt Version 1.2.1 (Build date: 20240428)
  8. Copyright (c) 2020-2024 Alibaba Cloud.
  9. Start license validation (current time : 29-APR-2024 17:51:11).
  10. License validation terminated. Time : 0.007s
  11. Model summary.
  12. - Num. variables     : 85
  13. - Num. constraints   : 80
  14. - Num. nonzeros      : 480
  15. - Bound range        : [1.0e+00,1.0e+00]
  16. - Quad. bound range  : [1.0e+00,1.0e+00]
  17. - Objective range    : [2.0e-01,2.0e-01]
  18. - Quad. obj. range   : [1.0e+00,1.0e+00]
  19. - Matrix range       : [1.0e-01,7.0e+00]
  20. Presolver started.
  21. Presolver terminated. Time : 0.000s
  22. Interior point method started.
  23. Iter         PrimObj         DualObj PrimFea DualFea  GapFea      Mu   Time
  24.     0 +1.56581101e+01 -1.06624290e+01 2.0e-01 2.6e-01 2.5e+00 6.2e-01   0.02s
  25.     1 +8.56566249e+00 -7.16779185e-01 5.4e-04 7.6e-03 9.3e+00 6.5e-02   0.04s
  26.     2 +9.75513434e-01 +2.94267093e-01 2.7e-05 1.4e-03 6.8e-01 4.1e-03   0.05s
  27.     3 +5.98630319e-01 +4.50898225e-01 4.2e-06 1.5e-04 1.5e-01 8.9e-04   0.05s
  28.     4 +5.12227038e-01 +4.88329845e-01 1.1e-08 1.2e-03 2.5e-02 1.5e-04   0.05s
  29.     5 +5.04653750e-01 +5.01437631e-01 9.7e-10 2.0e-04 3.2e-03 1.9e-05   0.06s
  30.     6 +5.02835294e-01 +5.02808740e-01 2.7e-12 5.4e-07 2.7e-05 1.6e-07   0.06s
  31.     7 +5.02821164e-01 +5.02821090e-01 7.1e-15 1.5e-09 7.3e-08 4.4e-10   0.06s
  32.     8 +5.02821125e-01 +5.02821124e-01 1.9e-16 4.1e-12 2.0e-10 1.2e-12   0.06s
  33. Terminated.
  34. - Method             : Interior point method.
  35. - Primal objective   : 5.0282112458779E-01
  36. - Dual objective     : 5.0282112438583E-01
  37. - Num. threads       : 4
  38. - Num. iterations    : 8
  39. - Solver details     : Solver terminated with a primal/dual optimal status.
  40. Interior point method terminated. Time : 0.046s
  41. OPTIMAL; objective 0.50
  42. 0 simplex iterations
  43. Completed.
  44. - Optimal w is:
  45. [[-0.16610],
  46. [ 0.35465],
  47. [-0.75422],
  48. [-0.32403]]
  49. - Optimal b is:
  50. 2.038087831121987
  51. - eps is:
  52.   - eps[23] = 0.08284647160625058
  53.   - eps[24] = 0.05118542249112839
  54.   - eps[47] = 0.26241815907236044
  55.   - eps[69] = 0.04962685713002854
  56. - obj of total loss is : 0.5028211245877855
  57. 验证结果:-----
  58. - Precision for train data is : 1.00
  59. 导入测试数据验证效果:-----
  60. - 总共有20个数据,每个数据有4维
  61. |测试数据ID|实际标签|SVM预测标签是|
  62. |--|--|--|
  63. |0|1|1|
  64. |1|1|1|
  65. |2|1|1|
  66. |3|1|1|
  67. |4|1|1|
  68. |5|1|1|
  69. |6|1|1|
  70. |7|1|1|
  71. |8|1|1|
  72. |9|1|1|
  73. |10|-1|-1|
  74. |11|-1|-1|
  75. |12|-1|-1|
  76. |13|-1|-1|
  77. |14|-1|-1|
  78. |15|-1|-1|
  79. |16|-1|-1|
  80. |17|-1|-1|
  81. |18|-1|-1|
  82. |19|-1|-1|
复制代码
结果

上面的步伐运行结果如下:
其中,小数后几位是精度影响,每次会有变化,不影响结果。

统共有80个数据,每个数据有4维
Param C is :0.2
……


  • Optimal w is: [[-0.16610], [ 0.35465], [-0.75422], [-0.32403]]
  • Optimal b is: 2.038087831122001
  • eps is:

    • eps[23] = 0.08284647160625147
    • eps[24] = 0.051185422491125426
    • eps[47] = 0.26241815907236443
    • eps[69] = 0.049626857130028075

  • obj of total loss is : 0.5028211245877853
验证结果:-----


  • Precision for train data is : 1.00
导入测试数据验证效果:-----


  • 统共有20个数据,每个数据有4维
  •    测试数据ID现实标签SVM预测标签是01111121131141151161171181191110-1-111-1-112-1-113-1-114-1-115-1-116-1-117-1-118-1-119-1-1

可以看到,对于这份数据,盘算的超平面能很好地举行二分类,在测试聚集上也有100%的精确率,证实了SVM在现实题目中的有效性。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

三尺非寒

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表