Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
apachecn-dl-zh
提交
8f2496a2
A
apachecn-dl-zh
项目概览
OpenDocCN
/
apachecn-dl-zh
10 个月 前同步成功
通知
298
Star
83
Fork
35
代码
文件
提交
分支
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 搜索 >>
提交
8f2496a2
编写于
12月 12, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-12-12 11:33:08
上级
48313fea
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
14 addition
and
14 deletion
+14
-14
new/handson-unsup-learn-py/02.md
new/handson-unsup-learn-py/02.md
+13
-13
new/handson-unsup-learn-py/07.md
new/handson-unsup-learn-py/07.md
+1
-1
未找到文件。
new/handson-unsup-learn-py/02.md
浏览文件 @
8f2496a2
...
...
@@ -51,7 +51,7 @@
![](
img/165e5351-6d27-4a0d-be73-bf40c3d8df31.png
)
可以假设
`p_data(x)`
的概率空间可划分为
包含
`K`
的(可能无限)配置(对于
*K = 1 ,2,...,*
区域
,这样
`p_data(x;k)`
表示样本属于簇
`k`
的概率。 以这种方式,我们指出,当确定
`p_data(x)`
时,每个可能的聚类结构已经存在。 可以对聚类概率分布做出进一步的假设,以更好地近似
`p_data(x)`
(我们将在第 5 章,“软聚类和高斯混合模型”)。 但是,当我们尝试将概率空间(和相应的样本)划分为内聚组时,我们可以假设两种可能的策略:
可以假设
`p_data(x)`
的概率空间可划分为
(可能无限的)配置,包含
`K`
的区域(对于
`K = 1, 2, ...`
)
,这样
`p_data(x;k)`
表示样本属于簇
`k`
的概率。 以这种方式,我们指出,当确定
`p_data(x)`
时,每个可能的聚类结构已经存在。 可以对聚类概率分布做出进一步的假设,以更好地近似
`p_data(x)`
(我们将在第 5 章,“软聚类和高斯混合模型”)。 但是,当我们尝试将概率空间(和相应的样本)划分为内聚组时,我们可以假设两种可能的策略:
*
**硬聚类**
:在这种情况下,每个样本
`x[p] ∈ X`
被分配给一个聚类
`K[i]`
,对于
`i ≠ j`
,
`K[i] ∩ K[j] = ∅`
。 我们将要讨论的大多数算法都属于这一类。 在这种情况下,问题可以表示为将聚类分配给每个输入样本的参数化函数:
...
...
@@ -118,7 +118,7 @@ for i in range(1, distances.shape[0] + 1):
![](
img/251ae7ce-ea13-446d-a7ea-8c372fbc9cf0.png
)
在先前的公式中,
`C[p]`
是取决于
`p`
的常数。 当
`p → ∞`
时,期望值
*E [D [max]^p -D [min]^p ]*
i 在边界
*k [1] C [p] d^(1 / p- 1/2)*
和
*(M-1)C [p] d^(1 / p-1 / 2)*
。 当
*p > 2*
和
*d→∞时,术语 *
d^(1 / p-1 / 2) →0
**
,最大和最小距离之差的期望值收敛到
`0`
。 这意味着,独立于样本,当维数足够高且
`p > 2`
时,几乎不可能使用 Minkowski 距离来区分两个样本。 当我们发现距离函数的相似性时,该定理警告我们选择
`d >> 1`
时选择
`p`
较大的值。 当
`d >> 1`
(即使
`p = 1`
是最佳选择)时,欧几里德度量标准的常用选择也相当可靠 组件的重量(可以假定它们具有相同的重量),并保证在高维空间中的可区分性。 相反,高维空间中的
`p >> 2`
对于所有最大分量保持固定而所有其他分量都被修改的样本,则产生无法区分的距离(例如,如果
`x = (5, 0) → (5, a)`
,其中
`|a| < 5`
),如以下示例所示 :
在先前的公式中,
`C[p]`
是取决于
`p`
的常数。 当
`p → ∞`
时,期望值
`E[D[max]^p - D[min]^p] * i`
在边界
`k[1] C[p] d^(1 / p- 1/2)`
和
`(M-1) C[p] d^(1 / p-1 / 2)`
。 当
`p > 2`
和
`d → ∞`
时,项
`d^(1 / p-1 / 2) → 0`
,最大和最小距离之差的期望值收敛到
`0`
。 这意味着,独立于样本,当维数足够高且
`p > 2`
时,几乎不可能使用 Minkowski 距离来区分两个样本。 当我们发现距离函数的相似性时,该定理警告我们选择
`d >> 1`
时选择
`p`
较大的值。 当
`d >> 1`
(即使
`p = 1`
是最佳选择)时,欧几里德度量标准的常用选择也相当可靠 组件的重量(可以假定它们具有相同的重量),并保证在高维空间中的可区分性。 相反,高维空间中的
`p >> 2`
对于所有最大分量保持固定而所有其他分量都被修改的样本,则产生无法区分的距离(例如,如果
`x = (5, 0) → (5, a)`
,其中
`|a| < 5`
),如以下示例所示 :
```
py
import
numpy
as
np
...
...
@@ -154,7 +154,7 @@ Std(distances) = 0.042885311128215066
**K 均值**
是最大分离和最大内部凝聚力原理的最简单实现。 假设我们有一个数据集
*X∈^(M×N)*
(即
*MN*
维样本),我们希望将其拆分为
`K`
簇和一组
`K`
个
**重心**
,它们对应于分配给每个簇
`K[j]`
的样本均值:
**K 均值**
是最大分离和最大内部凝聚力原理的最简单实现。 假设我们有一个数据集
`X ∈ R^(M×N)`
(即
`MN`
维样本),我们希望将其拆分为
`K`
簇和一组
`K`
个
**重心**
,它们对应于分配给每个簇
`K[j]`
的样本均值:
![](
img/02e9a6e4-5321-44f8-b545-b0e6cd0bf18f.png
)
...
...
@@ -170,7 +170,7 @@ Std(distances) = 0.042885311128215066
![](
img/2654403d-f595-446f-a602-b22518cc792f.png
)
重复该过程,直到质心停止变化为止(这也意味着序列
*S(0)>*
*S(1)> ... > S(t [末端])*
)。 读者应该立即了解到,计算时间受初始猜测的影响很大。 如果
*M^((0))*
非常接近
*M^((t [端]))*
,则可以找到一些迭代 最佳配置。 相反,当
*M^((0))*
纯粹是随机的时,无效初始选择的概率接近
`1`
(也就是说,每个初始均匀随机选择为 在计算复杂度方面几乎相等)。
重复该过程,直到质心停止变化为止(这也意味着序列
`S(0) > S(1) > ... > S(t[end])`
)。 读者应该立即了解到,计算时间受初始猜测的影响很大。 如果
`M^(0)`
非常接近
`M^t[end]`
,则可以找到一些迭代 最佳配置。 相反,当
`M^(0)`
纯粹是随机的时,无效初始选择的概率接近
`1`
(也就是说,每个初始均匀随机选择为 在计算复杂度方面几乎相等)。
...
...
@@ -186,7 +186,7 @@ Std(distances) = 0.042885311128215066
![](
img/7a396ec7-a6d1-4776-8bfb-cb03028f76a7.png
)
`D(·)`
表示样本
*x∈X*
与已选择的质心之间的最短距离。 一旦函数被计算,就可以如下确定概率分布
*G(x)*
:
`D(·)`
表示样本
`x ∈ X`
与已选择的质心之间的最短距离。 一旦函数被计算,就可以如下确定概率分布
`G(x)`
:
![](
img/c5c5330a-28ea-4610-b18e-e25a45a3d399.png
)
...
...
@@ -194,7 +194,7 @@ Std(distances) = 0.042885311128215066
![](
img/3ad9f4df-5b14-4473-8e60-6c6a94113d0d.png
)
由于通过更好的选择降低了
`S`
,因此先前的公式设置了与
`log K`
大致成比例的期望值
`E[S]`
的上限。 例如,对于
`K = 10`
,
`E[S] <= S [opt]`
,并且对于
`K = 3`
,
`E[S] <= 12.87 * S[opt]`
为
*K = 3*
。 该结果揭示了两个重要因素。 第一个是当
`K`
不太大时,KMeans++ 的性能会更好;第二个(可能也是最重要的)是,单个 KMeans++ 初始化不足以获取最佳配置。 因此,常见的实现(例如 scikit-learn)执行可变数量的初始化,并选择初始惯量最小的初始化。
由于通过更好的选择降低了
`S`
,因此先前的公式设置了与
`log K`
大致成比例的期望值
`E[S]`
的上限。 例如,对于
`K = 10`
,
`E[S] <= S [opt]`
,并且对于
`K = 3`
,
`E[S] <= 12.87 * S[opt]`
为
`K = 3`
。 该结果揭示了两个重要因素。 第一个是当
`K`
不太大时,KMeans++ 的性能会更好;第二个(可能也是最重要的)是,单个 KMeans++ 初始化不足以获取最佳配置。 因此,常见的实现(例如 scikit-learn)执行可变数量的初始化,并选择初始惯量最小的初始化。
...
...
@@ -269,7 +269,7 @@ dff = pd.concat([df, df_tsne], axis=1)
乳腺癌威斯康星州数据集的二维 t-SNE 图
该图是高度非线性的(别忘了这是从
*ℜ^(30)*
到
*ℜ^2*
的投影)) 恶性样本中的一半在半平面
*y < 0*
中。 不幸的是,在该区域中也有适度的良性样本,因此我们不期望使用
*K = 2*
进行完美分离(在这种情况下,很难理解真实的几何形状,但是 t- SNE 保证二维分布的 Kullback-Leibler 散度与原始高维散度最小。 现在,我们以
*K = 2*
进行初始聚类。 我们将使用
`n_clusters=2`
和
`max_iter=1000`
创建
`KMeans`
scikit-learn 类的实例(
`random_state`
始终设置为等于
`1000`
)。
该图是高度非线性的(别忘了这是从
`ℜ^30`
到
`ℜ^2`
的投影),恶性样本中的一半在半平面
`y < 0`
中。 不幸的是,在该区域中也有适度的良性样本,因此我们不期望使用
`K = 2`
进行完美分离(在这种情况下,很难理解真实的几何形状,但是 t- SNE 保证二维分布的 Kullback-Leibler 散度与原始高维散度最小。 现在,我们以
`K = 2`
进行初始聚类。 我们将使用
`n_clusters=2`
和
`max_iter=1000`
创建
`KMeans`
scikit-learn 类的实例(
`random_state`
始终设置为等于
`1000`
)。
其余参数为默认参数(使用 10 次尝试的 KMeans++ 初始化),如下所示:
...
...
@@ -368,7 +368,7 @@ for i in range(2, 51):
惯性,作为乳腺癌威斯康星州数据集的簇数的函数
在这种情况下,基本事实表明,我们应该根据诊断将其分为两组。 但是,该图显示了急剧下降,下降到
*K = 8*
并以较低的斜率继续,直到大约
*K = 40*
为止。 在初步分析过程中,我们已经看到二维投影由具有相同诊断的许多孤立的斑点组成。 因此,我们可以决定采用例如
*K = 8*
并分析与每个群集相对应的特征。 由于这不是分类任务,因此可以将真实情况用作主要参考,但是正确的探索性分析可以尝试理解子结构的组成,以便为技术人员(例如,医生)提供更多详细信息。
在这种情况下,基本事实表明,我们应该根据诊断将其分为两组。 但是,该图显示了急剧下降,下降到
`K = 8`
并以较低的斜率继续,直到大约
`K = 40`
为止。 在初步分析过程中,我们已经看到二维投影由具有相同诊断的许多孤立的斑点组成。 因此,我们可以决定采用例如
`K = 8`
并分析与每个群集相对应的特征。 由于这不是分类任务,因此可以将真实情况用作主要参考,但是正确的探索性分析可以尝试理解子结构的组成,以便为技术人员(例如,医生)提供更多详细信息。
现在,我们在乳腺癌威斯康星州数据集上对八个聚类进行 K 均值聚类,以描述两个样本组, 的结构,如下所示
...
...
@@ -390,7 +390,7 @@ kmdff = pd.concat([dff, df_km], axis=1)
乳腺癌威斯康星州数据集的 K 均值聚类(
`K = 8`
)结果
现在,让我们考虑位于图底部的子群集(
*-25 < x < 30*
和
*-60 < y < -40*
)[
, 如下:
现在,让我们考虑位于图底部的子群集(
`-25 < x < 30`
和
`-60 < y < -40`
)
, 如下:
```
py
sdff
=
dff
[(
dff
.
x
>
-
25.0
)
&
(
dff
.
x
<
30.0
)
&
(
dff
.
y
>
-
60.0
)
&
(
dff
.
y
<
-
40.0
)]
...
...
@@ -406,7 +406,7 @@ print(sdff[['perimeter_mean', 'area_mean', 'smoothness_mean',
根据事实,我们知道所有这些样本都是恶性的,但是我们可以尝试确定一个规则。
`area_mean`
/
`perimeter_mean`
之比约为
`9.23`
,相对于平均值,相对标准偏差非常小。 这意味着这些样本在非常狭窄的范围内代表了扩展的肿瘤。 而且,
`concavity_mean`
和
`symmetry_mean`
均大于总值。 因此(在不进行科学合理分析的前提下),我们可以得出结论,分配给这些簇的样本代表了已经进入晚期的非常糟糕的肿瘤。
为了与良性样本进行比较,现在考虑由
*x > -10*
和
*20 < y < 50*
,界定的区域 如下:
为了与良性样本进行比较,现在考虑由
`x > -10`
和
`20 < y < 50`
,界定的区域 如下:
```
py
sdff
=
dff
[(
dff
.
x
>
-
10.0
)
&
(
dff
.
y
>
20.0
)
&
(
dff
.
y
<
50.0
)]
...
...
@@ -454,9 +454,9 @@ print(sdff[['perimeter_mean', 'area_mean', 'smoothness_mean',
第一张图显示了
`K = 2`
的
*自然*
聚类。 第一个轮廓非常清晰,表明平均群集间距离具有较大的差异。 而且,一个集群比另一个集群具有更多的分配(即使它不那么尖锐)。 从数据集描述中,我们知道这两个类别是不平衡的(357 良性与 212 恶性),因此,不对称是部分合理的。 但是,一般而言,当数据集平衡时,良好的轮廓图的特征是具有均匀轮廓的均质簇,其圆形轮廓应接近 1.0。 实际上,当形状类似于长雪茄时,这意味着群集内距离非常接近其平均值(高内聚),并且相邻群集之间存在明显的分隔。 对于
`K = 2`
,我们拥有合理的分数,因为第一个簇达到 0.6,而第二个簇具有约 0.8 的峰值。 但是,尽管后者的大多数样本的特征是
`s(•) > 0.75`
,但在前一种样本中,约有一半的样本低于 0.5。 分析表明,较大的聚类更均匀,并且 K 均值更易于分配样本(即,就度量而言,
`x[i] ∈ K[2]`
的方差较小,在高维空间中,代表
`K[2]`
的球比代表
`K[1]`
的球更均匀。)。
其他图显示了类似的情况,因为已检测到非常紧密的聚类以及一些尖锐的聚类。 这意味着宽度差异非常一致。 但是,随着
`K`
的增加,由于分配的样本数趋于变得相似,因此我们获得了更加均一的簇。 具有
`s
`
*(·)> 0.75*
的非常圆形(几乎矩形)的簇的存在证实了数据集至少包含一组非常有凝聚力的样本,其样本 相对于分配给其他群集的任何其他点的距离都非常接近。 我们知道,恶性类(即使其基数更大)更为紧凑,而良性类则分布在更宽的子空间中。 因此,我们可以假设,对于所有
`K`
来说,最圆的簇是由恶性样本组成的,而其他所有簇都可以根据其清晰度进行区分。 例如,对于
*K = 8*
,第三簇很可能对应于第一图中第二簇的中心部分,而较小的簇包含属于良性子集的孤立区域的样本。
其他图显示了类似的情况,因为已检测到非常紧密的聚类以及一些尖锐的聚类。 这意味着宽度差异非常一致。 但是,随着
`K`
的增加,由于分配的样本数趋于变得相似,因此我们获得了更加均一的簇。 具有
`s
(·) > 0.75`
的非常圆形(几乎矩形)的簇的存在证实了数据集至少包含一组非常有凝聚力的样本,其样本 相对于分配给其他群集的任何其他点的距离都非常接近。 我们知道,恶性类(即使其基数更大)更为紧凑,而良性类则分布在更宽的子空间中。 因此,我们可以假设,对于所有
`K`
来说,最圆的簇是由恶性样本组成的,而其他所有簇都可以根据其清晰度进行区分。 例如,对于
`K = 8`
,第三簇很可能对应于第一图中第二簇的中心部分,而较小的簇包含属于良性子集的孤立区域的样本。
如果我们不了解基本事实,则应同时考虑
*K = 2*
和
*K = 8*
(甚至更大)。 实际上,在第一种情况下,我们可能会丢失许多细粒度的信息,但是我们正在确定一个强大的细分领域(假设由于问题的性质,一个集群的凝聚力不是很高)。 另一方面,在
*K > 8*
的情况下,簇明显更小,具有适度的内聚性,它们代表具有某些共同特征的亚组。 正如我们在上一节中讨论的那样,最终的选择取决于许多因素,这些工具只能提供一般的指示。 此外,当聚类是非凸的或它们的方差未在所有特征之间均匀分布时,K 均值将始终产生次优性能,因为所得聚类将包含较大的空白空间。 如果没有特定的方向,则群集的最佳数量与包含均匀(宽度大致相同)的圆形图的图相关联。 如果形状对于任何
`K`
值仍然保持清晰,则意味着几何形状与对称度量不完全兼容(例如,簇非常拉伸),应考虑其他方法。
如果我们不了解基本事实,则应同时考虑
`K = 2`
和
`K = 8`
(甚至更大)。 实际上,在第一种情况下,我们可能会丢失许多细粒度的信息,但是我们正在确定一个强大的细分领域(假设由于问题的性质,一个集群的凝聚力不是很高)。 另一方面,在
`K > 8`
的情况下,簇明显更小,具有适度的内聚性,它们代表具有某些共同特征的亚组。 正如我们在上一节中讨论的那样,最终的选择取决于许多因素,这些工具只能提供一般的指示。 此外,当聚类是非凸的或它们的方差未在所有特征之间均匀分布时,K 均值将始终产生次优性能,因为所得聚类将包含较大的空白空间。 如果没有特定的方向,则群集的最佳数量与包含均匀(宽度大致相同)的圆形图的图相关联。 如果形状对于任何
`K`
值仍然保持清晰,则意味着几何形状与对称度量不完全兼容(例如,簇非常拉伸),应考虑其他方法。
...
...
@@ -466,7 +466,7 @@ print(sdff[['perimeter_mean', 'area_mean', 'smoothness_mean',
此措施(以及从现在开始讨论的所有其他措施)是基于对基本事实的了解。 在引入索引之前,定义一些常用值会很有帮助。 如果我们用
`Y[true]`
表示包含真实分配的集合,而
`Y[pred]`
则表示预测的集合(均包含
*[M*
个值和
`K`
个簇),我们可以估计以下概率:
此措施(以及从现在开始讨论的所有其他措施)是基于对基本事实的了解。 在引入索引之前,定义一些常用值会很有帮助。 如果我们用
`Y[true]`
表示包含真实分配的集合,而
`Y[pred]`
则表示预测的集合(均包含
`M`
个值和
`K`
个簇),我们可以估计以下概率:
![](
img/f96440cf-9941-469f-8e59-c4db459c0097.png
)
...
...
new/handson-unsup-learn-py/07.md
浏览文件 @
8f2496a2
...
...
@@ -232,7 +232,7 @@ d = l[:l.shape[0]-1] - l[1:]
每个主成分的特征值差异
可以看出,第一主成分的差异非常大,与第四主成分(
*λ [4] -λ [3]*
); 但是,下一个差异仍然很高,虽然对应
`$1[$2]`
突然下降。 在这一点上,趋势几乎是稳定的(除了一些残余振荡),直到
`$1[$2]`
为止,然后趋势开始迅速下降,趋于趋于零 。 由于我们仍然希望获得正方形图像,因此我们将选择
*k = 16*
(相当于将每一边除以四)。 在另一个任务中,您可以选择
*k = 15*
,甚至
*k = 8*
; 但是,为了更好地理解降维导致的误差,也将有助于分析所解释的方差。 因此,让我们从执行 PCA 开始:
可以看出,第一主成分的差异非常大,与第四主成分(
*λ [4] -λ [3]*
); 但是,下一个差异仍然很高,虽然对应
`$1[$2]`
突然下降。 在这一点上,趋势几乎是稳定的(除了一些残余振荡),直到
`$1[$2]`
为止,然后趋势开始迅速下降,趋于趋于零 。 由于我们仍然希望获得正方形图像,因此我们将选择
`k = 16`
(相当于将每一边除以四)。 在另一个任务中,您可以选择
`k = 15`
,甚至
`k = 8`
; 但是,为了更好地理解降维导致的误差,也将有助于分析所解释的方差。 因此,让我们从执行 PCA 开始:
```
py
from
sklearn.decomposition
import
PCA
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录