线性可分支持向量机的求解

  线性可分支持向量机就是要找\[\mathop{\mathrm{argmin}}_{\bm w,b}\dfrac12\|\bm w\|^2,\]其中$\,\bm w\,$和$\,b\,$满足\[y_i(\bm w\cdot\bm x_i+b)-1\geqslant 0,i=1,2,\cdots,N.\]对于这个规划问题,我们可以很快地使用 Mathematica 解决.

  我们以$\,\bm x_i\,$都是平面上的点为例,先随机地生成一些正例和负例:

1
2
3
4
5
6
正例 = Select[RandomReal[{-1, 1}, {100, 2}], #.{1, 1} > 0.5 &];
负例 = Select[RandomReal[{-1, 1}, {100, 2}], #.{1, 1} < 0.2 &];
(*上面的0.5和0.2是为了让正例和负例在视觉上更明显地分开来.*)
\[ScriptCapitalX] = Join[正例, 负例];
\[ScriptCapitalY] = Association[Join[# -> 1 & /@ 正例, # -> -1 & /@ 负例]];
图 = ListPlot[{正例, 负例}, AspectRatio -> Automatic]

正例和负例
然后就可以直接求解了:

1
w = NArgMin[{x^2 + y^2, And @@ NonNegative[\[ScriptCapitalY][#] ({x, y}.# + b) - 1 & /@ \[ScriptCapitalX]]}, {x, y, b}]

注意这里在运行的过程中可能会出现“NArgMin 无法生成任何满足不等式约束条件……”的报错,不用在意,稍等一会儿就会给出结果.最后,我们将这条分隔直线画出来:

1
Show[图, ContourPlot[{x, y, 1}.w == 0, {x, -1, 1}, {y, -1, 1}, PlotTheme -> "Classic"]]

支持向量机的可视化

您的支持将鼓励我继续创作!