<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 10 章 支持向量机 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/ml/chapter10/</link>
		<description>Recent content in 第 10 章 支持向量机 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/ml/chapter10/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>10.1 SVM思想</title>
				<link>https://mlwithme.github.io/ml/chapter10/515b54e2307a4c8a/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/515b54e2307a4c8a/</guid>
				<description>&lt;p&gt;在前面几章中，我们已经陆续介绍了多种分类算法模型，相信各位读者对于机器学习也算有了一定的了解。在接下来的这一章中，将开始逐步介绍本书中的最后一个分类模型——支持向量机。支持向量机（Support Vector Machine, SVM）可以算得上是机器学习算法中最为经典的模型,之所以称为经典，是因为支持向量机的背后有着完美的数学推导与证明。当然，也正是因为这个原因使学习SVM有着较高的门槛，因此，在接下来的内容中，将会尽可能以最通俗的表达来介绍SVM中的相关原理。&lt;/p&gt;&#xA;&lt;p&gt;如图10-1所示便是整个SVM算法的学习路线图，首先我们将介绍SVM算法和核函数的基本思想以及sklearn中的建模过程，然后再详细介绍SVM算法的建模原理及推导过程，最后再介绍如何从零实现一个简易版的SVM算法。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/240626234959.jpg&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 10-1 SVM算法学习路线图&lt;/center&gt;&#xA;&lt;h1 id=&#34;101-svm思想&#34;&gt;10.1 SVM思想&lt;a class=&#34;anchor&#34; href=&#34;#101-svm%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;什么是支持向量机呢？初学者刚接触到这个算法时基本上会被这个名字所困扰，到底什么叫“向量机”，听起来总觉得怪怪的，因此首先需要明白的是，支持向量机其实和“机”一点关系也没有，算法的关键在于“支持向量”。如图10-2所示，此图为4种不同模型对同一个数据集分类后的决策边界图。可以看到尽管每个模型都能准确地将数据集分成两类，但是从各自的决策边界到两边样本点的距离来看却有着很大的区别。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-1.png&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 10-2 不同模型决策边界&lt;/center&gt;&#xA;&lt;p&gt;为了能更加清楚地进行观察，下面将4个决策边界放到一张图中，如图10-3所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;250&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-2.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 10-3 决策边界&lt;/center&gt;&#xA;&lt;p&gt;如图10-3所示，图中左边从上到下分别为模型(d)、(a)、(b)、(c)在数据集上的决策边界。可以发现模型(c)的泛化能力应该是最差的，因为从数据的分布位置来看真实的决策面应该是一条左高右低倾斜的直线。其次是模型(b)的泛化能力，因为从图10-3可以看出模型(b)的决策面太过于偏向方块形的样本点。因为评估分类决策面优劣的一个原则就是，当没有明确的先验知识告诉我们决策面应该偏向于哪边时，最好的做法应该是居于中间位置，也就是类似于模型(a)和模型(d)的决策面。那么模型(a)和模型(d)究竟哪个更胜一筹呢？进一步，可以将(a)和(d)这两个模型各自到两侧样本点距离可视化，如图10-4所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;470&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-3.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 10-4 决策边界宽度图&lt;/center&gt;&#xA;&lt;p&gt;从图10-4中一眼便可以看出，模型(d)的决策面要更居于“中间”（事实上确实在中间)，而模型(a)的决策面也略微偏向于方块形的样本点，因此在这4个模型中，模型(d)的泛化能力通常情况下是最强的。此时有读者可能会问，假如把模型(a)中的决策面向上平移一点，使其也居于两条虚线之间，那么此时应该选择哪个模型呢？答案当然依旧是模型(d)，原因在于模型(d)的决策面还满足另外一个条件，即到两条虚线的距离最大。换句话讲，模型(d)中两条虚线之间的距离要大于模型(a)中两条虚线之间的距离。&lt;/p&gt;&#xA;&lt;p&gt;讲到这里，相信各位读者已经猜到，模型(d)对应的就是支持向量机模型，同时虚线上的两个样本点被称为支持向量。可以发现，最终对决策面起决定性作用的也只有这两个样本点，说得通俗点就是仅根据这两个点就能训练得到模型(d)。因此，这里可以得出的结论就是，通过支持向量我们便能得到一个最优超平面，该超平面满足到左右两侧最近样本点的间隔相同，并且离左右最近样本点的间隔最大。不过又该如何来找到这个超平面呢？&lt;/p&gt;</description>
			</item>
			<item>
				<title>10.2 SVM线性不可分</title>
				<link>https://mlwithme.github.io/ml/chapter10/9c3862bc843c4179/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/9c3862bc843c4179/</guid>
				<description>&lt;h1 id=&#34;102-svm线性不可分&#34;&gt;10.2 SVM线性不可分&lt;a class=&#34;anchor&#34; href=&#34;#102-svm%e7%ba%bf%e6%80%a7%e4%b8%8d%e5%8f%af%e5%88%86&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在上一节内容中我们介绍了SVM算法的基本思想，即找到一个决策面使得它到两边最近样本点之间的距离最大，因此SVM也被称之为最大间隔分类器。在本节内容中将开始介绍SVM中的特征映射与核函数，以及如何通过sklearn来完成整个建模过程。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1021-svm线性不可分与特征映射&#34;&gt;10.2.1 SVM线性不可分与特征映射&lt;a class=&#34;anchor&#34; href=&#34;#1021-svm%e7%ba%bf%e6%80%a7%e4%b8%8d%e5%8f%af%e5%88%86%e4%b8%8e%e7%89%b9%e5%be%81%e6%98%a0%e5%b0%84&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;根据10.1节内容中SVM的思想来看，到目前为止谈到的情况都是线性可分的，也就是说总能找到一个超平面将样本点给分开。可事实上却是，在大多数场景中各个类别之间是线性不可分的，即类似于如图10-5所示的情况。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-6.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 10-5 SVM线性不可分图&lt;/center&gt;&#xA;&lt;p&gt;对于图10-5中这种情况应该怎么才能将其分开呢？在4.2.4节内容中我们介绍过，这类问题可以使用特征映射的方法将原来的输入特征映射到更高维度的空间，然后寻找一个超平面，以此将数据集中不同类别的样本进行分类，如图10-6所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;450&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-7.png&#34;/&gt;&#xA;&lt;/div&gt;&lt;center&gt;图 10-6 SVM特征映射&lt;/center&gt;&#xA;如图10-6所示，现在已经用一个超平面完美地将不同类别的样本分开了。不过此时有读者可能会感到疑惑，这还是刚刚的数据集吗？之前明明在二维平面上，现在却显示到三维空间了。虽然数据集确确实实已经不是同一个数据集了，但是每个数据样本所对应的类别却依旧和原来的一样，只不过现在给它穿上了一件“马甲”。也就是说，假如$x^{(i)}$是正样本，那么它穿上马甲变成$\hat{x}^{(i)}$后仍然属于正样本，只要能把$\hat{x}^{(i)}$进行正确分类，那么自然也就能够对$x^{(i)}$​进行分类了。&#xA;&lt;p&gt;为了能够实现将特征从原始低维空间映射到高维空间，在SVM建模过程中可以使用核函数来达成这一目的。关于核函数的详细原理可以参见10.8节内容，对于第一阶段内容的学习，只需要知道这些核函数的作用和用法即可。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1022-svm示例代码&#34;&gt;10.2.2 SVM示例代码&lt;a class=&#34;anchor&#34; href=&#34;#1022-svm%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在sklearn中可以通过&lt;code&gt;from sklearn.svm import SVC&lt;/code&gt;这行代码导入SVM分类模型。有读者可能会觉得奇怪，为什么导入的是一个叫&lt;code&gt;SVC&lt;/code&gt;的东西？这是因为其实SVM不仅可以用来分类，它同样也能用于回归问题，因此&lt;code&gt;SVC&lt;/code&gt;其实就是支持向量分类的意思。下面，首先来对类&lt;code&gt;SVC&lt;/code&gt;中的几个常用参数进行简单介绍，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;  &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;__init__&lt;/span&gt;(&lt;span style=&#34;color:#007020&#34;&gt;self&lt;/span&gt;, C&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1.0&lt;/span&gt;, kernel&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;rbf&amp;#39;&lt;/span&gt;, degree&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;):&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行&lt;code&gt;C&lt;/code&gt;表示SVM中的惩罚项系数，越大对误分类样本的惩罚就越大，其作用等同于正则化中的参数𝜆，详细原理将在10.4节内容中进行介绍；&lt;code&gt;kernel&lt;/code&gt;是指定对应的核函数，默认情况下可直接使用高斯核函数&lt;code&gt;kernel=&#39;rbf&#39;&lt;/code&gt;，即将特征维度映射到无穷维空间中；&lt;code&gt;degree&lt;/code&gt;表示指定多项式核函数的次数，仅在&lt;code&gt;kernel=&#39;poly&#39;&lt;/code&gt;时有效。&lt;/p&gt;&#xA;&lt;p&gt;在完成&lt;code&gt;SVC&lt;/code&gt;的导入以后便可以将其用于分类任务中，完整示例代码可参见 &lt;code&gt;AllBooKCode/Chapter10/C05_linear_svm.py&lt;/code&gt; 文件，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;train&lt;/span&gt;(x_train, x_test, y_train, y_test):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; SVC(C&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1.0&lt;/span&gt;,kernel&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;linear&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x_train, y_train)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     y_pre &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;predict(x_test)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;准确率为：&lt;/span&gt;&lt;span style=&#34;color:#70a0d0&#34;&gt;{&lt;/span&gt;model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;score(x_test, y_test)&lt;span style=&#34;color:#70a0d0&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     &lt;span style=&#34;color:#60a0b0;font-style:italic&#34;&gt;# 准确率为：0.9759&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上述代码便是通过sklearn实现SVM建模的全部代码。可以看出，在sklearn中使用一个模型的步骤依旧是在5.3.1节中总结的3步： 建模、训练和预测。同时，这里我们依旧可以通过网格搜索来进行模型超参数的选择。从最后在测试集上的结果来看，线性SVM分类器的表现在准确率上也有着不错的结果。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1023-小结&#34;&gt;10.2.3 小结&lt;a class=&#34;anchor&#34; href=&#34;#1023-%e5%b0%8f%e7%bb%93&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在本节中，我们首先介绍了SVM中的线性不可分情况，并且介绍了可以通过将原始特征映射到高维空间中的方法来解决这一问题；然后介绍了如何利用sklearn来完成SVM的建模过程以及核函数的使用方法。不过这里仅仅只是介绍了核函数的使用，在后续文章中还将更加详细地来介绍核函数的相关原理，以及为什么使用核函数能够将低维特征映射到无穷维等。&lt;/p&gt;</description>
			</item>
			<item>
				<title>10.3 SVM原理</title>
				<link>https://mlwithme.github.io/ml/chapter10/fbdb6f8adace457d/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/fbdb6f8adace457d/</guid>
				<description>&lt;h1 id=&#34;103-svm原理&#34;&gt;10.3 SVM原理&lt;a class=&#34;anchor&#34; href=&#34;#103-svm%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在前面两节内容中我们分别介绍了SVM算法的基本思想以及在sklearn的使用示例，即完成了第一阶段的学习过程。从本节内容开始，我们将开始详细介绍SVM背后的数学原理及其求解过程。根据10.1节内容可知，SVM的求解过程本质上就是最大化超平面到两侧样本点之间的间隔，因此需要先定义距离的计算公式。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1031-超平面的表达&#34;&gt;10.3.1 超平面的表达&lt;a class=&#34;anchor&#34; href=&#34;#1031-%e8%b6%85%e5%b9%b3%e9%9d%a2%e7%9a%84%e8%a1%a8%e8%be%be&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在正式定义距离之前，这里先回顾一下超平面的表达式&#xA;&lt;/p&gt;&#xA;$$&#xA;{{w}^{T}}x+b=0\tag{10-1}&#xA;$$&lt;p&gt;&#xA;其中，$w$表示权重参数（系数）； $b$表示截距；$x$表示样本点。&lt;/p&gt;&#xA;&lt;p&gt;从上述表达式可知，当通过某种方法找到参数$w$和$b$​后，也就代表确立了超平面，即求解得到了SVM分类器。下面，我们根据SVM的思想来定义对应的求解问题。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1032-间隔的定义&#34;&gt;10.3.2 间隔的定义&lt;a class=&#34;anchor&#34; href=&#34;#1032-%e9%97%b4%e9%9a%94%e7%9a%84%e5%ae%9a%e4%b9%89&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;SVM的核心思想是最大化间隔，既然是最大化间隔那必须有对应的间隔度量方式，即样本点到超平面的距离，如图10-7所示$\text{AB}$之间的距离。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-5.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 10-7 间隔定义图&lt;/center&gt;&#xA;&lt;p&gt;如图10-7所示，直线方程为$w^Tx+b=0$，$A$为数据集中任意一个点${{x}^{(i)}}$，${{\gamma }^{(i)}}$为$A$到直线的距离，可以看成向量$BA$的模。$W$为垂直于$w^Tx+b=0$​的法向量。此时便可以得到点$B$的坐标为&#xA;&lt;/p&gt;&#xA;$$&#xA;{{x}^{(i)}}-{{\gamma }^{(i)}}\cdot \frac{W}{||W||}\tag{10-2}&#xA;$$&lt;p&gt;&#xA;又因为$B$点在直线上，所以满足&#xA;&lt;/p&gt;&#xA;$$&#xA;{{w}^{T}}\left({{x}^{(i)}}-{{\gamma }^{(i)}}\cdot \frac{W}{||W||}\right)+b=0\tag{10-3}&#xA;$$&lt;p&gt;&#xA;进一步，可以通过化简等式(10-3)来得到距离的计算公式，不过此时的问题在于$W$该怎么得到。&lt;/p&gt;&#xA;&lt;p&gt;现在假设有一直线$w^Tx+b=0,w=(w_1,w_2)^T$，即$w_1x_1+w_2x_2+b=0$，那么该直线的斜率便为$k_1=-w_1/w_2$。又因为$W$垂直于该直线，所以$W$ 的斜率为$k_2=w_2/w_1$，因此$W$的一个方向向量为$(1,k_2)$。进一步再同时乘以$w_1$即可得到$W=(w_1,w_2)=w$，即$W$其实就是$w$。也就是说，如果直线$w^Tx+b=0$，则$w$就是该直线的其中一条法向量。&lt;/p&gt;&#xA;&lt;p&gt;所以根据式(10-3)有&#xA;&lt;/p&gt;&#xA;$$&#xA;{{w}^{T}}\left({{x}^{(i)}}-{{\gamma }^{(i)}}\cdot \frac{w}{||w||}\right)+b=0\tag{10-4}&#xA;$$&lt;p&gt;&#xA;因此距离计算公式为&#xA;&lt;/p&gt;&#xA;$$&#xA;{{\gamma }^{(i)}}=\frac{{{w}^{T}}{{x}^{(i)}}+b}{||w||}\tag{10-5}&#xA;$$&lt;p&gt;同时，因为在SVM中分别用$y=+1$和$y=-1$来表示正样本和负样本，因此更一般的距离的计算公式为&#xA;&lt;/p&gt;&#xA;$$&#xA;{{\gamma }^{(i)}}=\frac{y^{(i)}(w^Tx^{(i)}+b)}{\|w\|}\tag{10-6}&#xA;$$&lt;p&gt;&#xA;在式(10-6)中，分别称$\gamma^{(i)}$和$\hat{\gamma}^{(i)}=y^{(i)}(w^Tx^{(i)}+b)$为任意样本$x^{(i)}$到直线$w^Tx+b=0$的几何间隔（Geometric Margin）和函数间隔（Functional Margin）。可以发现，几何间隔其实就是在函数间隔的基础上施加了一个约束限制。&lt;/p&gt;&#xA;&lt;p&gt;如图10-8所示，直线方程为 $x_1+x_2-3=0$，$\text{A}$和$\text{B}$分别为正负样本，即$y^{\text{A}}=+1,y^{\text{B}}=-1$，那么便可以根据式(10-6)来分别计算两者各自到直线的几何距离。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;330&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-4.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 10-8 几何间隔计算图&lt;/center&gt;&#xA;&lt;p&gt;此时分别有&#xA;&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp; {{\gamma }^{A}}=+1\cdot \left( {{\left(\frac{w}{||w||}\right)}^{T}}{{x}^{(A)}}+\frac{b}{||w||} \right)={{\left(\frac{(1,1)}{\sqrt{1+1}}\right)}^{T}}(2,3)+\frac{-3}{\sqrt{1+1}}=\sqrt{2} \\[2ex] &#xA; &amp; {{\gamma }^{B}}=-1\cdot \left( {{\left(\frac{w}{||w||}\right)}^{T}}{{x}^{(A)}}+\frac{b}{||w||} \right)=-{{\left(\frac{(1,1)}{\sqrt{1+1}}\right)}^{T}}(1,1)+\frac{3}{\sqrt{1+1}}=\frac{1}{\sqrt{2}} \\ &#xA;\end{aligned}\tag{10-7}&#xA;$$&lt;p&gt;&#xA;此时可以发现，只要在分类正确的情况下几何间隔将满足条件${{y}^{(i)}}\cdot {{\gamma }^{(i)}}&gt;0$。进一步，定义训练集中样本点到超平面的几何间隔中最小值为&#xA;&lt;/p&gt;</description>
			</item>
			<item>
				<title>10.4 SVM中的软间隔</title>
				<link>https://mlwithme.github.io/ml/chapter10/1a3ffa363b1d4f83/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/1a3ffa363b1d4f83/</guid>
				<description>&lt;h1 id=&#34;104-svm中的软间隔&#34;&gt;10.4 SVM中的软间隔&lt;a class=&#34;anchor&#34; href=&#34;#104-svm%e4%b8%ad%e7%9a%84%e8%bd%af%e9%97%b4%e9%9a%94&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在前面几节内容中，我们分别介绍了什么是支持向量机及如何通过sklearn来完成整个SVM的建模过程，然后还介绍了什么是线性不可分与核函数的用法。在接下来的这节内容中，我们将继续介绍SVM中的软间隔及其在sklearn中的示例用法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1041-软间隔定义&#34;&gt;10.4.1 软间隔定义&lt;a class=&#34;anchor&#34; href=&#34;#1041-%e8%bd%af%e9%97%b4%e9%9a%94%e5%ae%9a%e4%b9%89&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在10.2节和10.3节中，我们分别介绍了以下两种情况的分类任务： ①原始样本线性可分； ②原始样本线性不可分，但通过核函数映射到高维空间之后“线性可分”。为什么后面这个“线性可分”要加上引号呢？这是因为在10.3节中其实有一件事没有和各位读者交代，即虽然通过将原始样本映射到高维空间的方法能够很大程度上使原本线性不可分的样本点线性可分，但是这并不能完全保证每个样本点都是线性可分[1]的。或者保守点说，即使完全线性可分了，但也极大可能会出现过拟合现象。这可能是因为超平面对于异常点过于敏感，或者数据本身的属性所造成的，如图10-9所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;650&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-8.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 10-9 SVM软间隔与硬间隔&lt;/center&gt;&#xA;&lt;p&gt;在图10-9中，实线为相应的决策面，黑色方块和黑色圆点分别为两个类别的样本。在图10-9(a)中，通过SVM建模得到的决策面已经完美地将两种类别的样本点进行了区分，但是，如果此时训练样本中加入一个异常点，并且继续用SVM建模求解，则将会得到图10-9(b)中所示的分类决策面。可以发现，虽然此时决策面也成功地区分开了每个样本点，但是相较于图10-9(a)中的决策面却发生了剧烈的摆动，决策面到支持向量的距离也变得十分狭窄。&lt;/p&gt;&#xA;&lt;p&gt;在SVM中，将图10-9(a)和图10-9(b)中决策面到支持向量的间隔称为硬间隔（Hard Margin），即不允许任何样本出现错分的情况，即使可能导致过拟合。当然，理想情况下期望的应该是图10-9(c)中的这种情况，容许少量样本被错分从而得到一个次优解，而这个容忍的程度则通过目标函数来调节。或者再极端一点就是根本找不到一个超平面能够将样本无误地分开，必须错分一些样本点。此时图10-9(c)中决策面到支持向量的间隔便被称为软间隔（Soft Margin）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1042-最大化软间隔&#34;&gt;10.4.2 最大化软间隔&lt;a class=&#34;anchor&#34; href=&#34;#1042-%e6%9c%80%e5%a4%a7%e5%8c%96%e8%bd%af%e9%97%b4%e9%9a%94&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;从上面的介绍可知，如数据集中出现了异常点，则必将导致该异常点的函数间隔小于1，所以可以为每个样本引入一个松弛变量（${{\xi }_{i}}\ge 0$）来使函数间隔加上松弛变量大于或等于1。&#xA;&lt;/p&gt;&#xA;$$&#xA;{{y}^{(i)}}({{w}^{T}}{{x}^{(i)}}+b)\ge 1-{{\xi }_{i}}\tag{10-21}&#xA;$$&lt;p&gt;&#xA;此时的目标函数可以重新改写为如下形式&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp; \underset{w,b,\xi }{\mathop{\min }}\,\frac{1}{2}||w|{{|}^{2}}+C\sum\limits_{i=1}^{m}{{{\xi }_{i}}} \\[2ex] &#xA; \text{s}.\text{t}. \ &amp; {{y}^{(i)}}({{w}^{T}}{{x}^{(i)}}+b)\ge 1-{{\xi }_{i}},\ \ {{\xi }_{i}}\ge 0,\ i=1,2,...m&#xA;\end{aligned}\tag{10-22}&#xA;$$&lt;p&gt;&#xA;其中，$C＞0$称为惩罚系数，$C$越大对误分类样本的惩罚就越大，类似于正则化中的参数$\lambda$。可以发现，只要错分一个样本点，目标函数都将付出$C\xi_i$的代价，并且为了使得目标函数尽可能小，就需要整个惩罚项相对小，因此，如果使用较大的惩罚系数，则将会得到较窄的分类间隔，即惩罚力度大允许错分的样本数就会减少。如果使用较小的惩罚系数，则会得到相应较宽的分类间隔，即惩罚力度小允许错分的样本数量就会增多。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1043-svm软间隔示例代码&#34;&gt;10.4.3 SVM软间隔示例代码&lt;a class=&#34;anchor&#34; href=&#34;#1043-svm%e8%bd%af%e9%97%b4%e9%9a%94%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在10.2.3节内容中，我们大致列出了SVM分类器中常见的几个重要参数，其中$C$表示式(10-22)中的惩罚系数，它的作用是用来控制容忍决策面错分样本的程度，其值越大则模型越偏向于过拟合。如图10-10所示，此决策平面为$C$在不同取值下的决策面（分类间隔较大时$C=1$，分类间隔较小时$C=1000$）。参数&lt;code&gt;gamma&lt;/code&gt;为核函数系数，使用默认值即可；&lt;code&gt;coef0&lt;/code&gt;为多项式核和sigmoid核中的常数$r$，详细内容可参见10.8节内容。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-9.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 10-10 SVM不同惩罚系数下的决策平面&lt;/center&gt;&#xA;&lt;p&gt;下面我们将采用网格搜索的方式来选择一个最佳的SVM分类器对数据集iris进行分类。从上面对sklearn中SVM的API的介绍可知，&lt;code&gt;SVC&lt;/code&gt;中需要用到的超参数有5个，这里其取值分别设为&lt;code&gt;&#39;C&#39;:np.arange(1, 10, 5)&lt;/code&gt;、&lt;code&gt;&#39;Kernel&#39;:[&#39;rbf&#39;，&#39;linear&#39;，&#39;poly&#39;]&lt;/code&gt;、&lt;code&gt;&#39;degree&#39;:np.arange(1, 10, 2)&lt;/code&gt;、&lt;code&gt;&#39;gamma&#39;:[&#39;scale&#39;，&#39;auto&#39;]&lt;/code&gt;、&lt;code&gt;&#39;coef0&#39;:np.arange(-10, 10, 5)&lt;/code&gt;。由此便有2×3×5×2×4=240个备选模型。同时，这里以3折交叉验证进行训练，则一共需要拟合720次模型。完整示例代码可参见 &lt;code&gt;AllBooKCode/Chapter10/C10_soft_margin_svm.py&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 模型选择&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;首先，需要根据列举出的超参数在数据集上根据交叉验证搜索得到最优超参数组合，示例代码如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;model_selection&lt;/span&gt;(x_train, y_train):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; SVC()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     paras &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; {&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;C&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;arange(&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;              &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;kernel&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;rbf&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;linear&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;poly&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;              &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;degree&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;arange(&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;              &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;gamma&amp;#39;&lt;/span&gt;: [&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;scale&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;auto&amp;#39;&lt;/span&gt;],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;              &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;coef0&amp;#39;&lt;/span&gt;: np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;arange(&lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;)}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;     gs &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; GridSearchCV(model, paras, cv&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;, verbose&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;, n_jobs&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;9&lt;/span&gt;     gs&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x_train, y_train)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;10&lt;/span&gt;     &lt;span style=&#34;color:#007020&#34;&gt;print&lt;/span&gt;(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;best score:&amp;#39;&lt;/span&gt;, gs&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;best_score_,&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;best parameters:&amp;#39;&lt;/span&gt;, gs&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;best_params_)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在完成超参数搜索后，便能够得到一组最优的参数组合，输出结果如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>10.5 拉格朗日乘数法</title>
				<link>https://mlwithme.github.io/ml/chapter10/8b7a06412a9f4267/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/8b7a06412a9f4267/</guid>
				<description>&lt;h1 id=&#34;105-拉格朗日乘数法&#34;&gt;10.5 拉格朗日乘数法&lt;a class=&#34;anchor&#34; href=&#34;#105-%e6%8b%89%e6%a0%bc%e6%9c%97%e6%97%a5%e4%b9%98%e6%95%b0%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在正式介绍SVM算法的求解过程之前，我们先带着各位读者回顾一下拉格朗日乘数法，因为这同时也是第11章中用来对聚类算法求解的工具。可能对于一部分读者来讲，使用拉格朗日乘数法已经是很多年前的事情了，其中的细节也自然慢慢模糊了起来，但是对于拉格朗日乘数法的作用大家都不会忘记，那就是用来求解条件极值。既然大多数读者的记忆都停留在这个地方，那么我们下面就从条件极值开始简单地回顾一下拉格朗日乘数法。&lt;/p&gt;&#xA;&lt;p&gt;这里首先以一个例题来重温条件极值的求解过程。求解目标函数$z=xy$在约束条件下$x+y=1$的条件极值。&lt;/p&gt;&#xA;&lt;p&gt;首先列出拉格朗日函数&#xA;&lt;/p&gt;&#xA;$$&#xA;F(x,y,\lambda )=xy+\lambda (x+y-1)\tag{10-23}&#xA;$$&lt;p&gt;&#xA;由式(10-23)可得函数$F$的驻点为&#xA;&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp; {{F}_{x}}=y+\lambda =0 \\[1ex] &#xA; &amp; {{F}_{y}}=x+\lambda =0 \\[1ex] &#xA; &amp; {{F}_{\lambda }}=x+y-1=0 \\ &#xA;\end{aligned}\tag{10-24}&#xA;$$&lt;p&gt;&#xA;求解方程组式(10-24)便可求得$x$、$y$、$\lambda$分别为&#xA;&lt;/p&gt;&#xA;$$&#xA;x=\frac{1}{2};y=\frac{1}{2};\lambda =-\frac{1}{2}\tag{10-25}&#xA;$$&lt;p&gt;&#xA;由此可以知道，目标函数$z=xy$在约束条件下$x+y=1$的条件极值为$z=0.5\times0.5=0.25$。不过为什么可以通过这样的方法求得条件极值呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;1051-条件极值&#34;&gt;10.5.1 条件极值&lt;a class=&#34;anchor&#34; href=&#34;#1051-%e6%9d%a1%e4%bb%b6%e6%9e%81%e5%80%bc&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在数学优化问题中，拉格朗日乘数法（Lagrange Multiplier）是一种用于求解等式约束条件下局部最小（最大）值的策略。它的基本思想是通过将含约束条件的优化问题转化为无约束条件下的优化问题，以便于得到各个未知变量的梯度，进而求得极值点[4]，因此，用一句话总结： 拉格朗日乘数法是一种用来求解条件极值的工具。什么又是条件极值呢? 所谓条件极值是指，在一定约束条件下（通常为方程）目标函数的极值就被称为条件极值。&lt;/p&gt;&#xA;&lt;p&gt;如图10-11所示，目标函数$z=f(x,y)$在其定义域上的极大值（也是最大值）为$z=f(x_1,y_1)$，但如果此时对其施加一个约束条件$\varphi(x,y)=0$，这就等价地告诉函数$z=f(x,y)$取得极值点同时还要满足约束条件[5]，因此，$z=f(x,y)$在约束条件$\varphi(x,y)=0$下的极值点只能在$(x_0,y_0)$处获得，因为此时的$\varphi(x_0,y_0)=0$，而$\varphi(x_1,y_1)\neq0$不满足约束条件。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/p9-10.png&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 10-11 条件极值&lt;/center&gt;&#xA;&lt;p&gt;现在，相信各位读者对条件极值已经有了一个直观上的理解，接下来要探究的是怎么才能求得这个极值。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1052-求解条件极值&#34;&gt;10.5.2 求解条件极值&lt;a class=&#34;anchor&#34; href=&#34;#1052-%e6%b1%82%e8%a7%a3%e6%9d%a1%e4%bb%b6%e6%9e%81%e5%80%bc&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;通常来讲，对于包含等式约束条件目标函数的条件极值可以通过拉格朗日乘数法进行求解，因此，对于多元函数$Z=f(x,y,z,...)$在多个约束条件$\varphi(x,y,...)=0,\phi(x,y,...)=0,...$下的条件极值，利用拉格朗日乘数法求解的步骤可以总结为[5]&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 构建拉格朗日函数&lt;/strong&gt;&#xA;&lt;/p&gt;&#xA;$$&#xA;F(x,y,z,...,\lambda ,\mu ,...)=f(x,y,z,...)+\lambda \varphi (x,y,...)+\mu \phi (x,y,...)+...\tag{10-26}&#xA;$$&lt;p&gt;&#xA;其中，$\lambda$和$\mu$为拉格朗日乘子。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 求多元函数$F(x,y,z,...,\lambda,\mu,...)$的驻点&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;解如下方程组求得驻点$(x_0,y_0,z_0,...,\lambda_0,\mu_0,...)$&lt;/p&gt;&#xA;$$&#xA;\begin{cases}&#xA; {{F}_{x}}=0  \\&#xA;   {{F}_{y}}=0  \\&#xA;   \cdots   \\&#xA;   {{F}_{\lambda }}=0  \\&#xA;   \cdots   \\&#xA;\end{cases}\tag{10-27}&#xA;$$&lt;p&gt;此时$f(x_0,y_0,z_0,...)$便是可能的条件极值。&lt;/p&gt;</description>
			</item>
			<item>
				<title>10.6 对偶性与KKT条件</title>
				<link>https://mlwithme.github.io/ml/chapter10/40e977f0a2f84ac0/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/40e977f0a2f84ac0/</guid>
				<description>&lt;h1 id=&#34;106-对偶性与kkt条件&#34;&gt;10.6 对偶性与KKT条件&lt;a class=&#34;anchor&#34; href=&#34;#106-%e5%af%b9%e5%81%b6%e6%80%a7%e4%b8%8ekkt%e6%9d%a1%e4%bb%b6&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在第10.5节内容中，我们介绍了什么是拉格朗日乘数法及它的作用。同时还特意讲到，拉格朗日乘数法只能用来求解等式约束条件下的极值，但是当约束条件为不等式的时候又该如何进行求解呢？&lt;/p&gt;&#xA;&lt;h2 id=&#34;1061-广义拉格朗日乘数法&#34;&gt;10.6.1 广义拉格朗日乘数法&lt;a class=&#34;anchor&#34; href=&#34;#1061-%e5%b9%bf%e4%b9%89%e6%8b%89%e6%a0%bc%e6%9c%97%e6%97%a5%e4%b9%98%e6%95%b0%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;由拉格朗日乘数法可知，对于如下等式条件的约束问题&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp; \underset{w}{\mathop{\min }}\,\ \ f(w) \\ &#xA; \text{s}.\text{t}. \ \ &amp; {{h}_{i}}(w)=0,i=1,\cdots ,l. \\ &#xA;\end{aligned}\tag{10-28}&#xA;$$&lt;p&gt;&#xA;其中$w$是一个$n$维向量。&lt;/p&gt;&#xA;&lt;p&gt;从式(10-28)可以明显看出这是一个含有等式约束条件下的条件极值问题，因此用拉格朗日乘数法就能解决。进一步可构造如下拉格朗日函数&#xA;&lt;/p&gt;&#xA;$$&#xA;\mathcal{L}(w,\beta )=f(w)+\sum\limits_{i=1}^{l}{{{\beta }_{i}}}{{h}_{i}}(w)\tag{10-29}&#xA;$$&lt;p&gt;&#xA;其中$\beta_i$是拉格朗日乘子。最后，通过对式子中所有的参数求偏导，令其为0便可求解所有未知变量。&lt;/p&gt;&#xA;&lt;p&gt;此时，我们接着看如下优化问题&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA; &amp; \underset{w}{\mathop{\min }}\ f(w) \\[2ex] &#xA; \text{s}.\text{t}. \ &amp; {{g}_{i}}(w)\le 0,i=1,\cdots ,k. \\[2ex] &#xA; &amp; {{h}_{i}}(w)=0,i=1,\cdots ,l. \\ &#xA;\end{aligned}\tag{10-30}&#xA;$$&lt;p&gt;从式(10-30)可以看出，与式(10-28)明显不同的就是在式(10-30)中多了不等式约束条件，因此，为了解决这类问题需要定义如下所示的广义拉格朗日乘数法（Generalized Lagrangian）[2]，即&#xA;&lt;/p&gt;&#xA;$$&#xA;\mathcal{L}(w,\alpha ,\beta )=f(w)+\sum\limits_{i=1}^{k}{{{\alpha }_{i}}}{{g}_{i}}(w)+\sum\limits_{i=1}^{l}{{{\beta }_{i}}}{{h}_{i}}(w)\tag{10-31}&#xA;$$&lt;p&gt;&#xA;其中，$\alpha_i$和$\beta_i$都是拉格朗日乘子，但接下来的求解过程与之前就大相径庭了。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1062-原始优化问题&#34;&gt;10.6.2 原始优化问题&lt;a class=&#34;anchor&#34; href=&#34;#1062-%e5%8e%9f%e5%a7%8b%e4%bc%98%e5%8c%96%e9%97%ae%e9%a2%98&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;根据式(10-30)和式(10-31)考虑如下定义&#xA;&lt;/p&gt;&#xA;$$&#xA;{{\theta }_{\mathcal{P}}}(w)=\underset{\alpha ,\beta :{{\alpha }_{i}}\ge 0}{\mathop{\max }}\,\mathcal{L}(w,\alpha ,\beta )\tag{10-32}&#xA;$$&lt;p&gt;&#xA;式(10-32)表示的含义是求得最大化$\mathcal{L}(w,\alpha ,\beta )$时$\alpha$和$\beta$的取值，即$\alpha$和$\beta$作为自变量与$w$无关，最终求得的结果$\theta_{\mathcal{P}}$是关于$w$的函数。&lt;/p&gt;</description>
			</item>
			<item>
				<title>10.7 SVM优化问题</title>
				<link>https://mlwithme.github.io/ml/chapter10/b18d45a772574ddb/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/b18d45a772574ddb/</guid>
				<description>&lt;h1 id=&#34;107-svm优化问题&#34;&gt;10.7 SVM优化问题&lt;a class=&#34;anchor&#34; href=&#34;#107-svm%e4%bc%98%e5%8c%96%e9%97%ae%e9%a2%98&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;经过前面几节内容的介绍，我们已经知道了支持向量机背后的原理。为了求解SVM中的目标函数，我们还在前面两节内容中陆续介绍了拉格朗日乘数法和对偶性问题。接下来，将开始正式介绍SVM的求解过程。同时，为了便于各位读者循序渐进地了解整个求解过程，下面我们会依次介绍硬间隔和软间隔中目标函数的求解步骤。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1071-构造硬间隔广义拉格朗日函数&#34;&gt;10.7.1 构造硬间隔广义拉格朗日函数&lt;a class=&#34;anchor&#34; href=&#34;#1071-%e6%9e%84%e9%80%a0%e7%a1%ac%e9%97%b4%e9%9a%94%e5%b9%bf%e4%b9%89%e6%8b%89%e6%a0%bc%e6%9c%97%e6%97%a5%e5%87%bd%e6%95%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;由10.3节内容可知，SVM硬间隔最终的优化目标为[1]&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp; \underset{w,b}{\mathop{\min }}\,\frac{1}{2}||w|{{|}^{2}}\\[2ex] &#xA; \text{s}.\text{t}.\ &amp;{{y}^{(i)}}({{w}^{T}}{{x}^{(i)}}+b)\ge 1,i=1,2,...m &#xA;\end{aligned}\tag{10-64}&#xA;$$&lt;p&gt;由此可以得到广义的拉格朗日函数为&#xA;&lt;/p&gt;&#xA;$$&#xA;\mathcal{L}(w,b,\alpha )=\frac{1}{2}||w|{{|}^{2}}-\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}\left[ {{y}^{(i)}}({{w}^{T}}{{x}^{(i)}}+b)-1 \right]\tag{10-65}&#xA;$$&lt;p&gt;&#xA;其中${{\alpha }_{i}}\ge 0$为拉格朗日乘子，并且同时记为&#xA;&lt;/p&gt;&#xA;$$&#xA;{{g}_{i}}(w)=-{{y}^{(i)}}({{w}^{T}}{{x}^{(i)}}+b)+1\le 0\tag{10-66}&#xA;$$&lt;p&gt;&#xA;进一步可得原始问题的对偶优化问题为&#xA;&lt;/p&gt;&#xA;$$&#xA;{{d}^{*}}=\underset{\alpha ,{{\alpha }_{i}}\ge 0}{\mathop{\max }}\,\underset{w,b}{\mathop{\min }}\,\mathcal{L}(w,b,\alpha )\tag{10-67}&#xA;$$&lt;p&gt;&#xA;所以，为了求得对偶问题的解，需要按照式(10-67)中的顺序进行。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 关于参数$w$和$b$求$\mathcal{L}$的极小值$W(\alpha )$&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;为了求解式(10-67)中的对偶优化问题，首先需要最小化式(10-65)，即分别对$w$和$b$求偏导数并令其为0，有&#xA;&lt;/p&gt;&#xA;$$&#xA;\frac{\partial \mathcal{L}}{\partial w}=w-\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}{{y}^{(i)}}{{x}^{(i)}}=0 &#xA;\tag{10-68}&#xA;$$$$&#xA;\frac{\partial \mathcal{L}}{\partial b}=-\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}{{y}^{(i)}}=0\tag{10-69}&#xA;$$&lt;p&gt;进一步有&#xA;&lt;/p&gt;&#xA;$$&#xA;w=\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}{{y}^{(i)}}{{x}^{(i)}}\tag{10-70}&#xA;$$&lt;p&gt;&#xA;到此便得到了权重$w$的解析表达式，而它对于理解SVM中核函数的原理有着重要的作用。接着将式(10-69)和式(10-70)代入式(10-65)可得&#xA;&lt;/p&gt;&#xA;$$&#xA;W(\alpha )=\underset{w,b}{\mathop{\min }}\,\mathcal{L}(w,b,\alpha )=\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}-\frac{1}{2}\sum\limits_{i,j=1}^{m}{{{y}^{(i)}}}{{y}^{(j)}}{{\alpha }_{i}}{{\alpha }_{j}}{{({{x}^{(i)}})}^{T}}{{x}^{(j)}}\tag{10-71}&#xA;$$&lt;p&gt;&#xA;化简得到式(10-71)的具体步骤为&#xA;&lt;/p&gt;</description>
			</item>
			<item>
				<title>10.8 SVM核函数原理</title>
				<link>https://mlwithme.github.io/ml/chapter10/c53ed12f7bc04405/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/c53ed12f7bc04405/</guid>
				<description>&lt;h1 id=&#34;108-svm核函数原理&#34;&gt;10.8 SVM核函数原理&lt;a class=&#34;anchor&#34; href=&#34;#108-svm%e6%a0%b8%e5%87%bd%e6%95%b0%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在第10.2节内容中我们简单介绍了SVM中的线性不可分以及核函数的使用示例，在本节内容中我们将基于10.7节中所介绍的SVM权重参数的求解过程来详细介绍核函数的具体原理。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1081-将低维特征映射到高维空间&#34;&gt;10.8.1 将低维特征映射到高维空间&lt;a class=&#34;anchor&#34; href=&#34;#1081-%e5%b0%86%e4%bd%8e%e7%bb%b4%e7%89%b9%e5%be%81%e6%98%a0%e5%b0%84%e5%88%b0%e9%ab%98%e7%bb%b4%e7%a9%ba%e9%97%b4&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在10.2节中我们介绍到，核函数的作用就是将特征从低维空间映射到高维空间中，以此在高维空间中找到一个线性可分的超平面。例如可以通过一个函数$\phi(x)$将一维特征$x$映射到三维特征$x$、$x^2$、$x^3$。根据式(10-70)可知，假如此时已求得${{\alpha }_{i}}$和$b$，那么对一个新输入的样本点其预测结果为&#xA;&lt;/p&gt;&#xA;$$&#xA;{{w}^{T}}x+b=\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}{{y}^{(i)}}{{x}^{(i)}}x+b=\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}{{y}^{(i)}}\langle {{x}^{(i)}},x\rangle +b  &#xA;\tag{10-119}&#xA;$$&lt;p&gt;&#xA;其中${{x}^{(i)}}$表示训练集中的样本点（其实就是支持向量），$x$为新输入的样本点。$\langle a,b\rangle$表示$a$和$b$之间的内积（Inner Product）。当且仅当式(10-119)大于0时，新输入样本$x$的类别为$y=1$。&lt;/p&gt;&#xA;&lt;p&gt;按照上面提到的通过函数$\phi(x)$将低维映射到高维的思想，只需要在预测时将之前的$x$全部替换成$\phi(x)$，则此时有&#xA;&lt;/p&gt;&#xA;$$&#xA;y=\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}{{y}^{(i)}}\langle {{x}^{(i)}},x\rangle +b =\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}{{y}^{(i)}}\langle \phi ({{x}^{(i)}}),\phi (x)\rangle +b  &#xA;\tag{10-120}&#xA;$$&lt;p&gt;&#xA;虽然这样一来算是一定程度上解决了SVM中线性不可分的难题，但是又出现了一个新的问题——“维度爆炸”。&lt;/p&gt;&#xA;&lt;p&gt;假设现有数据集$X$，其样本点${{x}^{(i)}}$有3个维度，分别为$x_{1}^{(i)}$、$x_{2}^{(i)}$、$x_{3}^{(i)}$（下面简写为$x_1$、$x_2$、$x_3$）。现通过函数$\phi(x)$将其映射到某个9维空间中，并且假设映射后的9个维度分别为$x_1x_1$、$x_1x_2$、$x_1x_3$、$x_2x_1$、$x_2x_2$ 、 $x_2x_3$、$x_3x_1$、${{x}_{3}}{{x}_{2}}$、$x_3x_3$。如果此时要对新样本$z$进行预测，则首先需要对$\langle \phi(x),\phi(z)\rangle$进行计算，此时有&#xA;&lt;/p&gt;&#xA;$$&#xA;\begin{cases}&#xA;  \phi (x)={{[{{x}_{1}}{{x}_{1}},{{x}_{1}}{{x}_{2}},{{x}_{1}}{{x}_{3}},{{x}_{2}}{{x}_{1}},{{x}_{2}}{{x}_{2}},{{x}_{2}}{{x}_{3}},{{x}_{3}}{{x}_{1}},{{x}_{3}}{{x}_{2}},{{x}_{3}}{{x}_{3}}]}^{T}} \\[1ex]&#xA; \phi (z)={{[{{z}_{1}}{{z}_{1}},{{z}_{1}}{{z}_{2}},{{z}_{1}}{{z}_{3}},{{z}_{2}}{{z}_{1}},{{z}_{2}}{{z}_{2}},{{z}_{2}}{{z}_{3}},{{z}_{3}}{{z}_{1}},{{z}_{3}}{{z}_{2}},{{z}_{3}}{{z}_{3}}]}^{T}} \\[1ex] &#xA; \langle \phi (x),\phi (z)\rangle =[{{x}_{1}}{{x}_{1}}{{z}_{1}}{{z}_{1}}+{{x}_{1}}{{x}_{2}}{{z}_{1}}{{z}_{2}}+\cdots +{{x}_{3}}{{x}_{3}}{{z}_{3}}{{z}_{3}}] \\ &#xA;\end{cases}\tag{10-121}&#xA;$$&lt;p&gt;&#xA;此时各位读者应该会发现这个过程的计算量太大了，整体复杂度为$O(n^2)$（分别为$O(n^2)$、$O(n^2$)、$O(n)$），其中$n$为特征的维数，因此，若是在高维数据中进行更为复杂的映射，那么整个过程的时间复杂度将不可想象，而这就是“维度爆炸”。但是此时仔细想一想，“映射”和“预测”之间到底是什么关系？“映射”是作为一种思想将低维映射到高维，从而解决线性不可分到可分的问题，而“预测”时所计算的则是$\langle \phi(x),\phi(z)\rangle$，但其实它就是一个值。不管最后采用的是什么样的映射规则，在预测时都只需计算这么一个值，因此，假如能通过某种“黑箱”直接计算出这个值岂不最好？那么有没有这样的“黑箱”呢？当然有，这一“黑箱”操作被称为核技巧（Kernel Trick）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1082-svm中的核技巧&#34;&gt;10.8.2 SVM中的核技巧&lt;a class=&#34;anchor&#34; href=&#34;#1082-svm%e4%b8%ad%e7%9a%84%e6%a0%b8%e6%8a%80%e5%b7%a7&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;设$\mathcal{X}$是输入空间（欧氏空间$R^n$的子集或离散集合），又设$\mathcal{H}$为特征空间，如果存在一个从$\mathcal{X}$到$\mathcal{H}$的映射$\phi (x):\mathcal{X}\to \mathcal{H}$使对所有$x,z\in\mathcal{X}$，函数$K(x,z)$满足条件$K(x,z)=\phi(x)\cdot\phi(z)$，则称$K(x,z)$为核函数，$\phi(x)$称为映射函数[1]。&lt;/p&gt;&#xA;&lt;p&gt;说得简单一点，存在某个映射并能够找到一个与之相应的核函数$K(x,z)$来代替计算$\langle \phi(x),\phi(z)\rangle$，从而避免了上面出现“维度爆炸”的问题，因此，核函数可以看作是实现“黑箱”操作（核技巧）的工具。&lt;/p&gt;&#xA;&lt;p&gt;现假设式(10-121)中的两个样本点分别为$x=(1,2,3)^T,z=(2,3,4)^T$，则此时有&#xA;&lt;/p&gt;&#xA;$$&#xA;\begin{cases}&#xA;   \phi (x)&amp;={{({{x}_{1}}{{x}_{1}},{{x}_{1}}{{x}_{2}},{{x}_{1}}{{x}_{3}},{{x}_{2}}{{x}_{1}},{{x}_{2}}{{x}_{2}},{{x}_{2}}{{x}_{3}},{{x}_{3}}{{x}_{1}},{{x}_{3}}{{x}_{2}},{{x}_{3}}{{x}_{3}})}^{T}} \\[1ex] &#xA; &amp; ={{(1\times 1,1\times 2,1\times 3,2\times 1,2\times 2,2\times 3,3\times 1,3\times 2,3\times 3)}^{T}} \\[1ex] &#xA;  \phi (z)&amp;={{({{z}_{1}}{{z}_{1}},{{z}_{1}}{{z}_{2}},{{z}_{1}}{{z}_{3}},{{z}_{2}}{{z}_{1}},{{z}_{2}}{{z}_{2}},{{z}_{2}}{{z}_{3}},{{z}_{3}}{{z}_{1}},{{z}_{3}}{{z}_{2}},{{z}_{3}}{{z}_{3}})}^{T}} \\[1ex] &#xA; &amp; ={{(2\times 2,2\times 3,2\times 4,3\times 2,3\times 3,3\times 4,4\times 2,4\times 3,4\times 4)}^{T}} \\[1ex] &#xA;  \langle \phi (x),&amp;\phi (z)\rangle ={{({{x}_{1}}{{x}_{1}}{{z}_{1}}{{z}_{1}}+{{x}_{1}}{{x}_{2}}{{z}_{1}}{{z}_{2}}+\cdots +{{x}_{3}}{{x}_{3}}{{z}_{3}}{{z}_{3}})}} \\[1ex] &#xA; &amp; =4+12+24+12+36+72+24+72+144=400  &#xA;\end{cases}\tag{10-122}&#xA;$$&lt;p&gt;&#xA;同时，还可以通过另外一种方式来计算这个结果&lt;/p&gt;</description>
			</item>
			<item>
				<title>10.9 SMO算法求解SVM</title>
				<link>https://mlwithme.github.io/ml/chapter10/26d9b2b328a849c2/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/26d9b2b328a849c2/</guid>
				<description>&lt;h1 id=&#34;109-smo算法求解svm&#34;&gt;10.9 SMO算法求解SVM&lt;a class=&#34;anchor&#34; href=&#34;#109-smo%e7%ae%97%e6%b3%95%e6%b1%82%e8%a7%a3svm&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在10.7节内容中，我们分别就SVM中硬间隔与软间隔目标函数的求解过程进行了介绍，但是在实际应用过程中，从效率的角度来讲那样的做法显然是不可取的，尤其是在大规模数据样本和稀疏数据中[6]。在接下来的这节内容中，我们将介绍一种新的求解算法，即序列最小化优化算法来解决这一问题。&lt;/p&gt;&#xA;&lt;p&gt;序列最小优化算法（Sequential Minimal Optimization,SMO）于1998年由John Platt所提出，并且SMO算法初次提出的目的就是为了解决SVM的优化问题[7]。SMO算法是一种启发式的算法，它在求解过程中通过以分析的方式来定位最优解可能存在的位置，从而避免了传统方法在求解中所遭遇的大量数值计算问题，并且最终以迭代的方式来求得最优解。在正式介绍SMO算法之前，我们将先介绍SMO算法的基本原理——坐标上升算法（Coordinate Ascent）。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1091-坐标上升算法&#34;&gt;10.9.1 坐标上升算法&lt;a class=&#34;anchor&#34; href=&#34;#1091-%e5%9d%90%e6%a0%87%e4%b8%8a%e5%8d%87%e7%ae%97%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在2.5节内容中，我们详细地介绍了什么是梯度下降算法及梯度下降算法的作用。对于一个待优化的目标函数来讲，在初始化一个起始位置后，便可以以该点为基础每次沿着该点梯度的反方向向前移动一小步，以此来迭代求解，以便得到目标函数的全局（局部）最优解，而所谓的坐标上升（下降）算法可以看作初始位置只沿着其中的一个（或几个）方向移动来求解得到目标函数的全局（局部）最优解[8]，如图10-15所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/240816161404.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 10-15 梯度上升与坐标上升&lt;/center&gt;&#xA;&lt;p&gt;在图10-15中，曲线为目标函数$J({{w}_{1}},{{w}_{2}})=-0.5{{({{w}_{1}}-1)}^{2}}-{{(2{{w}_{2}}+1)}^{2}}-0.5{{({{w}_{1}}-{{w}_{2}})}^{2}}$的等高线，黑色箭头曲线为梯度上升算法最大化目标函数$J(w_1,w_2)$的求解过程，而黑色箭头折线为坐标上升算法最大化目标函数的求解过程。&lt;/p&gt;&#xA;&lt;p&gt;具体地，对于待求解目标函数$J({{w}_{1}},{{w}_{2}},...,{{w}_{n}})$来讲可以通过如下步骤进行求解。&lt;/p&gt;&#xA;&lt;p&gt;(1) 随机将向量$w=({{w}_{1}},{{w}_{2}},...,{{w}_{n}})$初始化为初始参数值。&lt;/p&gt;&#xA;&lt;p&gt;(2) 在${{w}_{1}},{{w}_{2}},...,{{w}_{n}}$中依次将${{w}_{i}},i=1,2,...,n$选择为变量并将其他参数固定为常量，然后求目标函数关于$w_i$的导数并令其为0求得$w_i$。&lt;/p&gt;&#xA;&lt;p&gt;(3) 重复执行步骤(2)直到目标函数收敛或者误差小于某一阈值结束。&lt;/p&gt;&#xA;&lt;p&gt;例如在上面这个示例中$w_1$和$w_2$的求解表达式分别为&#xA;&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&#xA;  &amp; w_{1}^{\text{new}}=-2w_{1}^{\text{old}}+w_2^{\text{old}}+1 \\[1ex]&#xA; &amp; w_{2}^{\text{new}}=-9w_{2}^{\text{old}}+w_1^{\text{new}}-4&#xA;\end{aligned}\tag{10-131}&#xA;$$&lt;p&gt;&#xA;那么在初始化一组$w_{1}^{\text{old}}$和$w_{2}^{\text{old}}$后，便可以通过式(10-131)来迭代以便求解得到$w_1$和$w_2$的解。&lt;/p&gt;&#xA;&lt;p&gt;同时，上述步骤(2)对于$w_i$顺序的选择这里采用了最为简单的按顺序依次进行，一种更优的做法便是每次选择余下常量中能够使目标函数产生最大增量的参数作为优化对象。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1092-smo算法原理&#34;&gt;10.9.2 SMO算法原理&lt;a class=&#34;anchor&#34; href=&#34;#1092-smo%e7%ae%97%e6%b3%95%e5%8e%9f%e7%90%86&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;根据10.7.3节中式(10-106)可知，SVM软间隔最终需要求解的目标函数为&lt;/p&gt;&#xA;$$&#xA;\begin{aligned}&amp; \underset{\alpha }{\mathop{\max }}\sum_{i=1}^m{{\alpha }_{i}}-\frac{1}{2}\sum\limits_{i,j=1}^{m}{{{y}^{(i)}}{{y}^{(j)}}{{\alpha }_{i}}{{\alpha }_{j}}}{{({{x}^{(i)}})}^{T}}{{x}^{(j)}} \\[1ex]\text{s}.\text{t}.\ \ &amp;0\le {{\alpha }_{i}}\le C,\ i=1,2,...,m\\[2ex]&amp;\sum\limits_{i=1}^{m}{{{\alpha }_{i}}}{{y}^{(i)}}=0 \\\end{aligned}\tag{10-132}&#xA;$$&lt;p&gt;&#xA;假设随机初始化后的$\alpha_i$均满足式(10-132)中的约束条件，现在通过坐标上升算法来求解$\alpha$。如果此时将${{\alpha }_{2}},...,{{\alpha }_{m}}$固定为常量，将$\alpha_1$ 固定为变量来求解$\alpha_1$ ，则能求解得到$\alpha_1$吗？答案是不能[2]。因为根据式(10-132)中第2个约束条件有&#xA;&lt;/p&gt;&#xA;$$&#xA;\alpha_1y^{(1)}=-\sum_{i=2}^m\alpha_iy^{(i)}\tag{10-133}&#xA;$$&lt;p&gt;&#xA;进一步，在式(10-133)两边同时乘上${{y}^{(1)}}$有&#xA;&lt;/p&gt;&#xA;$$&#xA;\alpha_1=-y^{(1)}\sum_{i=2}^m\alpha_iy^{(i)}\tag{10-134}&#xA;$$&lt;p&gt;&#xA;根据式(10-134)可知，${{\alpha }_{1}}$完全取决于${{\alpha }_{2}},...,{{\alpha }_{m}}$，如果${{\alpha }_{2}},...,{{\alpha }_{m}}$固定，也就意味着${{\alpha }_{1}}$也是固定的，因此，在这样的情况下每次至少需要同时选择两个参数为变量，同时再固定其他参数为常量，才能够最终求得所有参数。&lt;/p&gt;</description>
			</item>
			<item>
				<title>10.10 从零实现SVM分类算法</title>
				<link>https://mlwithme.github.io/ml/chapter10/215a1e15c0f2470d/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/215a1e15c0f2470d/</guid>
				<description>&lt;h1 id=&#34;1010-从零实现svm分类算法&#34;&gt;10.10 从零实现SVM分类算法&lt;a class=&#34;anchor&#34; href=&#34;#1010-%e4%bb%8e%e9%9b%b6%e5%ae%9e%e7%8e%b0svm%e5%88%86%e7%b1%bb%e7%ae%97%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;经过前面几节内容的介绍我们现在已经清楚了 SVM 的基本原理，并且根据第10.9.5节内容的讲解，对于SVM的求解过程也有了一定的认识，对于整个SVM内容的介绍就只差最后一步编码实现了。下面，我们将根据前面介绍的各个求解公式来一步一步介绍如何实现一个简单SVM分类器，完整示例代码可参见 &lt;code&gt;AllBooKCode/Chapter10/C16_svm_impl.py&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;10101-常见核函数实现&#34;&gt;10.10.1 常见核函数实现&lt;a class=&#34;anchor&#34; href=&#34;#10101-%e5%b8%b8%e8%a7%81%e6%a0%b8%e5%87%bd%e6%95%b0%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;根据10.8.4节内容介绍可知，常见的核函数有线性核函数、多项式核函数、高斯核函数和Sigmoid核函数等，这里我们以典型的线性核与高斯核函数为例进行实现，剩余的几种各位读者可以自行实现并验证。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;1. 线性核实现&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;线性核的实现比较简单，根据式(10-127)可知实现如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;kernel_linear&lt;/span&gt;(X, x):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;dot(X, x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行中&lt;code&gt;X&lt;/code&gt;为支持向量形状为&lt;code&gt;[m,n]&lt;/code&gt;或者&lt;code&gt;[n,]&lt;/code&gt;，&lt;code&gt;x&lt;/code&gt;为待预测样本形状为&lt;code&gt;[n,]&lt;/code&gt;。第2行是返回线性组合后的结果形状为&lt;code&gt;[n,]&lt;/code&gt;。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;2. 高斯核实现&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;高斯核的作用是将低维特征空间映射到无穷维的特征空间，根据式(10-125)可知实现如下：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;kernel_rbf&lt;/span&gt;(X, x):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; X&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;ndim &lt;span style=&#34;color:#666&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;         sigma &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt; X&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;         sigma &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt; X&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt;     k &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.5&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;sum((X &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt; x) &lt;span style=&#34;color:#666&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;, axis&lt;span style=&#34;color:#666&#34;&gt;=-&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt; sigma &lt;span style=&#34;color:#666&#34;&gt;**&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;exp(k)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第2~5行用来计算高斯核函数里的参数$\sigma$（这里参考的是sklearn中的做法）。第6~7行是返回经高斯核函数变换后的结果。&lt;/p&gt;&#xA;&lt;h2 id=&#34;10102-smo求解过程实现&#34;&gt;10.10.2 SMO求解过程实现&lt;a class=&#34;anchor&#34; href=&#34;#10102-smo%e6%b1%82%e8%a7%a3%e8%bf%87%e7%a8%8b%e5%ae%9e%e7%8e%b0&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在介绍完核函数的实现部分后再来SMO算法的求解实现过程。首先，需要根据第10.9.3和第10.9.4小节中的内容来实现相关辅助函数。&lt;/p&gt;&#xA;&lt;p&gt;根据式(10-120)可知，预测函数$f(x)$的编码实现为：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;f_x&lt;/span&gt;(X, y, alphas, x, b, kernel):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     k &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; kernel(X, x)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt;     r &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; alphas &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; y &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; k&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;sum(r) &lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt; b&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行&lt;code&gt;X&lt;/code&gt;和&lt;code&gt;y&lt;/code&gt;为训练集，&lt;code&gt;alphas&lt;/code&gt;为求解得到的参数，&lt;code&gt;x&lt;/code&gt;为预测样本，&lt;code&gt;b&lt;/code&gt;为偏置，&lt;code&gt;kernel()&lt;/code&gt;为核函数。&lt;/p&gt;&#xA;&lt;p&gt;进一步，根据式(10-147)和式(10-149)可知，$\eta$和$E_i$以及$\alpha_2^{new}$的编码实现为：&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#f0f0f0;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;compute_eta&lt;/span&gt;(x_1, x_2, kernel):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; kernel(x_1, x_1) &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; kernel(x_1, x_2) &lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt; kernel(x_2, x_2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;3&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;4&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;compute_E_i&lt;/span&gt;(f_x_i, y_i):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;5&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; f_x_i &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt; y_i&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;6&lt;/span&gt; &#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;7&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;compute_alpha_2&lt;/span&gt;(alpha_2, E_1, E_2, y_2, eta):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;8&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; alpha_2 &lt;span style=&#34;color:#666&#34;&gt;+&lt;/span&gt; (y_2 &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; (E_1 &lt;span style=&#34;color:#666&#34;&gt;-&lt;/span&gt; E_2) &lt;span style=&#34;color:#666&#34;&gt;/&lt;/span&gt; eta)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;同时，根据式(10-151)和式(10-152)可知，计算$L$和$H$的编码实现如下：&lt;/p&gt;</description>
			</item>
			<item>
				<title>引用</title>
				<link>https://mlwithme.github.io/ml/chapter10/dce7180d4eb047d7/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter10/dce7180d4eb047d7/</guid>
				<description>&lt;h1 id=&#34;引用&#34;&gt;引用&lt;a class=&#34;anchor&#34; href=&#34;#%e5%bc%95%e7%94%a8&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;[1] 李航.统计学习方法［M］.2版.北京： 清华大学出版社,2019.&lt;/p&gt;&#xA;&lt;p&gt;[2] Andrew Ng,Machine Learning,Stanford University,CS229,Spring 2019.&lt;/p&gt;&#xA;&lt;p&gt;[3] PEDREGOSA.scikitlearn: Machine Learning in Python［J］.JMLR 12,2011: 28252830.&lt;/p&gt;&#xA;&lt;p&gt;[4] &lt;a href=&#34;https://en.wikipedia.org/wiki/Lagrange_multiplier&#34;&gt;https://en.wikipedia.org/wiki/Lagrange_multiplier&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[5] 徐小湛.高等数学学习手册［M］.北京： 科学出版社,2005.&lt;/p&gt;&#xA;&lt;p&gt;[6] John C. Platt. Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines,Microsoft Research Technical Report MSRTR9814.&lt;/p&gt;&#xA;&lt;p&gt;[7] &lt;a href=&#34;https://en.wikipedia.org/wiki/Sequential_minimal_optimization&#34;&gt;https://en.wikipedia.org/wiki/Sequential_minimal_optimization&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[8] &lt;a href=&#34;https://en.wikipedia.org/wiki/Coordinate_descent&#34;&gt;https://en.wikipedia.org/wiki/Coordinate_descent&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;[9] 邓乃扬,田英杰. 数据挖掘中的新方法：支持向量机［M］. 北京： 科学出版社,2004.&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
