<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 13 章 自训练与标签传播 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/ml/chapter13/</link>
		<description>Recent content in 第 13 章 自训练与标签传播 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/ml/chapter13/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>13.1 Self-Training 自训练算法</title>
				<link>https://mlwithme.github.io/ml/chapter13/8d71301c2e414efe/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter13/8d71301c2e414efe/</guid>
				<description>&lt;p&gt;经过前面几个章节的介绍，相信各位读者对于有监督学习和无监督学习这两类机器学习算法已经有了清晰地认识，即前者需要通过样本的真实标签来学习模型中的参数而后者则不需要。因为我们可以根据不同的场景和用途来选择不同类型的算法进行建模。在本章内容中，将会介绍另外一种介于有监督和无监督算法之间的一类机器学习算法——半监督学习（Semi-supervised learning ）。&lt;/p&gt;&#xA;&lt;p&gt;当大家在谈论到分类或者回归任务时，绕不开的一个话题就是标注数据。在有监督的学习任务中，通常都需要大量的标注数据才能有效地使得模型学习到输入$x$到输出$y$之间的映射关系。然而，在实际情况中这一条件却很难满足，因为数据标注既耗费时间同时成本又高昂，并且在很多场景下还需要引入领域专家来对数据进行标注。因此，在这样的情境下半监督学习方式就应运而生了，而它的核心思想就是通过少量有标签的数据和大量无标签的数据来完成整个模型训练。&lt;/p&gt;&#xA;&lt;h1 id=&#34;131-self-training-自训练算法&#34;&gt;13.1 Self-Training 自训练算法&lt;a class=&#34;anchor&#34; href=&#34;#131-self-training-%e8%87%aa%e8%ae%ad%e7%bb%83%e7%ae%97%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;Self-Training是一种通过迭代扩展训练集来提升模型性能的半监督学习方法，从本质上来讲Self-Training并不是一种特定的算法而是一种训练策略，也就是说任何一种有监督算法都可以通过自训练这一策略来进行学习，如图13-1所示便是Self-Training的学习路线图。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;470&#34; src=&#34;https://mlwithme.github.io/images/ml/240530154540.jpg&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 13-1 Self-Training学习路线图&lt;/center&gt;&#xA;&lt;h2 id=&#34;1311-self-training-算法思想&#34;&gt;13.1.1 Self-Training 算法思想&lt;a class=&#34;anchor&#34; href=&#34;#1311-self-training-%e7%ae%97%e6%b3%95%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;Self-Training算得上是几种半监督学习方法中最简单易懂的一种，其核心思想是先通过少量的标注数据来训练一个弱的分类器，然后再通过这个弱分类器来对无标签的样本进行标注，当满足一定条件时（例如预测概率大于某个阈值）则将预测的结果作为该样本的真实标签，接着再次以当前已有的标注数据来训练模型并对无标签的样本进行标注并反复迭代，最后直到达到停止条件时结束。整个Self-Training的迭代过程可以通过图13-2来进行表示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&#xA;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/22061011946.jpg&#34;/&gt;&#xA;&lt;/div&gt;&#xA;&lt;center&gt;&#xA;  图 13-2 Self-Training迭代流程图&#xA;&lt;/center&gt;&#xA;&lt;p&gt;如图13-2所示，第1步先通过少量的标注数据来训练一个弱的分类器；第2步再用这个弱分类器来对无标签的数据样本进行预测，并按某种策略将预测得到的部分标签作为样本的真实标签；第3步则是利用当前所有有标签的样本（包括第2步处理后的样本）来训练分类器，如果达到停止条件则进入第4步，否则继续进入第2步对无标签的样本进行预测；第4步是利用第3步训练得到的分类器在测试集上进行评估。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1312-self-training-示例代码&#34;&gt;13.1.2 Self-Training 示例代码&lt;a class=&#34;anchor&#34; href=&#34;#1312-self-training-%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在介绍完Self-Training算法的思想后，下面来介绍在sklearn中如何使用Self-Training模块，以下完整代码可参见 &lt;code&gt;AllBooKCode/Chapter13/C01_self_training.py&lt;/code&gt; 文件。在sklearn中，可以通过&lt;code&gt;sklearn.semi_supervised&lt;/code&gt;中的&lt;code&gt;SelfTrainingClassifier&lt;/code&gt;模块来使用Self-Training算法，示例代码如下：&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;load_data&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;2&lt;/span&gt;     x, y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_iris(return_X_y&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&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;     x_train, x_test, y_train, y_test &lt;span style=&#34;color:#666&#34;&gt;=&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;         train_test_split(x, y, test_size&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.3&lt;/span&gt;, random_state&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2022&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;     rng &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;random&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;RandomState(&lt;span style=&#34;color:#40a070&#34;&gt;20&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;     random_unlabeled_points &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; rng&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rand(y_train&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;]) &lt;span style=&#34;color:#666&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;0.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;7&lt;/span&gt;     y_mixed &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; deepcopy(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;8&lt;/span&gt;     y_mixed[random_unlabeled_points] &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;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;9&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x_train, x_test, y_train, y_test, y_mixed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第2~4行分别是读取数据集并划分成训练集和测试集两个部分。第5~8行是确定$30\%$的样本，并将其原始的正确标签重置为-1，即没有标签的样本。第9行则是返回最后处理完成的结果。&lt;/p&gt;&#xA;&lt;p&gt;进一步，这里使用第10章中介绍的SVM来作为分类器利用Self-Training策略来训练模型，示例代码如下：&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;test_self_training&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;2&lt;/span&gt;     x_train, x_test, y_train, y_test, y_mixed &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_data()&#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;     svm &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; SVC(probability&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&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&#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;np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;sum(y_mixed &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;1&lt;/span&gt;)&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;5&lt;/span&gt;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; SelfTrainingClassifier(svm, threshold&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.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;6&lt;/span&gt;     model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x_train, y_mixed)&#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;     y_pred &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;8&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;accuracy_score(y_pred, 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;9&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;10&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;__main__&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;11&lt;/span&gt;     test_self_training()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第3行则是定义一个分类模型，这里是以SVM为例并通过参数&lt;code&gt;probability&lt;/code&gt;指定需要返回每个样本的预测概率，而这对于Self-Training训练策略来说也是必须的。第5~6行则是先实例化了一个&lt;code&gt;SelfTrainingClassifier&lt;/code&gt;类对象，并指定了分类器和概率阈值，即将预测概率大于阈值的情况视为预测正确。第7~8行则是在测试集上对训练好的模型进行评估。&lt;/p&gt;</description>
			</item>
			<item>
				<title>13.2 Label Propagation算法</title>
				<link>https://mlwithme.github.io/ml/chapter13/87fdcf0be1c34644/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter13/87fdcf0be1c34644/</guid>
				<description>&lt;h1 id=&#34;132-label-propagation算法&#34;&gt;13.2 Label Propagation算法&lt;a class=&#34;anchor&#34; href=&#34;#132-label-propagation%e7%ae%97%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在上一节内容中，我们详细地介绍了半监督学习算法中一种用于分类问题的Self-Training算法，其核心思想是先通过少量的标注数据来训练一个弱分类器，其次再通过这个弱分类器来对无标签样本进行标注并选择其中的有效部分作为样本的真实标签，然后再次以当前已有的标注数据来训练模型并对无标签的样本进行标注并反复迭代，最后直到达到停止条件时结束。在本节内容中，将会介绍另外一种基于图结构的半监督学习模型——标签传播算法（Label Propagation）。&lt;/p&gt;&#xA;&lt;p&gt;如图13-3所示便是标签传播算法的学习路线图，我们将先介绍其对应的思想以及sklearn的建模过程，然后再来介绍其背后的原理、计算示例和收敛性证明等过程，最后再一步步来从零实现整个算法。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;500&#34; src=&#34;https://mlwithme.github.io/images/ml/240427164304.jpg&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 13-3 标签传播算法学习路线图&lt;/center&gt;&#xA;&lt;h2 id=&#34;1321-label-propagation算法思想&#34;&gt;13.2.1 Label Propagation算法思想&lt;a class=&#34;anchor&#34; href=&#34;#1321-label-propagation%e7%ae%97%e6%b3%95%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;标签传播算法的基本思想认为，在样本空间中距离越是相近的样本点越有可能具有相同的样本标签[1]，而这一点也非常符合现实直觉。因此，在这样的假设条件下可以通过构建一个有向完全图来表示样本点之间的位置关系，其中图上的结点表示样本点，边表示两个结点之间的权重（样本点相距越近，则其对应的权重值便越大）。进一步，根据该权重图可以构造得到一个概率迁移矩阵$T$，其中$T_{ij}$表示样本点$j$转移到样本点$i$的概率。如果结点$i$是一个无标签的样本点，结点$j$是一个有标签的样本点，那么此时便可以根据$T_{ij}$的大小来判断样本点$i$是否与$j$具有相同的样本标签。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;420&#34; src=&#34;https://mlwithme.github.io/images/ml/22062516321.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 13-4 标签传播算法思想图&lt;/center&gt;&#xA;&lt;p&gt;如图13-4所示，黑色圆点和白色圆点分别表示已知标签和未知标签的样本点，箭头表示传播方向，数值表示转移概率。根据标签传播算法的思想，白色样本点的所属类别可以通过黑色样本点到白色样本点的转移概率来进行确定。例如对于图13-4中间的白色样本点来说，其所属类别最有可能便是由右下角的黑色样本点所确定，因为此时对应的转移概率0.76在所有可能的转移情况中最大。&lt;/p&gt;&#xA;&lt;p&gt;可以看出，标签传播算法的关键在于建立任意两个样本点之间转移的概率，然后通过已知标签的样本点来推断未知标签的样本点。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1322-label-propagation示例代码&#34;&gt;13.2.2 Label Propagation示例代码&lt;a class=&#34;anchor&#34; href=&#34;#1322-label-propagation%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;sklearn.semi_supervised&lt;/code&gt;中来导入标签传播算法&lt;code&gt;LabelPropagation&lt;/code&gt;模块，以下完整示例代码可参见 &lt;code&gt;AllBooKCode/Chapter13/C03_label_propagation.py&lt;/code&gt; 文件。同时，需要构造半监督学习所需要使用到的训练集，即将部分样本的标签置为-1，这是由模型在实现时所确定，示例代码如下：&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;load_data&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;2&lt;/span&gt;     x, y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_iris(return_X_y&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&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;     x_train, x_test, y_train, y_test &lt;span style=&#34;color:#666&#34;&gt;=&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;         train_test_split(x, y, test_size&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.3&lt;/span&gt;, random_state&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2022&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;     rng &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;random&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;RandomState(&lt;span style=&#34;color:#40a070&#34;&gt;20&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;     random_unlabeled_points &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; rng&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rand(y_train&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;]) &lt;span style=&#34;color:#666&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;0.8&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;     y_mixed &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; deepcopy(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;8&lt;/span&gt;     y_mixed[random_unlabeled_points] &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;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;9&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x_train, x_test, y_train, y_test, y_mixed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第2~4行是导入原始数据集并进行训练集和测试集的划分。第5~8行则是将训练集中$80\%$样本的标签重置为-1，同时也保留了原始重置之前的标签便于后续在训练集上测试模型的效果。第9行是返回最后各个部分的结果。&lt;/p&gt;&#xA;&lt;p&gt;进一步，可以导入&lt;code&gt;LabelPropagation&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;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;sklearn.semi_supervised&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; LabelPropagation&#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;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;test_label_propagation&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;     x_train, x_test, y_train, y_test, y_mixed &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_data()&#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;     model &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; LabelPropagation(gamma&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;20&lt;/span&gt;,max_iter&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;1000&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;     model&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x_train, y_mixed)&#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;     y_pred &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_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;7&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;accuracy_score(y_pred, y_train)&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;8&lt;/span&gt;     y_pred &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;9&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;accuracy_score(y_pred, 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;10&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;11&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#bb60d5&#34;&gt;__name__&lt;/span&gt; &lt;span style=&#34;color:#666&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;__main__&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;12&lt;/span&gt;     test_label_propagation()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行是导入标签传播算法模块。第4行是实例化&lt;code&gt;LabelPropagation&lt;/code&gt;模型，其中&lt;code&gt;gamma&lt;/code&gt;便是式(13-1)中的$\sigma$，&lt;code&gt;max_iter&lt;/code&gt;指的是模型（第13.3.3节中计算标签矩阵$Y$）的迭代次数。第5行是模型的拟合过程。第6~9行是分别在训练集和测试集上的预测结果。&lt;/p&gt;</description>
			</item>
			<item>
				<title>13.3 Label Spreading 算法</title>
				<link>https://mlwithme.github.io/ml/chapter13/7fc8b0fc47d2427c/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter13/7fc8b0fc47d2427c/</guid>
				<description>&lt;h1 id=&#34;133-label-spreading-算法&#34;&gt;13.3 Label Spreading 算法&lt;a class=&#34;anchor&#34; href=&#34;#133-label-spreading-%e7%ae%97%e6%b3%95&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在上一节内容中，我们介绍了一种基于图结构的标签传播算法。标签传播算法的核心思想认为，在样本空间中距离越相近的样本点越有可能具有相同的标签。因此，对于样本空间中的所有样本点，可以通过构建一个有向完全图来表示样本点之间的位置关系，并以此为基础构建一个概率迁移矩阵来确定未知标签的所属类别。在本节内容中，我们将继续学习另外一种同样也是基于图结构的标签扩散算法（Label Spreading）[1]。&lt;/p&gt;&#xA;&lt;p&gt;如图13-10所示便是标签扩散算法的学习路线图，我们将先介绍其对应的思想以及sklearn的建模过程，然后再来介绍其背后的原理、计算示例和收敛性证明等过程，最后再一步步来从零实现整个算法。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;500&#34; src=&#34;https://mlwithme.github.io/images/ml/240427164441.jpg&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 13-10 标签扩散算法学习路线图&lt;/center&gt;&#xA;&lt;h2 id=&#34;1331-label-spreading算法思想&#34;&gt;13.3.1 Label Spreading算法思想&lt;a class=&#34;anchor&#34; href=&#34;#1331-label-spreading%e7%ae%97%e6%b3%95%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;从本质上来讲，标签传播和标签扩散这两种算法在思想上并没有太大的差别，都是基于样本点的空间位置来构造得到概率迁移矩阵，然后通过概率迁移矩阵用已知标签的样本点来确定未知标签样本点的类别。相比较于标签传播算法来说，标签扩散算法的改进点表现在两个方面：①使用了标准化的拉普拉斯矩阵（Laplace Matrix ）来作为概率迁移矩阵，其目的是能够使得在迭代过程中标签的传播更加平滑；②加入了类似于正则化策略的惩罚参数来增加模型的泛化能力。由于标签扩散算法在思想上与标签传播算法并没有什么本质区别，下面首先直接来看标签扩散算法的示例用法。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1332-label-spreading-示例代码&#34;&gt;13.3.2 Label Spreading 示例代码&lt;a class=&#34;anchor&#34; href=&#34;#1332-label-spreading-%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;sklearn.semi_supervised&lt;/code&gt;中来导入标签传播算法&lt;code&gt;LabelSpreading&lt;/code&gt;模块。接下来，需要构造半监督学习所需要使用到的训练集，即将部分样本的标签置为-1，示例代码如下：&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;load_data&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;2&lt;/span&gt;     x, y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_iris(return_X_y&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;True&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;     x_train, x_test, y_train, y_test &lt;span style=&#34;color:#666&#34;&gt;=&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;         train_test_split(x, y, test_size&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.3&lt;/span&gt;, random_state&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2022&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;     rng &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; np&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;random&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;RandomState(&lt;span style=&#34;color:#40a070&#34;&gt;20&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;     random_unlabeled_points &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; rng&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;rand(y_train&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;shape[&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;]) &lt;span style=&#34;color:#666&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;0.8&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;     y_mixed &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; deepcopy(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;8&lt;/span&gt;     y_mixed[random_unlabeled_points] &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;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;9&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x_train, x_test, y_train, y_test, y_mixed&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第2~4行是导入原始并进行训练集和测试集的划分。第5~8行则是将训练集中$80\%$样本的标签重置为-1，同时也保留了原始重置之前的标签便于后续在训练集上测试模型的效果。第9行是返回最后各个部分的结果。&lt;/p&gt;&#xA;&lt;p&gt;进一步，便可以导入&lt;code&gt;LabelSpreading&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;test_label_spreding&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;2&lt;/span&gt;     x_train, x_test, y_train, y_test, y_mixed &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; load_data()&#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;     ls &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; LabelSpreading(alpha&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.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;4&lt;/span&gt;     ls&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit(x_train, y_mixed)&#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;&amp;#34;Label Spreading&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:#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;ls&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;score(x_train, y_train)&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;7&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;ls&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;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;上述代码运行结束后便会得到类似如下所示的结果：&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
