<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title>第 12 章 降维算法 on 《从零学AI指南手册》</title>
		<link>https://mlwithme.github.io/ml/chapter12/</link>
		<description>Recent content in 第 12 章 降维算法 on 《从零学AI指南手册》</description>
		<generator>Hugo</generator>
		<language>zh_CN</language>
		
		
		
		
			<atom:link href="https://mlwithme.github.io/ml/chapter12/index.xml" rel="self" type="application/rss+xml" />
			<item>
				<title>12.1 主成分分析</title>
				<link>https://mlwithme.github.io/ml/chapter12/9478de824edd44c6/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter12/9478de824edd44c6/</guid>
				<description>&lt;p&gt;在前面几章内容中，我们陆续介绍了无监督算法中几种常见的聚类算法，包括基于Kmeans、Kmeans++、WKmeans、DBSCAN和HCA聚类算法。在接下来的这篇文章中，我们将会继续介绍无监督算法中的另外一种经典算法——主成分分析（Principal Component Analysis, PCA）算法。那什么又是PCA算法呢？&lt;/p&gt;&#xA;&lt;h1 id=&#34;121-主成分分析&#34;&gt;12.1 主成分分析&lt;a class=&#34;anchor&#34; href=&#34;#121-%e4%b8%bb%e6%88%90%e5%88%86%e5%88%86%e6%9e%90&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在机器学习的建模过程中我们通常会遇到这样两个问题：①对于高维数据来说如何对其进行可视化？②对于包含冗余特征的数据集来说如何进行特征筛选？尽管对于第②个问题来说可以通过决策树这样的树模型来进行特征筛选，但是此时却需要样本对应的真实标签，属于有监督的学习过程。此时，通过PCA算法这两个问题便可以迎刃而解。如图12-1所示便是主成分分析算法的学习路线图，我们将先介绍其对应的思想以及sklearn的建模过程，然后再来介绍其背后的原理与求解过程，最后一步步来实现主成分分析算法。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/240427161728.jpg&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 12-1 主成分分析算法学习路线图&lt;/center&gt;&#xA;&lt;h2 id=&#34;1211-pca算法思想&#34;&gt;12.1.1 PCA算法思想&lt;a class=&#34;anchor&#34; href=&#34;#1211-pca%e7%ae%97%e6%b3%95%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;主成分分析算法的核心思想在于“主成分”3个字，通俗点讲就是通过一种合适的方法将高维度的特征转换为低维度的特征，因此主成分分析算法实质上也是一种降维算法。这里值得注意的是，我们描述的是将高维特征“转换”为低维特征，而不是从高维特征中选择部分特征来作为数据集的特征表示，这与树模型的特征选择有所不同。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/22052839980.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 12-2 二维PCA算法思想图（一）&lt;/center&gt;&#xA;&lt;p&gt;如图12-2所示，黑色原点为某数据集分布在二维平面中的场景。现在，假如只能让你用一个维度来对这些样本点进行表示，那应该是哪个维度呢？由于降维后仅剩下一个维度，因此我们可以尝试过原点做一条直线并旋转一周，然后从所有情况中选择最优的那条直线作为降维后的坐标轴，最后再将原始样本点投影到新坐标轴的投影点作为降维后的样本表示，如图12-3所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/22052812300.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 12-3 二维PCA算法思想图（二）&lt;/center&gt;&#xA;&lt;p&gt;如图12-3所示，假设以$z_1$为起点顺时针旋转一周，我们便可以得到4条有代表性的投影方向，分别是$z_1,x,y,z_2$。对于这4种情况来说，相信绝大多数读者都会选择$z_1$所在的方向，不过这是为什么呢？很多读者可能会说感觉上是，我们只能说你的感觉没有错。不过真实的原因是在于降维算法的准则就是要使得降维后的特征表示能够尽可能多地保留原有数据的结构信息，直观上来看就是样本之间间距较大重叠部分较少。&lt;/p&gt;&#xA;&lt;p&gt;例如对于图12-3所示的样本点来说，如果将其投影到$z_2$所在的方向，那么大多数样本点将会密集地聚在一起从而无法有效区分。但是，如果将这些样本点投影到$z_1$所在的方向，那么绝大多数样本在新的投影空间中依旧能够有效地进行区分。如图12-4所示便是在$z_1$方向投影后的结果。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;270&#34; src=&#34;https://mlwithme.github.io/images/ml/240529192003.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 12-4 二维PCA算法思想图（三）&lt;/center&gt;&#xA;&lt;p&gt;如图12-4所示，黑色圆点便是图12-3中各个样本在$z_1$方向投影后的结果。此时，我们便可以仅通过一个坐标轴来表示这些样本，从而实现了降维的目的。&lt;/p&gt;&#xA;&lt;p&gt;进一步，如图12-5所示，如果想要对这些三维空间中的样本点进行降维处理，那么同样也要找到一个最优的投影平面然后进行投影处理。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;400&#34; src=&#34;https://mlwithme.github.io/images/ml/22052806242.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 12-5 三维PCA算法思想图（一）&lt;/center&gt;&#xA;&lt;p&gt;如图12-5所示，如果需要对于这些三维空间中的样本点进行降维，那么同样需要找到其对应的最优平面，如图12-6所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;380&#34; src=&#34;https://mlwithme.github.io/images/ml/22052910030.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 12-6 三维PCA算法思想图（二）&lt;/center&gt;&#xA;&lt;p&gt;从图12-6中可以看出，只有将原始样本投影到$z_0$与$z_1$所构成的平面中才能最大程度上地保留原始样本点的结构信息，投影后的结果如图12-7所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;350&#34; src=&#34;https://mlwithme.github.io/images/ml/22052952588.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 12-7 三维PCA算法思想图（三）&lt;/center&gt;&#xA;&lt;p&gt;如图12-7所示便是上面三维样本点在二维平面上的投影结果。上述可视化代码可参见 &lt;code&gt;AllBooKCode/Chapter12/C01_PCA_visualization.py&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;p&gt;以上就是整个PCA降维算法的核心思想，总结起来就是对于$n$维特征数据来说，可以通过PCA算法找到其对应的$n$个主要成分，然后根据需要选择前$k$个最重要的成分，最后再将原始数据投影到由这$k$个主要成分所构成的$k$维空间中便达到了降维的目的。到此，PCA算法的核心思想就介绍完了，下面来看如何在sklearn中使用PCA模型。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1212-pca示例代码&#34;&gt;12.1.2 PCA示例代码&lt;a class=&#34;anchor&#34; href=&#34;#1212-pca%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.decomposition&lt;/code&gt;中的&lt;code&gt;PCA&lt;/code&gt;模块来完成整个建模过程。下面我们以iris数据集在决策树上的分类为例，分别展示降维前和降维后分类模型的效果，完整示例代码可参见 &lt;code&gt;AllBooKCode/Chapter12/C02_PCA_train.py&lt;/code&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;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;sklearn.decomposition&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; PCA&#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;from&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;sklearn.datasets&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; load_iris&#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; &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.model_selection&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; train_test_split&#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; &#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;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;load_data&lt;/span&gt;(reduction&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;False&lt;/span&gt;, n_components&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;6&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;7&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;8&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;9&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;if&lt;/span&gt; reduction:&#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;         pca &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; PCA(n_components)&#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;         x_train &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; pca&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit_transform(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;12&lt;/span&gt;         x_test &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; pca&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;transform(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;13&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&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1行是导入&lt;code&gt;PCA&lt;/code&gt;模块。第5行中&lt;code&gt;n_components&lt;/code&gt;表示降维的维度。第6~8行是载入原始数据集，并分割成训练集和测试集。第9~12行是根据条件判断是否对数据进行降维，同时需要注意的是在训练集&lt;code&gt;x_train&lt;/code&gt;上使用的是&lt;code&gt;fit_trainsform&lt;/code&gt;方法（即先&lt;code&gt;fit&lt;/code&gt;再&lt;code&gt;transformer&lt;/code&gt;），而在测试集&lt;code&gt;x_test&lt;/code&gt;上则是直接使用在训练集上得到的参数（投影平面）进行降维。第13行是返回训练集和测试集。&lt;/p&gt;</description>
			</item>
			<item>
				<title>12.2 基于核函数的主成分分析</title>
				<link>https://mlwithme.github.io/ml/chapter12/909356aa90fe456a/</link>
				<pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
				<guid>https://mlwithme.github.io/ml/chapter12/909356aa90fe456a/</guid>
				<description>&lt;h1 id=&#34;122-基于核函数的主成分分析&#34;&gt;12.2 基于核函数的主成分分析&lt;a class=&#34;anchor&#34; href=&#34;#122-%e5%9f%ba%e4%ba%8e%e6%a0%b8%e5%87%bd%e6%95%b0%e7%9a%84%e4%b8%bb%e6%88%90%e5%88%86%e5%88%86%e6%9e%90&#34;&gt;#&lt;/a&gt;&lt;/h1&gt;&#xA;&lt;p&gt;在12.1节内容中我们详细介绍了PCA算法的思想原理，在本节内容中将会介绍另外一种基于PCA算法改进的核主成分分析算法（Kernel Principal Component Analysis, KPCA）[1]。如图12-12便是基于核函数的主成分分析算法的学习路线图，首先仍旧是先介绍KPCA背后的思想和在sklearn中的用法，然后介绍KPCA的原理与求解过程，最后介绍如何从零实现KPCA算法。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;550&#34; src=&#34;https://mlwithme.github.io/images/ml/240529203655.jpg&#34;/&gt; &lt;/div&gt;&lt;center&gt;图 12-12 核主成分分析算法学习路线图&lt;/center&gt;&#xA;&lt;h2 id=&#34;1221-kpca算法思想&#34;&gt;12.2.1 KPCA算法思想&lt;a class=&#34;anchor&#34; href=&#34;#1221-kpca%e7%ae%97%e6%b3%95%e6%80%9d%e6%83%b3&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;从名字来看，KPCA算法是在原有的PCA降维算法中引入了核技巧（Kernel Trick），而所谓核技巧则是指能够快速计算得到两个低维向量映射到高维（甚至是无穷维）空间后内积的方法，详细内容可以阅读本书10.8节内容。之所以需要在原始PCA算法中引入特征映射，是因为PCA算法只能够处理线性分布的数据样本，而对于非线性的场景来说PCA算法将会显得无能为力。&lt;/p&gt;&#xA;&lt;p&gt;如图12-13所示，在二维空间中有一个非线性可分的数据集，其一共包含有两个类别。假设现在通过PCA算法来对其进行降维处理将会产生什么样的结果呢？&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/22080705191.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 12-13 线性不可分示例图&lt;/center&gt;&#xA;&lt;p&gt;根据PCA算法原理可知，图12-13中的数据样本无论是朝着哪个方向进行投影降维，在子空间中都会将两个类别的样本点完全混合在一起，而这样的降维操作显然是无效的。因为降维算法的目的是在尽可能多的保留原有数据结构信息的前提条件下降低特征维度，而不仅仅只是为了单方面的降低维度而过多（或全部）丢失了数据原有的结构信息。如图12-14所示便是图12-13中的样本通过PCA算法降维后的结果。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/22080728991.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 12-14 PCA降维结果图&lt;/center&gt;&#xA;&lt;p&gt;如图12-14所示，可以看到经过PCA算法降维后的结果已经完全不能够体现原有的样本结构信息（这里特指类别）。因此，这就需要借助特征映射的思想先将原始样本点映射到一个高维的线性可分的特征空间中，然后再通过PCA算法对齐进行降维处理。如图12-15所示便是经过KPCA算法降维后的结果。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;300&#34; src=&#34;https://mlwithme.github.io/images/ml/22080752002.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt; 图 12-15 KPCA降维结果图&lt;/center&gt;&#xA;&lt;p&gt;如图12-15所示，可以看到经过KPCA算法降维后的结果依旧能够体现出两个完全不同的样本类别。&lt;/p&gt;&#xA;&lt;p&gt;根据上面的介绍可知，KPCA算法的核心思想主要可以分为两步：第1步，先将原始非线性可分的样本点映射到线性可分的高维或无穷维（高斯核）的特征空间中；第2步，在线性可分的高维空间中通过PCA算法进行降维处理。&lt;/p&gt;&#xA;&lt;p&gt;如图12-6所示，可以选择某个合适的核函数将原始非线性可分的样本点映射到线性可分的高维空间中。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;580&#34; src=&#34;https://mlwithme.github.io/images/ml/22080725992.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 12-16 高维映射结果图&lt;/center&gt;&#xA;&lt;p&gt;然后再通过PCA算法对其进行降维处理便可以得到类似图12-15中的结果，如图12-17所示。&lt;/p&gt;&#xA;&lt;div align=center&gt;&lt;img width=&#34;520&#34; src=&#34;https://mlwithme.github.io/images/ml/22080739240.jpg&#34;/&gt;&lt;/div&gt;&lt;center&gt;图 12-17 PCA降维结果图&lt;/center&gt;&#xA;&lt;p&gt;如图12-17所示，左边为PCA降维后使用2个主成分表示的可视化结果，右边为使用1个主成分表示的结果。上述可视化代码可参见 &lt;code&gt;AllBooKCode/Chapter12/C05_KPCA_idea.py&lt;/code&gt; 文件。&lt;/p&gt;&#xA;&lt;h2 id=&#34;1222-kpca示例代码&#34;&gt;12.2.2 KPCA示例代码&lt;a class=&#34;anchor&#34; href=&#34;#1222-kpca%e7%a4%ba%e4%be%8b%e4%bb%a3%e7%a0%81&#34;&gt;#&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;在清楚了KPCA算法的基本思想后，我们便可以通过sklearn中的&lt;code&gt;KernelPCA&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;import&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;numpy&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;np&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; &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.decomposition&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; KernelPCA&#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; &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.datasets&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;import&lt;/span&gt; make_circles&#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;import&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;matplotlib.pyplot&lt;/span&gt; &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;as&lt;/span&gt; &lt;span style=&#34;color:#0e84b5;font-weight:bold&#34;&gt;plt&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; &#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;font-weight:bold&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#06287e&#34;&gt;make_nonlinear_cla_data&lt;/span&gt;(num_points &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#40a070&#34;&gt;500&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;     x, y &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; make_circles(n_samples&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;num_points, factor&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.2&lt;/span&gt;, noise&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;0.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;8&lt;/span&gt;                         random_state&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;seed(&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;9&lt;/span&gt;     x &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; x&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;reshape(&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:#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;10&lt;/span&gt;     &lt;span style=&#34;color:#007020;font-weight:bold&#34;&gt;return&lt;/span&gt; x, y&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;reshape(&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:#40a070&#34;&gt;1&lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第1~4行是导入相关模块。第6~10行是构造一个线性不可分的二分类数据集。&lt;/p&gt;&#xA;&lt;p&gt;进一步，可以通过&lt;code&gt;KernelPCA&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;visualization&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; make_nonlinear_cla_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;     pca &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; KernelPCA(n_components&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;2&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;, gamma&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;4&lt;/span&gt;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;figure(figsize&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#40a070&#34;&gt;12&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;4&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;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;subplot(&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;3&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;6&lt;/span&gt;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;title(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;Original&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;15&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;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;scatter(x[:, &lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;], x[:, &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;], c&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;y)&#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;     x &lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt; pca&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;fit_transform(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;9&lt;/span&gt;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;subplot(&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;3&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;10&lt;/span&gt;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;title(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;Projection with two components&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;15&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;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;scatter(x[:, &lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;], x[:, &lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;], c&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;y)&#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;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;subplot(&lt;span style=&#34;color:#40a070&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#40a070&#34;&gt;3&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;13&lt;/span&gt;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;title(&lt;span style=&#34;color:#4070a0&#34;&gt;&amp;#39;Projection with one component&amp;#39;&lt;/span&gt;, fontsize&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#40a070&#34;&gt;15&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;14&lt;/span&gt;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;scatter(x[:, &lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;], [&lt;span style=&#34;color:#40a070&#34;&gt;0&lt;/span&gt;] &lt;span style=&#34;color:#666&#34;&gt;*&lt;/span&gt; &lt;span style=&#34;color:#007020&#34;&gt;len&lt;/span&gt;(x), c&lt;span style=&#34;color:#666&#34;&gt;=&lt;/span&gt;y)&#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;15&lt;/span&gt;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;tight_layout()&#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;16&lt;/span&gt;     plt&lt;span style=&#34;color:#666&#34;&gt;.&lt;/span&gt;show()&#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;17&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;18&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;19&lt;/span&gt;     visualization()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在上述代码中，第3行是实例化一个&lt;code&gt;KernelPCA&lt;/code&gt;类对象，其中&lt;code&gt;n_components&lt;/code&gt;用于指定主成分的数量，&lt;code&gt;kernel&lt;/code&gt;用于指定对应的核函数，&lt;code&gt;gamma&lt;/code&gt;为高斯核函数中的参数。第4~14行是分别对未降维、用两个主成分和一个主成分表示的结果进行可视化。&lt;/p&gt;</description>
			</item>
	</channel>
</rss>
