Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
安浅Y
apachecn-dl-zh
提交
9d05e99e
A
apachecn-dl-zh
项目概览
安浅Y
/
apachecn-dl-zh
与 Fork 源项目一致
Fork自
OpenDocCN / apachecn-dl-zh
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
apachecn-dl-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
9d05e99e
编写于
12月 10, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-12-10 21:26:25
上级
06376d07
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
18 addition
and
18 deletion
+18
-18
new/handson-unsup-learn-py/07.md
new/handson-unsup-learn-py/07.md
+18
-18
未找到文件。
new/handson-unsup-learn-py/07.md
浏览文件 @
9d05e99e
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录