提交 9d05e99e 编写于 作者: W wizardforcel

2020-12-10 21:26:25

上级 06376d07
......@@ -82,7 +82,7 @@
![](img/b93e1305-0337-4224-b77d-22119c907841.png)
Principal components of a bidimensional dataset; the first principal component lies along the axis with the largest variance, while the second one is orthogonal, and it's proportional to the residual variance
二维数据集的主成分; 第一个主成分沿着方差最大的轴,而第二个主成分正交,并且与剩余方差成比例
至此,问题几乎解决了。 实际上,如果仅选择第一个`k`主成分( *v [i] ∈^(n×1)* ),则可以构建一个 变换矩阵 *A [k] ∈^(n×k)* ,从而使特征向量与第一个 *k [* 特征值列:
......@@ -174,7 +174,7 @@ import numpy as np def zero_center(X):
![](img/96f5814c-722a-4892-aecb-e31d1b885cc7.png)
Original dataset (left); whitened dataset (right)
原始数据集(左); 白化的数据集(右)
现在,我们可以检查新的协方差矩阵,如下所示:
......@@ -230,7 +230,7 @@ d = l[:l.shape[0]-1] - l[1:]
![](img/8109d275-c6a0-42c6-b8cb-b7f2a22c590f.png)
Eigenvalue differences for each principal component
每个主成分的特征值差异
可以看出,第一主成分的差异非常大,与第四主成分( *λ [4] -λ [3]* ); 但是,下一个差异仍然很高,虽然对应`$1[$2]`突然下降。 在这一点上,趋势几乎是稳定的(除了一些残余振荡),直到`$1[$2]`为止,然后趋势开始迅速下降,趋于趋于零 。 由于我们仍然希望获得正方形图像,因此我们将选择 *k = 16* (相当于将每一边除以四)。 在另一个任务中,您可以选择 *k = 15* ,甚至 *k = 8* ; 但是,为了更好地理解降维导致的误差,也将有助于分析所解释的方差。 因此,让我们从执行 PCA 开始:
......@@ -245,7 +245,7 @@ digits_pca = pca.fit_transform(X)
![](img/6b57796e-5007-448a-9bd2-a96bc7e3affb.png)
Original samples (top row); reconstructions (bottom row)
原始样本(第一行); 重建(底部行)
重建显然是有损的,但是数字仍然是可区分的。 现在,让我们通过对`explained_variance_ratio_` 数组的所有值求和来检查总的解释方差,其中包含每个分量的相对解释方差的相对数量(因此,任何`k < n`分量始终小于 1):
......@@ -265,7 +265,7 @@ print(np.sum(pca.explained_variance_ratio_))
![](img/f34df112-3c13-4331-b106-31b3c662783d.png)
Explained variance ratio corresponding to each principal component
对应每个主成分的解释方差比
正如预期的那样,贡献趋于减少,因为在这种情况下,第一个主要成分负责任; 例如,对于一种颜色的线条(例如黑色或白色),而其余的则为灰色。 这种行为非常普遍,几乎在每种情况下都可以观察到。 通过该图,还可以轻松找到额外的损失,以进一步减少损失。 例如,我们可以立即发现,对 3 个成分的严格限制可以解释原始差异的 40% ; 因此,剩余的 45% 被分为剩余的 13 个组成部分。 我邀请您重复此示例,尝试找出人类区分所有数字所需的最少数量的组件。
......@@ -281,13 +281,13 @@ Explained variance ratio corresponding to each principal component
![](img/1152710f-83cd-449a-9389-5540bb9ad014.png)
Original dataset (left); PCA projected version (right)
原始数据集(左); PCA 投影版本(右)
由于原始数据集是线性可分离的,因此在 PCA 投影之后,我们可以立即找到允许检测第一个成分(这是真正需要的唯一成分)的阈值,以便区分两个斑点。 但是,如果数据集不是线性可分离的,我们将得到不可接受的结果,如以下屏幕截图所示:
![](img/d2439c67-b819-4557-9e0a-c50a1e0178b5.png)
Original dataset (left); PCA projected version (right)
原始数据集(左); PCA 投影版本(右)
当几何形状更复杂时,找到可区分的阈值可能是不可能的。 但是,我们知道,将数据投影到高维空间可以使它们线性分离。 特别地,如果`x ∈ ℜ^n`,我们可以选择适当的函数`f(x)`,这样`y = f(x) ∈ ℜ^p`,以及`p >> n`。 不幸的是,将这种转换应用于整个数据集可能会非常昂贵。 实际上,给定一个转换矩阵`A`(具有`n`个组件),一个主分量,`a`<sup class="calibre27">*(t)[ *</sup> 投影后的可以编写如下(请记住它们是协方差矩阵的特征向量):
......@@ -325,7 +325,7 @@ X_pca = kpca.fit_transform(X)
![](img/2f600a98-54fb-439c-8be8-898b4650d05c.png)
Original dataset (left); kernel PCA projected version (right)
原始数据集(左);核 PCA 投影版本(右)
可以看到,即使在这种情况下,第一个分量也足以做出决定(由于噪声,公差最小),将阈值设置为零可以分离数据集。 我邀请读者测试其他内核的效果并应用它们,以区分包含所有零和一的 MNIST 子集。
......@@ -369,7 +369,7 @@ Xnz = Xz + np.random.multivariate_normal(np.zeros(shape=Xz.shape[1]), C, size=Xz
![](img/6ceb7a52-0d18-4da0-9da0-a94f57f47c6e.png)
Original images (upper line); noisy versions (lower line)
原始图像(上一行); 嘈杂的版本(下一行)
现在,让我们评估以下各项的平均对数似然率(通过`score()` 方法,`PCA``FactorAnalysis`类均可用的):
......@@ -440,7 +440,7 @@ spca.fit(X)
![](img/da76643e-d124-44d4-8547-a59042c1190b.png)
Components extracted by the sparse PCA algorithm
稀疏 PCA 算法提取的成分
不难理解,每个数字都可以由这些原子组成。 但是,考虑到原子数,稀疏度不能非常大。 例如,考虑数字`X[0]`的转换:
......@@ -452,7 +452,7 @@ y = spca.transform(X[0].reshape(1, -1)).squeeze()
![](img/b9997b84-83e2-4bf5-a810-a95a8d0191d1.png)
Absolute coefficients for the sparse transformation of the digit X[0]
`X[0]`的稀疏转换的绝对系数
显然有一些主要成分(例如 2,7,13,17,21,24,26,27 和 30 ),一些次要的(例如 5,8 等)和一些无效或可忽略的值(例如 1,3,6 等)。 如果以相同的代码长度(30 个分量)增加稀疏度,则对应于空分量的系数将降至零,而如果代码长度也增加(例如`k = 100`) ,字典将变得过于完整,并且空系数的数量也将增加。
......@@ -487,19 +487,19 @@ nmf.fit(X)
![](img/fc28caef-8e14-4593-a2dc-6162aaed6ed5.png)
Atoms extracted by the NNMF algorithm
NNMF 算法提取的原子
与我们在标准字典学习中观察到的相反,原子现在结构化了很多,并且它们再现了数字的特定部分(例如,垂直或水平笔画,圆,点等); 因此,我们可以预期会有更多的稀疏表示,因为更少的组件足以构成一个数字。 考虑上一节中显示的示例(数字`X[0]`),所有组件的绝对贡献如下图所示:
![](img/9cea1dd3-7125-426d-adf4-3a4801c7d2a4.png)
Absolute coefficients for the NNMF of the digit X[0]
`X[0]`的 NNMF 的绝对系数
占主导地位的是三个部分( 3 , 24 和 45 ); 因此,我们可以尝试将样本表示为它们的组合。 系数分别为 0.19、0.18 和 0.16。 结果显示在以下屏幕截图中(数字`X[0]`代表零):
![](img/b7dc5e46-5859-49af-be9f-87b09a6bf01a.png)
Deconstruction of the digit X[0], based on three main components
基于三个主成分来解构数字`X[0]`
有趣的是,该算法是如何选择原子的。 即使此过程受到`α`*β* 参数,以及规范的强烈影响,我们也可以观察到,例如,第三个原子( 屏幕截图中的第一个)可以被许多零,三和八共享; 最后一个原子对于零和九都是有帮助的。 每当原子的粒度太粗糙时,具有较弱的`L[1]`罚分的不完整字典可能会有所帮助。 当然,每个问题都需要特定的解决方案。 因此,我强烈建议与领域专家一起检查原子的结构。 作为练习,我邀请您将 NNMF 应用于另一个小图像数据集(例如 Olivetti,Cifar-10 或 STL-10),并尝试找到隔离固定数量的结构零件所必需的正确参数( 例如,对于面部,它们可以是眼睛,鼻子和嘴巴。
......@@ -527,7 +527,7 @@ Deconstruction of the digit X[0], based on three main components
![](img/fd260b15-bd75-4638-8be4-1f69c6c4d9a5.png)
Probability density functions of Gaussian distribution (left) and Laplace distribution (right)
高斯分布(左)和拉普拉斯分布(右)的概率密度函数
不幸的是,峰度的使用由于其对异常值的缺乏鲁棒性而受到阻碍(也就是说,由于它涉及四次方,因此即使很小的值也可以被放大并改变最终结果;例如,噪声高斯 尾部的离群值可以显示为超高斯)。 因此,作者 Hyvarinen 和 Oja (在*独立组件分析:算法和应用中, Hyvarinen A.和 Oja,E。,神经网络* 13 2000)提出了一种称为**快速独立组件分析**`F`**astICA** **)** 基于**负熵**的概念。 我们不会在本书中描述整个模型。 但是,了解基本思想会有所帮助。 可以证明,在具有相同方差的所有分布之间,高斯熵最大。 因此,如果数据集`X`(零中心)已从具有协方差*Σ*的分布中得出,则可以定义`X`作为高斯 *N(0,;Σ* *)*的熵与`X`:的熵之间的差
......@@ -550,7 +550,7 @@ ica.fit(X)
![](img/b7ee2fce-1609-4c31-aad4-e654090162b8.png)
Independent components extracted by FastICA
FastICA 提取的独立成分
在这种情况下,组件可以立即被识别为数字的一部分(考虑到数据集的维数,我邀请读者通过减少和增加组件的数量直至 64(这是最大数量)来重复该示例)。 这些分量趋于到达相应分布的平均位置。 因此,使用较少的数量,就可以区分出更多的结构化模式(可以视为不同的重叠信号),而使用更多的组件,则可以得到更多以特征为中心的元素。 但是,与 NNMF 相反,FastICA 不保证提取样本的实际部分,而是保证提取更完整的区域。 换句话说,尽管 NNMF 可以轻松检测到例如某些单个笔触,但 FastICA 倾向于将样本视为不同信号的总和,在图像的情况下,通常涉及样本的整个维数,除非数量 组件数量急剧增加。 为了更好地理解这个概念,让我们考虑一下 Olivetti 人脸数据集,其中包含 400 张 64×64 灰度肖像:
......@@ -564,7 +564,7 @@ faces = fetch_olivetti_faces(shuffle=True, random_state=1000)
![](img/b3216550-d65a-49d5-bbe3-902737f9ca8a.png)
Sample faces extracted from the Olivetti faces dataset
从 Olivetti 人脸数据集中提取的人脸样本
现在,让我们提取 100 个独立的组件:
......@@ -757,7 +757,7 @@ print(Xl[200])
![](img/045bb9d5-9249-4207-8995-0d44461e6ec2.png)
Topic-mixtures for comp.sys.mac.hardware (left) and rec.autos (right)
`comp.sys.mac.hardware`(左)和`rec.autos`(右)的主题组合
如您所见,主题几乎是正交的。 属于`rec.autos`的大多数消息具有 *p(t [0] )< 0.5**p(t [1] )> 0.5* ,而`comp.sys.mac.hardware`则略有重叠,其中不具有 *p(t [0] )> 0.5**p 的消息组 (t [1] )< 0.5* 稍大。 这可能是由于存在可以使两个主题具有相同重要性的词语(例如,*讨论**辩论*可能在两个新闻组中均出现)。 作为练习,我邀请您使用更多的子集,并尝试证明主题的正交性,并检测可能导致错误分配的单词。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册