Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
D_ACMER
apachecn-dl-zh
提交
46b0bdb2
A
apachecn-dl-zh
项目概览
D_ACMER
/
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,发现更多精彩内容 >>
提交
46b0bdb2
编写于
12月 10, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-12-10 21:18:13
上级
b93e08f4
变更
9
显示空白变更内容
内联
并排
Showing
9 changed file
with
30 addition
and
30 deletion
+30
-30
new/handson-unsup-learn-py/01.md
new/handson-unsup-learn-py/01.md
+2
-2
new/handson-unsup-learn-py/02.md
new/handson-unsup-learn-py/02.md
+3
-3
new/handson-unsup-learn-py/03.md
new/handson-unsup-learn-py/03.md
+3
-3
new/handson-unsup-learn-py/04.md
new/handson-unsup-learn-py/04.md
+1
-1
new/handson-unsup-learn-py/05.md
new/handson-unsup-learn-py/05.md
+13
-13
new/handson-unsup-learn-py/06.md
new/handson-unsup-learn-py/06.md
+2
-2
new/handson-unsup-learn-py/07.md
new/handson-unsup-learn-py/07.md
+2
-2
new/handson-unsup-learn-py/08.md
new/handson-unsup-learn-py/08.md
+2
-2
new/handson-unsup-learn-py/10.md
new/handson-unsup-learn-py/10.md
+2
-2
未找到文件。
new/handson-unsup-learn-py/01.md
浏览文件 @
46b0bdb2
...
...
@@ -475,11 +475,11 @@ syn = poisson.rvs(mu, size=2000)
第一个称为
**标签传播**
,其目标是将一些样本的标签传播到更大的人群。 通过考虑一个图形来实现此目标,其中每个顶点代表一个样本,并且使用距离函数对每个边缘进行加权。 通过迭代过程,所有标记的样本将一部分标记值发送给所有邻居,并重复该过程,直到标记停止更改为止。 该系统具有稳定点(即,不能再进化的配置),并且算法可以通过有限的迭代次数轻松达到目标。
在所有可以根据相似性度量标记样本的情况下,标记传播都非常有用。 例如,在线商店可能有大量的客户群,但是只有 10% 的顾客公开了自己的性别。 如果特征向量足够丰富,可以代表男性和女性用户的常见行为,则可以使用标签传播算法来猜测尚未公开的用户性别。 当然,重要的是要记住,所有分配均基于类似样
品
具有相同标签的假设。 在许多情况下这可能是正确的,但是当特征向量的复杂性增加时,也会产生误导。
在所有可以根据相似性度量标记样本的情况下,标记传播都非常有用。 例如,在线商店可能有大量的客户群,但是只有 10% 的顾客公开了自己的性别。 如果特征向量足够丰富,可以代表男性和女性用户的常见行为,则可以使用标签传播算法来猜测尚未公开的用户性别。 当然,重要的是要记住,所有分配均基于类似样
本
具有相同标签的假设。 在许多情况下这可能是正确的,但是当特征向量的复杂性增加时,也会产生误导。
半监督算法的另一个重要系列是基于将标准
**SVM**
(
**Support Vector Machine**
的缩写)扩展到包含未标记样本的数据集。 在这种情况下,我们不想传播现有标签,而是传播分类标准。 换句话说,我们要使用标记的数据集训练分类器,并将判别规则也扩展到未标记的样本。
与只能评估未标记样本的标准程序相反,半监督 SVM 使用它们来校正分离的超平面。 该假设始终基于相似性:如果
`A`
的标签为
`1`
,而未标签的样
品
`B`
的标签为
`d(A, B) <ε`
(其中
`ε`
是预定义的阈值),可以合理地假设
`B`
的标签也是
`1`
。 这样,即使仅手动标记了一个子集,分类器也可以在整个数据集上实现高精度。 与标签传播类似,仅当数据集的结构不是非常复杂时,尤其是当相似性假设成立时,这类模型才是可靠的(不幸的是,在某些情况下,很难找到合适的距离度量,因此 许多相似的样本的确不同,反之亦然)。
与只能评估未标记样本的标准程序相反,半监督 SVM 使用它们来校正分离的超平面。 该假设始终基于相似性:如果
`A`
的标签为
`1`
,而未标签的样
本
`B`
的标签为
`d(A, B) <ε`
(其中
`ε`
是预定义的阈值),可以合理地假设
`B`
的标签也是
`1`
。 这样,即使仅手动标记了一个子集,分类器也可以在整个数据集上实现高精度。 与标签传播类似,仅当数据集的结构不是非常复杂时,尤其是当相似性假设成立时,这类模型才是可靠的(不幸的是,在某些情况下,很难找到合适的距离度量,因此 许多相似的样本的确不同,反之亦然)。
...
...
new/handson-unsup-learn-py/02.md
浏览文件 @
46b0bdb2
...
...
@@ -404,7 +404,7 @@ print(sdff[['perimeter_mean', 'area_mean', 'smoothness_mean',
恶性群集的统计描述
根据事实,我们知道所有这些样本都是恶性的,但是我们可以尝试确定一个规则。
`area_mean`
/
`perimeter_mean`
之比约为
`9.23`
,相对于平均值,相对标准偏差非常小。 这意味着这些样
品在非常狭窄的范围内代表了扩展的肿瘤。 而且,
`concavity_mean`
和
`symmetry_mean`
均大于总值。 因此(在不进行科学合理分析的前提下),我们可以得出结论,分配给这些簇的样品
代表了已经进入晚期的非常糟糕的肿瘤。
根据事实,我们知道所有这些样本都是恶性的,但是我们可以尝试确定一个规则。
`area_mean`
/
`perimeter_mean`
之比约为
`9.23`
,相对于平均值,相对标准偏差非常小。 这意味着这些样
本在非常狭窄的范围内代表了扩展的肿瘤。 而且,
`concavity_mean`
和
`symmetry_mean`
均大于总值。 因此(在不进行科学合理分析的前提下),我们可以得出结论,分配给这些簇的样本
代表了已经进入晚期的非常糟糕的肿瘤。
为了与良性样本进行比较,现在考虑由
*x > -10*
和
*20 < y < 50*
,界定的区域 如下:
...
...
@@ -420,7 +420,7 @@ print(sdff[['perimeter_mean', 'area_mean', 'smoothness_mean',
良性簇的统计描述
在这种情况下,比
`area_mean`
/
`perimeter_mean`
约为
`4.89`
,但是
`area_mean`
具有较大的标准差(实际上,其最大值约为
`410`
)。
`concavity_mean`
相对于前一个非常小(即使具有近似相同的标准偏差),而
`symmetry_mean`
几乎相等。 从这个简短的分析中,我们可以推断出
`symmetry_mean`
不是判别特征,而
`concavity_mean`
的比值
`area_mean`
/
`perimeter_mean`
小于
`5.42`
(考虑最大值)。 小于或等于
`0.04`
应当保证良性结果。 由于
`concavity_mean`
可以达到非常大的最大值(大于与恶性样
品
相关的最大值),因此有必要考虑其他特征,以便确定是否应将其值视为警报。 但是,我们可以得出结论,说属于这些簇的所有样本都是良性的,错误概率可以忽略不计。 我想重复一遍,这不是真正的分析,而是更多的练习,在这种情况下,数据科学家的主要任务是收集可以支持结论的上下文信息。 即使存在基本事实,该验证过程也始终是强制性的,因为根本原因的复杂性可能导致完全错误的陈述和规则。
在这种情况下,比
`area_mean`
/
`perimeter_mean`
约为
`4.89`
,但是
`area_mean`
具有较大的标准差(实际上,其最大值约为
`410`
)。
`concavity_mean`
相对于前一个非常小(即使具有近似相同的标准偏差),而
`symmetry_mean`
几乎相等。 从这个简短的分析中,我们可以推断出
`symmetry_mean`
不是判别特征,而
`concavity_mean`
的比值
`area_mean`
/
`perimeter_mean`
小于
`5.42`
(考虑最大值)。 小于或等于
`0.04`
应当保证良性结果。 由于
`concavity_mean`
可以达到非常大的最大值(大于与恶性样
本
相关的最大值),因此有必要考虑其他特征,以便确定是否应将其值视为警报。 但是,我们可以得出结论,说属于这些簇的所有样本都是良性的,错误概率可以忽略不计。 我想重复一遍,这不是真正的分析,而是更多的练习,在这种情况下,数据科学家的主要任务是收集可以支持结论的上下文信息。 即使存在基本事实,该验证过程也始终是强制性的,因为根本原因的复杂性可能导致完全错误的陈述和规则。
...
...
@@ -675,7 +675,7 @@ cm = contingency_matrix(kmdff['diagnosis'].apply(lambda x: 0 if x == 'B' else 1)
**K 最近邻**
(
`K`
NN)是属于称为
**基于实例的学习**
类别的方法。 在这种情况下,没有参数化模型,而是样本的重新排列以加快特定查询的速度。 在最简单的情况下(也称为蛮力搜索),假设我们有一个
`X`
数据集,其中包含
`M`
个样本
`x[i] ∈ ℜ^N`
。 给定距离函数
`d(x[i], x[j])`
,则可以定义测试样
品
的半径邻域
`x[i]`
如下:
**K 最近邻**
(
`K`
NN)是属于称为
**基于实例的学习**
类别的方法。 在这种情况下,没有参数化模型,而是样本的重新排列以加快特定查询的速度。 在最简单的情况下(也称为蛮力搜索),假设我们有一个
`X`
数据集,其中包含
`M`
个样本
`x[i] ∈ ℜ^N`
。 给定距离函数
`d(x[i], x[j])`
,则可以定义测试样
本
的半径邻域
`x[i]`
如下:
![](
img/539ec0a2-ed36-460b-818d-07dd652d1fc2.png
)
...
...
new/handson-unsup-learn-py/03.md
浏览文件 @
46b0bdb2
...
...
@@ -224,7 +224,7 @@ MeanShift 在不同带宽下的聚类结果
**DBSCAN**
是基于数据集密度估计的另一种聚类算法。 但是,与均值移位相反,没有直接参考数据生成过程。 在这种情况下,实际上,过程
*通过自下而上的分析建立了样本之间的关系*
,从
`X`
由高密度区域(气泡 )由低密度的分隔。 因此,DBSCAN 不仅需要最大的分隔约束,而且为了确定群集的边界,它强制执行这种条件。 而且,此算法不允许指定所需的簇数,这是
`X`
结构的结果,但是,类似于均值移位,可以控制进程的粒度。
特别是,DBSCAN 基于两个基本参数:
`ε`
,它表示球
`B[ε](x[i])`
的半径,以样本
`x[i]`
为中心,和
`n[min]`
,这是
`B[ε](x[i])`
中必须包含的最小样
品
数,以便考虑
`x[i]`
作为
**核心点**
(即可以被视为集群的实际成员的点)。 形式上,给定一个函数
`N(·)`
,该函数对集合中包含的样本数进行计数,则在以下情况下将样本
`x[i] ∈ X`
称为核心点 :
特别是,DBSCAN 基于两个基本参数:
`ε`
,它表示球
`B[ε](x[i])`
的半径,以样本
`x[i]`
为中心,和
`n[min]`
,这是
`B[ε](x[i])`
中必须包含的最小样
本
数,以便考虑
`x[i]`
作为
**核心点**
(即可以被视为集群的实际成员的点)。 形式上,给定一个函数
`N(·)`
,该函数对集合中包含的样本数进行计数,则在以下情况下将样本
`x[i] ∈ X`
称为核心点 :
![](
img/20cd8208-d768-4e45-b2b4-b5943b8908eb.png
)
...
...
@@ -244,7 +244,7 @@ MeanShift 在不同带宽下的聚类结果
所有具有
`x[i]`
和
`x[j] ∈ X`
将分配给同一群集
`C[t]`
。 此外,如果
`x[k] ∈ C[t]`
,则所有密度可达的点
`x[p] ∈ X * x[k]`
也将属于同一群集。 从任何其他点
`x[i] ∈ X`
不可达到密度的点
`x[n]`
被定义为
**噪声点**
。 因此,与其他算法相反,DBSCAN 输出
`n`
簇以及一个包含所有噪声点的附加集(不必将其视为离群值,而应视为不属于任何密集子区域的点)。 当然,由于噪声点没有标签,因此其数目应相当低; 因此,重要的是要调整参数
`ε`
和
`n[min]`
,以达到双重目的:最大化内聚力和分离度,避免过多的点被标记为噪点 。 没有实现此目标的标准规则,因此,我建议在做出最终决定之前测试不同的值。
最后,重要的是要记住,DBSCAN 可以处理非凸几何形状,并且与均值移位相反,它假设存在由低密度区域包围的高密度区域。 而且,它的复杂性与所采用的 KNN 方法(强力,球树或 kd 树)严格相关。 通常,当数据集不太大时,平均性能大约为
`O(N log N)`
,但可能趋于
`O(N^2)`
当
`N`
非常大时。 要记住的另一个重要元素是样
品
的尺寸。 正如我们已经讨论的那样,高维度量可以减少两点的可分辨性,从而对 KNN 方法的性能产生负面影响。 因此,当维数很高时,应避免(或至少仔细分析)DBSCAN,因为生成的簇不能有效地表示实际的密集区域。
最后,重要的是要记住,DBSCAN 可以处理非凸几何形状,并且与均值移位相反,它假设存在由低密度区域包围的高密度区域。 而且,它的复杂性与所采用的 KNN 方法(强力,球树或 kd 树)严格相关。 通常,当数据集不太大时,平均性能大约为
`O(N log N)`
,但可能趋于
`O(N^2)`
当
`N`
非常大时。 要记住的另一个重要元素是样
本
的尺寸。 正如我们已经讨论的那样,高维度量可以减少两点的可分辨性,从而对 KNN 方法的性能产生负面影响。 因此,当维数很高时,应避免(或至少仔细分析)DBSCAN,因为生成的簇不能有效地表示实际的密集区域。
在显示具体示例之前,最好先介绍一种在未知的真实情况下可以采用的进一步评估方法。
...
...
@@ -598,7 +598,7 @@ while np.linalg.norm(mu_idxs - mu_copy) > tolerance:
print
(
'Adjusted Rand score K-Medoids: {}'
.
format
(
adjusted_rand_score
(
Y
,
C
)))
```
行为非常简单。 在每次迭代中,我们都计算出属于一个簇的所有元素之间的成对距离(这实际上是最昂贵的部分),然后选择使总和最小的中心点。 循环后,我们通过最小化它们与类固醇的距离来分配样
品
。 重复该操作,直到类固醇的范数变化变得小于预定阈值为止。 调整后的 Rand 得分为,如下所示:
行为非常简单。 在每次迭代中,我们都计算出属于一个簇的所有元素之间的成对距离(这实际上是最昂贵的部分),然后选择使总和最小的中心点。 循环后,我们通过最小化它们与类固醇的距离来分配样
本
。 重复该操作,直到类固醇的范数变化变得小于预定阈值为止。 调整后的 Rand 得分为,如下所示:
```
py
Adjusted
Rand
score
K
-
Medoids
:
0.4761670824763849
...
...
new/handson-unsup-learn-py/04.md
浏览文件 @
46b0bdb2
...
...
@@ -451,7 +451,7 @@ pdff = pd.concat([dff, df_pred], axis=1)
在此级别上,树状图显示出属于簇和剩余较小块的样本数量很大。 现在我们知道,这样的次级区域对应于
*x∈(-40,10)*
和
*y > 20*
。 同样,结果并不令人惊讶,因为 t-SNE 图表明,这些样本是唯一具有
*y > 20÷25*
的样本(而较大的簇,即使有很大的空白区域,也覆盖了 几乎所有范围)。
因此,我们可以说这些样
品代表具有
*极端*
行为的非常不同的植物,如果将新样品
分配给该群集,则可能是非标准植物(假设一个标准植物 具有与大多数同行相似的行为)。 作为练习,我鼓励您测试其他数量的类和不同的链接(尤其是单个链接,这非常特殊),并尝试验证或拒绝某些样本,先前的假设(它们在物理上没有必要被接受) )。
因此,我们可以说这些样
本代表具有
*极端*
行为的非常不同的植物,如果将新样本
分配给该群集,则可能是非标准植物(假设一个标准植物 具有与大多数同行相似的行为)。 作为练习,我鼓励您测试其他数量的类和不同的链接(尤其是单个链接,这非常特殊),并尝试验证或拒绝某些样本,先前的假设(它们在物理上没有必要被接受) )。
...
...
new/handson-unsup-learn-py/05.md
浏览文件 @
46b0bdb2
...
...
@@ -118,9 +118,9 @@ for m in np.linspace(1.05, 1.5, 5):
![](
img/3db4c002-6803-4b02-9312-638929fe1d3e.png
)
Weights (in an inverse logarithmic scale) for the sample X[0], corresponding to different m values
样本
`X[0]`
的权重(反对数刻度),对应于不同的
`m`
值
由于极值往往会非常不同,因此我们选择使用对数逆标(即
*-log(w [0j] )*
而不是
*w [0] [j]*
)。 当
*m = 1.05*
时,
`P[C]`
约为 0.96,并且所有权重(与
*C [2 对应的权重除外]*
)非常小(请记住,如果
*-log(w)= 30*
,则
*w = e^(-30)*
)。 这样的配置清楚地显示了具有主要成分(
`C[2]`
)的非常硬的聚类。 上图中的后续三个图继续显示优势,但是,尽管
`m`
增大(
`P[C]`
减小),但优势和次级之间的差异 组件变得越来越小。 该效果证实了增加的模糊性,达到
*m > 1.38*
的最大值。 实际上,当
*m = 1.5*
时,即使
*P [C] ≈0.1*
,所有权重几乎相同,并且测试样
品
无法轻松分配给 主导集群。 正如我们之前讨论的那样,我们现在知道像 K 均值这样的算法可以轻松地找到硬分区,因为平均而言,对应于不同数字的样本彼此之间非常不同,并且欧几里得距离足以将它们分配给右边 重心。 在这个例子中,我们要保持适度的模糊性。 因此,我们选择了
*m = 1.2*
(对应于
`P`
*[C]*
*0.73*
):
由于极值往往会非常不同,因此我们选择使用对数逆标(即
*-log(w [0j] )*
而不是
*w [0] [j]*
)。 当
*m = 1.05*
时,
`P[C]`
约为 0.96,并且所有权重(与
*C [2 对应的权重除外]*
)非常小(请记住,如果
*-log(w)= 30*
,则
*w = e^(-30)*
)。 这样的配置清楚地显示了具有主要成分(
`C[2]`
)的非常硬的聚类。 上图中的后续三个图继续显示优势,但是,尽管
`m`
增大(
`P[C]`
减小),但优势和次级之间的差异 组件变得越来越小。 该效果证实了增加的模糊性,达到
*m > 1.38*
的最大值。 实际上,当
*m = 1.5*
时,即使
*P [C] ≈0.1*
,所有权重几乎相同,并且测试样
本
无法轻松分配给 主导集群。 正如我们之前讨论的那样,我们现在知道像 K 均值这样的算法可以轻松地找到硬分区,因为平均而言,对应于不同数字的样本彼此之间非常不同,并且欧几里得距离足以将它们分配给右边 重心。 在这个例子中,我们要保持适度的模糊性。 因此,我们选择了
*m = 1.2*
(对应于
`P`
*[C]*
*0.73*
):
```
py
fc
,
W
,
_
,
_
,
_
,
_
,
pc
=
cmeans
(
X
.
T
,
c
=
10
,
m
=
1.2
,
error
=
1e-6
,
maxiter
=
20000
,
seed
=
1000
)
...
...
@@ -131,7 +131,7 @@ Mu = fc.reshape((10, 8, 8))
![](
img/613fe7ab-800d-4d83-ba8f-f92841044c5b.png
)
Centroids corresponding to m = 1.2 and P[C] ≈ 0.73
质心对应于
`m = 1.2`
和
`P[C] ≈ 0.73`
如您所见,所有不同的数字均已选定,并且按预期,第三个簇(由
`C[2]`
表示)对应于数字 0。现在,让我们检查一下 对应于
`X[0]`
的权重(也是
`W`
的转置,因此它们存储在
`W[:, 0]`
中):
...
...
@@ -186,7 +186,7 @@ print(W[:, im])
![](
img/a35690c9-1b3e-4f02-a28d-69b704e008ec.png
)
Plot of the sample, X[414], corresponding to the weight vector with the smallest standard deviation
样本
`X[414]`
的图,对应于具有最小标准偏差的权重向量
在这种情况下,存在三个主要簇:
`C[8]`
,
`C[4]`
和
*C [7 []*
(降序)。 不幸的是,它们都不对应于与
`C[5]`
相关的数字 8。 不难理解,这种错误主要是由于手指下部的格式不正确而导致的,其结果更类似于 9(这种错误分类也可能发生在人类身上)。 然而,低标准偏差和明显的主导成分的缺乏应告诉我们,这一决定不容易做出,并且样本具有属于三个主要类别的特征。 一个更复杂的监督模型可以轻松避免此错误,但考虑到我们正在执行非监督分析,并且我们仅将基本事实用于评估目的,结果并不是那么负面。 我建议您使用其他
`m`
值测试结果,并尝试找出一些可能的合成规则(即,大多数 8 位数字都被软分配给
`C[i]`
和
`C[j]`
,因此我们可以假设相应的质心对部分共同特征进行编码,例如,由所有 8 位和 9 位数字共享。
...
...
@@ -214,13 +214,13 @@ Plot of the sample, X[414], corresponding to the weight vector with the smallest
![](
img/37882b8c-c2b1-48c3-a901-106fb8c48cb5.png
)
Full covariance matrix (left); diagonal covariance (center); circular/spherical covariance (right)
完整协方差矩阵(左); 对角协方差(中心);圆形/球形协方差(右)
从现在开始,我们将一直在考虑完全协方差矩阵的情况,该矩阵可以实现最大的表达能力。 很容易理解,当这样的分布完全对称(即协方差矩阵是圆形/球形)时,伪簇的形状与 K 均值相同(当然 ,在高斯混合中,簇没有边界,但是始终可以在固定数量的标准偏差后削减高斯)。 相反,当协方差矩阵不是对角线或具有不同的方差时,影响不再是对称的(例如,在双变量的情况下,一个组件可以显示出比另一个更大的方差)。 在这两种情况下,高斯混合均允许我们计算实际概率,而不是测量样本之间的距离,
`x`
*[i]*
平均载体
`μ`
*[j]*
(以 K 均值表示)。 下图显示了单变量混合的示例:
![](
img/45e96e53-863e-4c70-995b-c33388eb96ea.png
)
Example of a univariate Gaussian mixture
单变量高斯混合的示例
在这种情况下,每个样本在每个高斯下始终具有非零概率,其影响取决于其均值和协方差矩阵。 例如,对应于
`x`
-位置的点 2.5 既可以属于中央高斯,也可以属于右手的点(而左手的影响最小)。 如本章开头所述,通过选择影响最大的组件(
`argmax`
),可以将任何软聚类算法转换为硬聚类算法。
...
...
@@ -289,7 +289,7 @@ X, Y = make_blobs(n_samples=nb_samples, n_features=2, center_box=[-1, 1], center
![](
img/db575108-46aa-404e-9944-7ad79dde1310.png
)
Dataset for the Gaussian mixture example
高斯混合示例的数据集
我们的目标是同时使用高斯混合模型和 K 均值,并比较最终结果。 正如我们期望的那样,有两个组成部分,数据生成过程的近似如下:
...
...
@@ -391,7 +391,7 @@ Y_pred_km = km.predict(X)
![](
img/23deac5e-1e50-4c67-a6aa-e83753613d06.png
)
Gaussian mixture result (left) with the shapes of three horizontal sections; k-means result (right)
高斯混合结果(左)具有三个水平截面的形状; K 均值结果(右)
不出所料,这两种算法都产生非常相似的结果,并且主要差异是由于高斯算法的非对称性造成的。 特别地,与数据集的左下部分相对应的伪群集在两个方向上均具有较大的方差,并且对应的高斯是主要的。 为了检查混合物的行为,让我们计算三个样本点的概率(
*(0,-2)*
;
*(1,-1)*
-临界样本;以及
*(1、0)*
),使用
`predict_proba()`
方法:
...
...
@@ -458,7 +458,7 @@ for n in range(1, n_max_components + 1):
![](
img/006b6068-1d96-4ada-86ca-44bdd17cd9b0.png
)
AICs, BICs, and log-likelihoods for Gaussian mixtures with the number of components in the range (1, 20)
高斯混合物的 AIC,BIC 和对数似然(组件数量在
`(1, 20)`
)
在这种情况下,我们知道数据集是由两个高斯分布生成的,但是让我们假设我们没有这条信息。 AIC 和 BIC 都具有
*n [c] = 2*
的(局部)最小值。 但是,尽管 BIC 越来越大,但 AIC 的伪全局最小值为
*n [c] = 18*
。 因此,如果我们信任 AIC,则应该选择 18 个分量,这等效于以许多高斯对数据集进行超细分,并且方差很小。 另一方面,
*n [c] = 2*
和
*n [c] = 18*
之间的差异不是很大 值,因此考虑到简单得多,我们也可以选择以前的配置。 BIC 确认了这种选择。 实际上,即使还有一个局部最小值对应于
*n [c] = 18*
,其值也比
*n [c] = 2*
。 正如我们之前所解释的,这种行为是由于 BIC 施加的样本量额外罚款。 对于
*n [c] = 2*
,每个二元高斯变量需要一个权重变量,两个均值变量和四个协方差矩阵变量,我们得到
*n [p] = 2(1 + 2+ 4)= 14*
,对于
*n [c] = 18*
,我们得到
*n [p] = 18(1 + 2+ 4)= 126*
。 由于有 300 个样本,BIC 会受到
*log(300)≈5.7*
的惩罚,这会导致 BIC 增加约 350。随着
*n [c []*
变大(因为在极端情况下,每个点都可以被视为由具有零方差的单个高斯生成,等效于狄拉克三角洲),因此参数数量在模型选择中起主要作用 处理。
...
...
@@ -542,7 +542,7 @@ print((Y_pred == 4).sum())
![](
img/c391f825-4d97-41f7-965e-79ccd22623fe.png
)
Final configuration, with five active components
最终配置,具有五个活动组件
该模型通常可以接受; 但是,假设我们知道根本原因(即产生高斯分布)的数量可能是 4,而不是 5。我们可以尝试的第一件事是保持原始的最大组件数量并减少组件数量。 重量浓度参数(即 0.1)。 如果近似值可以使用较少的高斯分布成功生成
`X`
,则应该找到一个空权重:
...
...
@@ -565,7 +565,7 @@ Weights: [3.07496936e-01 2.02264778e-01 2.94642240e-01 1.95417680e-01 1.78366038
![](
img/739c3008-1f01-46c2-81bf-6b710703a427.png
)
Final configuration, with four active components
最终配置,具有四个活动组件
可以看到,该模型执行了组件数量的自动选择,并且已将较大的右 Blob 分成几乎正交的两个部分。 即使使用大量初始组件(例如 10 个)训练模型,此结果也保持不变。 作为练习,我建议使用其他值重复该示例,检查权重之间的差异。 贝叶斯高斯混合因避免过度拟合的能力而非常强大。 实际上,虽然标准的高斯混合将通过减小它们的协方差来使用所有成分,但必要时(以便覆盖密集区域),这些模型利用了 Dirichlet 过程/分布的特性,以避免激活 组件过多。 例如,可以通过检查模型可实现的最少组件数来深入了解潜在的数据生成过程。 在没有任何其他先验知识的情况下,这样的值是最终配置的良好候选者,因为较少数量的组件也将产生较低的最终可能性。 当然,可以将 AIC / BIC 与这种方法一起使用,以进行另一种形式的确认。 但是,与标准高斯混合的主要区别在于可以包括来自专家的先验信息(例如,均值和协方差的原因结构)。 因此,我邀请您通过更改
`mean_precision_prior`
的值来重复该示例。 例如,可以将
`mean_prior`
参数设置为与
`X`
的平均值不同的值,并调整
`mean_precision_prior`
,以便基于某些参数强制模型实现不同的细分 先验知识(即,区域中的所有样本应由特定组件生成)。
...
...
@@ -626,7 +626,7 @@ q2 = 0.5
![](
img/4fcf89b7-072b-4d1b-b722-af2ee25e79f5.png
)
Dataset (the unlabeled samples are marked with an x) and initial configuration
数据集(未标记的样本用
`x`
标记)和初始配置
现在,我们可以按照先前定义的规则执行几次迭代(本例中为 10 次)(当然,也可以检查参数的稳定性,以停止迭代)。 使用 SciPy
`multivariate_normal`
类计算每个高斯下的概率:
...
...
@@ -701,7 +701,7 @@ Gaussian 2:
![](
img/4d7b1215-9880-410f-b1a4-f15a2d338d88.png
)
Final configuration, after 10 iterations
最终配置,经过 10 次迭代
可以看到,两个高斯函数均已成功优化,并且它们能够从充当
**受信任指南**
的几个标记样本开始生成整个数据集。 这种方法非常强大,因为它允许我们在不做任何修改的情况下将一些先验知识包括在模型中。 但是,由于标记的样本具有等于 1 的固定概率,因此该方法在异常值方面不是非常可靠。 如果样本尚未通过数据生成过程生成或受噪声影响,则可能导致模型放错高斯分布。 但是,通常不应该考虑这种情况,因为任何先验知识(包括在估计中)都必须进行预评估,以检查其是否可靠。 这样的步骤是必要的,以避免强迫模型仅学习原始数据生成过程的一部分的风险。 相反,当标记的样本真正代表了潜在的过程时,它们的包含减少了错误并加快了收敛速度。 我邀请读者在引入一些噪声点(例如(-20,-10))之后重复该示例,并比较一些未标记的测试样本的概率。
...
...
new/handson-unsup-learn-py/06.md
浏览文件 @
46b0bdb2
...
...
@@ -510,7 +510,7 @@ IQRs: [0\. 0.34871118 1.99673381]
Histogram for the first component (duration)
不出所料,这种成分不是很重要,因为只有一小部分样
品
具有不同的值。 因此,在此示例中,我们将跳过它,仅使用源字节和目标字节。 现在,如前所述,计算带宽:
不出所料,这种成分不是很重要,因为只有一小部分样
本
具有不同的值。 因此,在此示例中,我们将跳过它,仅使用源字节和目标字节。 现在,如前所述,计算带宽:
```
py
import
numpy
as
np
...
...
@@ -566,7 +566,7 @@ Mean normal: 0.39588 - Std: 0.25755
Mean
anomalies
:
0.00008
-
Std
:
0.00374
```
显然,当例如
*p [K] (x)< 0.05*
(考虑三个标准差),我们得到
*p 时,我们可以预期到异常。 [K] (x)∈(0,0.01))*
,而
`Yn`
的中位数约为 0.35。 这意味着至少一半的样
品
具有
`p[K]`
*(x)> 0.35*
。 但是,通过简单的计数检查,我们得到以下信息:
显然,当例如
*p [K] (x)< 0.05*
(考虑三个标准差),我们得到
*p 时,我们可以预期到异常。 [K] (x)∈(0,0.01))*
,而
`Yn`
的中位数约为 0.35。 这意味着至少一半的样
本
具有
`p[K]`
*(x)> 0.35*
。 但是,通过简单的计数检查,我们得到以下信息:
```
py
print
(
np
.
sum
(
Yn
<
0.05
))
...
...
new/handson-unsup-learn-py/07.md
浏览文件 @
46b0bdb2
...
...
@@ -417,7 +417,7 @@ Factor Analysis log-likelihood(Xnz): 1459.2912218162423
![](
img/6d321ec9-2ff5-4b21-8c88-e47d435bf51a.png
)
在前面的表达式中,系数
`$1[$2]`
几乎总是不为零,因此所有组件都参与重建过程。 出于降维的目的,这不是问题,因为为了限制它们,我们对每个组件解释的方差更感兴趣。 但是,在某些任务下,分析每个较大的
**建筑原子**
很有帮助,并假设每个向量都可以表示为它们的稀疏组合。 最经典的例子是文本语料库,其中词典包含的术语比每个文档中涉及的术语更多。 这些类型的模型通常称为
**字典学习**
算法,因为原子集定义了一种字典,其中包含可用于创建新样本的所有单词。 当原子数
`k`
大于样
品
的维数
`n`
时,该字典被称为
**过度完成**
,其表示为 常稀疏。 相反,当
*k < n*
时,字典被称为
**未完全完成,**
并且向量需要更密集。
在前面的表达式中,系数
`$1[$2]`
几乎总是不为零,因此所有组件都参与重建过程。 出于降维的目的,这不是问题,因为为了限制它们,我们对每个组件解释的方差更感兴趣。 但是,在某些任务下,分析每个较大的
**建筑原子**
很有帮助,并假设每个向量都可以表示为它们的稀疏组合。 最经典的例子是文本语料库,其中词典包含的术语比每个文档中涉及的术语更多。 这些类型的模型通常称为
**字典学习**
算法,因为原子集定义了一种字典,其中包含可用于创建新样本的所有单词。 当原子数
`k`
大于样
本
的维数
`n`
时,该字典被称为
**过度完成**
,其表示为 常稀疏。 相反,当
*k < n*
时,字典被称为
**未完全完成,**
并且向量需要更密集。
通过对函数的最小化,对解决方案的
`L[1]`
范数施加惩罚,可以轻松解决此类学习问题。 这种限制导致稀疏性的原因不在本书的讨论范围之内,但是有兴趣的人可以在《Mastering Machine Learning Algorithms》中找到更长的讨论范围。
...
...
@@ -464,7 +464,7 @@ Absolute coefficients for the sparse transformation of the digit X[0]
当数据集
`X`
为非负数时,可以应用已被证明的分解技术(例如,在《通过非负矩阵分解学习对象的部分》中)在任务目标是提取与样
品
结构部分相对应的原子时更加可靠。 例如,在图像的情况下,它们应该是几何元素,甚至是更复杂的部分。
**非负矩阵分解**
(
**NNMF**
)施加的主要条件是,所有涉及的矩阵都必须为非负,并且
`X = UV`
。 因此,一旦定义了标准
`N`
(例如 Frobenius),则简单目标就变成了:
当数据集
`X`
为非负数时,可以应用已被证明的分解技术(例如,在《通过非负矩阵分解学习对象的部分》中)在任务目标是提取与样
本
结构部分相对应的原子时更加可靠。 例如,在图像的情况下,它们应该是几何元素,甚至是更复杂的部分。
**非负矩阵分解**
(
**NNMF**
)施加的主要条件是,所有涉及的矩阵都必须为非负,并且
`X = UV`
。 因此,一旦定义了标准
`N`
(例如 Frobenius),则简单目标就变成了:
![](
img/f554b0eb-d763-49ca-a7c2-6916ff5e9523.png
)
...
...
new/handson-unsup-learn-py/08.md
浏览文件 @
46b0bdb2
...
...
@@ -300,7 +300,7 @@ Sample output of the deep convolutional autoencoder
在这种情况下,自动编码器的目标是消除噪声项并恢复原始样本
`x[i]`
。 从数学角度来看,标准和
**去噪自动编码器**
之间没有特别的区别; 但是,重要的是要考虑此类模型的容量需求。 由于他们必须恢复原始样本,因此在输入受损(其特征占用更大的样本空间)的情况下,层的数量和尺寸可能比标准自动编码器要大。 当然,考虑到复杂性,没有一些测试就不可能有清晰的洞察力。 因此,我强烈建议从较小的模型开始,然后增加容量,直到最佳成本函数达到合适的值为止。 为了增加噪音,有几种可能的策略:
*
破坏每个批量中的样
品
(贯穿整个时期)。
*
破坏每个批量中的样
本
(贯穿整个时期)。
*
将噪声层用作编码器的输入 1。
*
将压差层用作编码器的输入 1(例如,椒盐噪声)。 在这种情况下,丢失的概率可以是固定的,也可以以预定义的间隔(例如,(0.1,0.5))随机采样。
...
...
@@ -1117,7 +1117,7 @@ X_tsne = tsne.fit_transform(X_dbn)
t-SNE plot of the unsupervised DBN output representations
如您所见,大多数块都具有很强的凝聚力,这表明数字的特殊属性已在较低维空间中成功表示。 在某些情况下,相同的数字组被划分为更多的簇,但是总的来说,噪点(隔离点)的数量非常少。 例如,包含数字
`2`
的组用符号
`x`
表示。 大部分样
品
在
*0 < x [0] < 30,x [1] < -40*
范围内; 但是,一个子组也位于
*-10 < x [1] < 10*
范围内。 如果我们检查这个小集群的邻居,它们是由代表数字
`8`
(用正方形表示)的样本组成的。 容易理解,某些格式错误的二进制与格式错误的八进制非常相似,这证明了拆分原始群集的合理性。 从统计角度来看,所解释的方差可能会产生不同的影响。 在某些情况下,只有几个组件足以确定类的特殊功能,但这通常是不正确的。 当属于不同类别的样本显示出相似性时,只能由于次级成分的差异而做出区分。 在处理包含几乎(甚至部分)重叠样本的数据集时,这一考虑非常重要。 进行降维时,数据科学家的主要任务不是检查总体解释的方差,而是了解是否存在受降维不利影响的区域。 在这种情况下,可以定义多个检测规则(例如,当样本
*x [i] ∈R [1]*
或
*x [i] ∈R [4] →x [i]*
,
*y [k [ 或尝试避免使用模型来创建此细分(在这种情况下,我们邀请您测试更复杂的 DBN 和更高维的输出表示形式)。]*
如您所见,大多数块都具有很强的凝聚力,这表明数字的特殊属性已在较低维空间中成功表示。 在某些情况下,相同的数字组被划分为更多的簇,但是总的来说,噪点(隔离点)的数量非常少。 例如,包含数字
`2`
的组用符号
`x`
表示。 大部分样
本
在
*0 < x [0] < 30,x [1] < -40*
范围内; 但是,一个子组也位于
*-10 < x [1] < 10*
范围内。 如果我们检查这个小集群的邻居,它们是由代表数字
`8`
(用正方形表示)的样本组成的。 容易理解,某些格式错误的二进制与格式错误的八进制非常相似,这证明了拆分原始群集的合理性。 从统计角度来看,所解释的方差可能会产生不同的影响。 在某些情况下,只有几个组件足以确定类的特殊功能,但这通常是不正确的。 当属于不同类别的样本显示出相似性时,只能由于次级成分的差异而做出区分。 在处理包含几乎(甚至部分)重叠样本的数据集时,这一考虑非常重要。 进行降维时,数据科学家的主要任务不是检查总体解释的方差,而是了解是否存在受降维不利影响的区域。 在这种情况下,可以定义多个检测规则(例如,当样本
*x [i] ∈R [1]*
或
*x [i] ∈R [4] →x [i]*
,
*y [k [ 或尝试避免使用模型来创建此细分(在这种情况下,我们邀请您测试更复杂的 DBN 和更高维的输出表示形式)。]*
...
...
new/handson-unsup-learn-py/10.md
浏览文件 @
46b0bdb2
...
...
@@ -88,7 +88,7 @@
4.
这意味着第一个模型的参数数量是第二个模型的两倍。
5.
第二个是因为它可以用更少的参数实现相同的结果。
6.
因为我们要为组件的自动选择采用这种模型。 这意味着我们要从更大数量的权重开始,期望它们中的许多权重将被迫接近 0。由于 Dirichlet 分布具有非常稀疏的性质并且适用于单纯形,因此,这是最佳的选择。 先验。
7.
如果它们是从相同的来源收集的,并且已验证标记的来源,我们可以采用半监督方法(例如,生成高斯混合物),以便为其余样
品
找到最合适的标记。
7.
如果它们是从相同的来源收集的,并且已验证标记的来源,我们可以采用半监督方法(例如,生成高斯混合物),以便为其余样
本
找到最合适的标记。
...
...
@@ -115,7 +115,7 @@
1.
协方差矩阵已经是对角线; 因此,特征向量是标准
`x`
和
`y`
versors(1,0)和
`(0, 1)`
,特征值是 2 和 1。因此,
`x`
轴是主要成分,
`y`
轴是第二个成分。
2.
由于球
*B [0.5] `(0, 0)`*
是空的,因此在该点(
*0,0*
)周围没有样
品
。 考虑到水平方差
*σ [x]^2 = 2*
,我们可以想象
`X`
被分解为两个斑点,因此可以想象
*x = 0*
行是水平判别器。 但是,这只是一个假设,需要使用实际数据进行验证。
2.
由于球
*B [0.5] `(0, 0)`*
是空的,因此在该点(
*0,0*
)周围没有样
本
。 考虑到水平方差
*σ [x]^2 = 2*
,我们可以想象
`X`
被分解为两个斑点,因此可以想象
*x = 0*
行是水平判别器。 但是,这只是一个假设,需要使用实际数据进行验证。
3.
不,他们不是。 PCA 之后的协方差矩阵不相关,但不能保证统计独立性。
4.
是; Kurt(
`X`
)的分布是超高斯分布,因此达到峰值且尾巴很重。 这样可以保证找到独立的组件。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录