Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
白麟_嗷呜
apachecn-dl-zh
提交
e5047c8d
A
apachecn-dl-zh
项目概览
白麟_嗷呜
/
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,发现更多精彩内容 >>
提交
e5047c8d
编写于
12月 15, 2020
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
2020-12-15 15:10:47
上级
982c5be1
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
22 addition
and
22 deletion
+22
-22
new/handson-unsup-learn-py/03.md
new/handson-unsup-learn-py/03.md
+1
-1
new/handson-unsup-learn-py/04.md
new/handson-unsup-learn-py/04.md
+9
-9
new/handson-unsup-learn-py/05.md
new/handson-unsup-learn-py/05.md
+5
-5
new/handson-unsup-learn-py/06.md
new/handson-unsup-learn-py/06.md
+6
-6
new/handson-unsup-learn-py/10.md
new/handson-unsup-learn-py/10.md
+1
-1
未找到文件。
new/handson-unsup-learn-py/03.md
浏览文件 @
e5047c8d
...
...
@@ -444,7 +444,7 @@ print(sdff[sdff.columns[0:10]].describe())
群集不稳定性是 Von Luxburg 提出的一种方法(在《群集稳定性:概述》中)可以用以下方法衡量算法的优缺点: 关于特定数据集。 它可以用于不同的目的(例如,调整超参数或找到最佳数目的群集),并且它相对容易计算。 该方法基于这样的想法,即满足最大内聚和分离要求的聚类结果也应该对数据集的噪声扰动具有鲁棒性。 换句话说,如果将数据集
`X`
分割为簇集
`C`
,则派生数据集
`X[n]`
(基于
功能
)应映射到同一群集集。 如果不满足此条件,则通常有两种可能性:噪声扰动太强或算法对小变化过于敏感,因此不稳定。 因此,我们定义了原始数据集
`X`
的一组
`k`
扰动(或二次采样)版本:
群集不稳定性是 Von Luxburg 提出的一种方法(在《群集稳定性:概述》中)可以用以下方法衡量算法的优缺点: 关于特定数据集。 它可以用于不同的目的(例如,调整超参数或找到最佳数目的群集),并且它相对容易计算。 该方法基于这样的想法,即满足最大内聚和分离要求的聚类结果也应该对数据集的噪声扰动具有鲁棒性。 换句话说,如果将数据集
`X`
分割为簇集
`C`
,则派生数据集
`X[n]`
(基于
特征的细微扰动
)应映射到同一群集集。 如果不满足此条件,则通常有两种可能性:噪声扰动太强或算法对小变化过于敏感,因此不稳定。 因此,我们定义了原始数据集
`X`
的一组
`k`
扰动(或二次采样)版本:
![](
img/9c11b1f1-7355-49a9-b593-74696be63e29.png
)
...
...
new/handson-unsup-learn-py/04.md
浏览文件 @
e5047c8d
...
...
@@ -34,7 +34,7 @@
*
Matplotlib 2.0+
*
Seaborn 0.9+
数据集
可以从 UCI 机器学习存储库中获得。 可以从
[
这里
](
https://archive.ics.uci.edu/ml/datasets/water+treatment+plant
)
下载 CSV 文件,除了添加列名外,不需要任何预处理。 ,这将在加载阶段发生。
数据集可以从 UCI 机器学习存储库中获得。 可以从
[
这里
](
https://archive.ics.uci.edu/ml/datasets/water+treatment+plant
)
下载 CSV 文件,除了添加列名外,不需要任何预处理。 ,这将在加载阶段发生。
[
可以在 GitHub 存储库上找到示例
](
https://github.com/PacktPublishing/HandsOn-Unsupervised-Learning-with-Python/tree/master/Chapter04
)
。
...
...
@@ -54,7 +54,7 @@
![](
img/543602f0-e890-481e-9ebd-28453d15217b.png
)
在前面的示例中,群集
`C[i]`
和
`C[j]`
合并为
`C[k]`
; 因此,我们在第二步中获得
`n-1`
个簇。 该过程继续进行,直到剩下的两个群集合并为一个包含整个数据集的单个块。 相反,
**除法**
方法(由 Kaufman 和 Roussew 最初提出,使用 DIANA 算法)在相反的方向上操作,从
`X`
开始,最后
以每个群集包含一个
单个样本:
在前面的示例中,群集
`C[i]`
和
`C[j]`
合并为
`C[k]`
; 因此,我们在第二步中获得
`n-1`
个簇。 该过程继续进行,直到剩下的两个群集合并为一个包含整个数据集的单个块。 相反,
**除法**
方法(由 Kaufman 和 Roussew 最初提出,使用 DIANA 算法)在相反的方向上操作,从
`X`
开始,最后
每个群集包含
单个样本:
![](
img/ed6383c7-bc83-46ba-9f2c-9282e9b7a8bd.png
)
...
...
@@ -82,7 +82,7 @@
![](
img/d851736e-2e48-4de6-b798-6fd828d24c42.png
)
这些距离之间的主要差异在第 2 章,“聚类基础知识”中进行了讨论。 在本章中,介绍
**余弦**
距离很有用,这不是一个合适的距离度量(从数学角度来看),但是当样本之间的区分必须仅取决于
角度时,这将非常有帮助 它们形成
:
这些距离之间的主要差异在第 2 章,“聚类基础知识”中进行了讨论。 在本章中,介绍
**余弦**
距离很有用,这不是一个合适的距离度量(从数学角度来看),但是当样本之间的区分必须仅取决于
他们形成的角度时,这将非常有帮助
:
![](
img/f6f3bba1-aaea-4d25-85a7-a5c056ec4320.png
)
...
...
@@ -274,7 +274,7 @@ plt.show()
换句话说,
`CP[ij]`
元素是观察同一群集中
`x[i]`
和
`x[j]`
所需的最小差异。 可以证明
`CP[ij]`
是
`x[i]`
和
`x[j]`
之间的距离度量; 因此,
`CP`
与
`P`
类似,并且具有与邻近矩阵相同的属性(例如,所有对角元素为空)。 特别是,我们对它们的相关性感兴趣(在
`-1`
和
`1`
范围内标准化)。 这样的值(
**色相关系数**
(
**CPC**
)表示
`P`
和
`CP`
之间的一致性程度,并且可以很容易地计算出, 如以下等式所示。
由于
`P`
和
`CP`
均为
`n×n`
对称矩阵且对角元素为空,因此可以仅考虑下三角
部分(不包括对角线,表示为
`Tril(·)`
),包含
`n (n-1) / 2`
值。 因此,平均值如下:
由于
`P`
和
`CP`
均为
`n×n`
对称矩阵且对角元素为空,因此可以仅考虑下三角部分(不包括对角线,表示为
`Tril(·)`
),包含
`n (n-1) / 2`
值。 因此,平均值如下:
![](
img/d7e30ca9-4bbe-45de-a1ee-1f98624ceced.png
)
...
...
@@ -327,7 +327,7 @@ CPC Average linkage: 0.794
现在,让我们考虑一个更大的数据集上的更详细的问题(在本章开头的“技术要求”部分中提供了下载说明),其中包含 527 个样本,其中有 38 个化学和物理变量描述了
状态 水处理厂
。 正如同一作者( Bejar,Cortes 和 Poch)所述,该域的结构较差,需要仔细分析。 同时,我们的目标是使用不可知论的方法找到最佳的聚类。 换句话说,我们将不考虑语义标记过程(需要领域专家),而仅考虑数据集的几何结构以及通过聚集算法发现的关系。
现在,让我们考虑一个更大的数据集上的更详细的问题(在本章开头的“技术要求”部分中提供了下载说明),其中包含 527 个样本,其中有 38 个化学和物理变量描述了
水处理厂的状态
。 正如同一作者( Bejar,Cortes 和 Poch)所述,该域的结构较差,需要仔细分析。 同时,我们的目标是使用不可知论的方法找到最佳的聚类。 换句话说,我们将不考虑语义标记过程(需要领域专家),而仅考虑数据集的几何结构以及通过聚集算法发现的关系。
下载后,可以使用 Pandas 加载 CSV 文件(称为
`water-treatment.data`
)(当然,必须更改术语
`<DATA_PATH>`
才能指向文件的确切位置)。 第一列是与特定植物相关的索引,而所有其他值都是数字,可以转换为
`float64`
。 缺少的值用
`'?'`
字符表示,并且由于我们没有其他信息,因此将每个属性的均值设置为:
...
...
@@ -340,7 +340,7 @@ df = pd.read_csv(data_path, header=None, index_col=0, na_values='?').astype(np.f
df
.
fillna
(
df
.
mean
(),
inplace
=
True
)
```
由于单个变量的大小存在很大差异(我邀请读者使用 DataFrame 上的
`describe`
函数检查此语句),因此最好在范围
`(-1, 1)`
内对其进行标准化,以保持
原始差异:
由于单个变量的大小存在很大差异(我邀请读者使用 DataFrame 上的
`describe`
函数检查此语句),因此最好在范围
`(-1, 1)`
内对其进行标准化,以保持原始差异:
```
py
from
sklearn.preprocessing
import
StandardScaler
...
...
@@ -449,9 +449,9 @@ pdff = pd.concat([dff, df_pred], axis=1)
水处理厂数据集的聚类结果(两个群集)
在此级别上,树状图显示出属于簇和剩余较小块的样本数量很大。 现在我们知道,这样的次级区域对应于
`x ∈ (-40, 10)`
和
`y > 20`
。 同样,结果并不令人惊讶,因为 t-SNE 图表明,这些样本是唯一具有
`y > 20÷25`
的样本(而较大的簇,即使有很大的空白区域,也覆盖了
几乎所有范围)。
在此级别上,树状图显示出属于簇和剩余较小块的样本数量很大。 现在我们知道,这样的次级区域对应于
`x ∈ (-40, 10)`
和
`y > 20`
。 同样,结果并不令人惊讶,因为 t-SNE 图表明,这些样本是唯一具有
`y > 20÷25`
的样本(而较大的簇,即使有很大的空白区域,也覆盖了几乎所有范围)。
因此,我们可以说这些样本代表具有
*极端*
行为的非常不同的植物,如果将新样本分配给该群集,则可能是非标准植物(假设一个标准植物
具有与大多数同行
相似的行为)。 作为练习,我鼓励您测试其他数量的类和不同的链接(尤其是单个链接,这非常特殊),并尝试验证或拒绝某些样本,先前的假设(它们在物理上没有必要被接受) )。
因此,我们可以说这些样本代表具有
*极端*
行为的非常不同的植物,如果将新样本分配给该群集,则可能是非标准植物(假设一个标准植物
具有与大多数同类
相似的行为)。 作为练习,我鼓励您测试其他数量的类和不同的链接(尤其是单个链接,这非常特殊),并尝试验证或拒绝某些样本,先前的假设(它们在物理上没有必要被接受) )。
...
...
@@ -548,7 +548,7 @@ Y_pred = ag.fit_predict(X)
正如预期的那样,样本 18 已分配给大型中央群集,而点 31 和 33 现在已被隔离。 当然,由于该过程是分层的,因此施加连接约束比分离约束更容易。 实际上,虽然可以在初始阶段轻松合并单个样本,但是使用所有链接都无法轻松保证在最终合并之前将其排除。
当需要复杂的约束条件(给定距离和链接)时,通常有必要同时调整连接矩阵和所需的群集数量。 当然,如果期望的结果是通过特定数目的聚类实现的,则也将使用较大的值来实现,直到相异性下界为止(也就是说,合并过程会减少聚类的数量;因此,如果相异性
很大 足够
,所有现有约束将仍然有效)。 例如,如果三个样本被约束为属于同一群集,则通常无法在初始合并阶段之后获得此结果。
当需要复杂的约束条件(给定距离和链接)时,通常有必要同时调整连接矩阵和所需的群集数量。 当然,如果期望的结果是通过特定数目的聚类实现的,则也将使用较大的值来实现,直到相异性下界为止(也就是说,合并过程会减少聚类的数量;因此,如果相异性
足够大
,所有现有约束将仍然有效)。 例如,如果三个样本被约束为属于同一群集,则通常无法在初始合并阶段之后获得此结果。
但是,如果所有三个样本的合并都在某个不同的级别上发生(例如,对应于 30 个群集的 2.0),则它对于
`n < 30`
个群集以及具有
`DL > 2.0`
。 因此,如果我们从 5 个聚类开始,则可以轻松增加此数字,同时注意其相异度级别大于与约束所施加的最后合并对应的相异程度。 建议您与其他数据集一起测试此方法,并尝试定义可以在聚类过程之后轻松验证的先前约束。
...
...
new/handson-unsup-learn-py/05.md
浏览文件 @
e5047c8d
...
...
@@ -480,11 +480,11 @@ for n in range(1, n_max_components + 1):
这种工具是称为
**变分贝叶斯推断**
(您可以在上述论文中找到更多详细信息)的技术的关键元素,它使我们能够轻松找到最佳参数而无需使用 实际的
`p(X | θ)`
。 特别是,在高斯混合中,存在三组不同的参数,并且使用适当的分布对每个参数进行建模。 在这种情况下,我们不希望讨论这些选择的细节,但是理解其原理是有用的。
在贝叶斯框架中,给定可能性,
`p(X | θ)`
是属于后验的同一族的概率密度函数
`p(θ)`
,
`p(θ | X)`
被称为优先于的共轭物。 在这种情况下,显然可以简化此过程,因为可能性的影响仅限于修改前一个参数。 因此,由于似然是正态的,因此为了对均值建模,我们可以采用正态分布(相对于均值的共轭先验),对于协方差矩阵,我们可以使用 Wishart 分布(即
相对于协方差矩阵的逆的共轭先验)。 在此讨论中,不必熟悉所有这些分布(正态分布除外),但是记住它们是共轭先验是有帮助的,因此,在对参数进行初步猜测时,可能性的作用是调整
给定数据集,以便最大程度地提高联合概率。
在贝叶斯框架中,给定可能性,
`p(X | θ)`
是属于后验的同一族的概率密度函数
`p(θ)`
,
`p(θ | X)`
被称为优先于的共轭物。 在这种情况下,显然可以简化此过程,因为可能性的影响仅限于修改前一个参数。 因此,由于似然是正态的,因此为了对均值建模,我们可以采用正态分布(相对于均值的共轭先验),对于协方差矩阵,我们可以使用 Wishart 分布(即
相对于协方差矩阵的逆的共轭先验)。 在此讨论中,不必熟悉所有这些分布(正态分布除外),但是记住它们是共轭先验是有帮助的,因此,在对参数进行初步猜测时,可能性的作用是调整
给定数据集,以便最大程度地提高联合概率。
由于对混合物的权重进行了归一化处理,因此它们的总和必须始终等于 1,并且我们只想自动选择大量组分的子集,因此可以使用 Dirichlet 分布,该分布具有以下有用的特性: 疏。 换句话说,给定一组权重
`w[1], w[2], ..., w[n]`
的 Dirichlet 分布趋于使大多数
权重
的概率相当低,而较小的非空权重子集则决定了主要贡献。 Dirichlet 过程提供了一种替代方法,该过程是一种生成概率分布的特定随机过程。 在这两种情况下,目标都是调整单个参数(称为
**重量浓度参数**
),该参数增加或减少具有稀疏分布(或简单地说是 Dirichlet 分布的稀疏性)的可能性。
由于对混合物的权重进行了归一化处理,因此它们的总和必须始终等于 1,并且我们只想自动选择大量组分的子集,因此可以使用 Dirichlet 分布,该分布具有以下有用的特性: 疏。 换句话说,给定一组权重
`w[1], w[2], ..., w[n]`
的 Dirichlet 分布趋于使大多数
权重
的概率相当低,而较小的非空权重子集则决定了主要贡献。 Dirichlet 过程提供了一种替代方法,该过程是一种生成概率分布的特定随机过程。 在这两种情况下,目标都是调整单个参数(称为
**重量浓度参数**
),该参数增加或减少具有稀疏分布(或简单地说是 Dirichlet 分布的稀疏性)的可能性。
Scikit-learn 实现了贝叶斯高斯混合(通过
`BayesianGaussianMixture`
类),该混合可以基于 Dirichlet 过程和分布。 在此示例中,我们将保留默认值(
`process`
),并检查不同浓度值(
`weight_concentration_prior`
参数)的行为。 还可以针对逆协方差调整高斯平均值的均值和维沙特的自由度。 但是,在没有任何特定先验知识的情况下,很难设置这些值(我们假设我们不知道均值可能位于何处或协方差矩阵的结构),因此,最好保留
从问题的结构中得出的值。 因此,均值(高斯)将等于
`X`
的均值(可以通过
`mean_precision_prior`
参数控制位移;
`< 1.0`
的值倾向于移动)。
`X`
平均值的单一均值,而较大的值会增加位移),并且将自由度(Wishart)的数量设置为等于特征的数量(
`X`
的维数)。 在许多情况下,这些参数会在学习过程中自动进行调整,因此无需更改其初始值。 相反,可以调整
`weight_concentration_prior`
,以增加或减少有效成分的数量(即,其权重不接近零或比其他权重低得多)。
Scikit-learn 实现了贝叶斯高斯混合(通过
`BayesianGaussianMixture`
类),该混合可以基于 Dirichlet 过程和分布。 在此示例中,我们将保留默认值(
`process`
),并检查不同浓度值(
`weight_concentration_prior`
参数)的行为。 还可以针对逆协方差调整高斯平均值的均值和维沙特的自由度。 但是,在没有任何特定先验知识的情况下,很难设置这些值(我们假设我们不知道均值可能位于何处或协方差矩阵的结构),因此,最好保留从问题的结构中得出的值。 因此,均值(高斯)将等于
`X`
的均值(可以通过
`mean_precision_prior`
参数控制位移;
`< 1.0`
的值倾向于移动)。
`X`
平均值的单一均值,而较大的值会增加位移),并且将自由度(Wishart)的数量设置为等于特征的数量(
`X`
的维数)。 在许多情况下,这些参数会在学习过程中自动进行调整,因此无需更改其初始值。 相反,可以调整
`weight_concentration_prior`
,以增加或减少有效成分的数量(即,其权重不接近零或比其他权重低得多)。
在此示例中,我们将使用 5 个部分重叠的高斯分布(特别是其中 3 个共享非常大的重叠区域)生成 500 个二维样本:
...
...
@@ -567,7 +567,7 @@ Weights: [3.07496936e-01 2.02264778e-01 2.94642240e-01 1.95417680e-01 1.78366038
最终配置,具有四个活动组件
可以看到,该模型执行了组件数量的自动选择,并且已将较大的右 Blob 分成几乎正交的两个部分。 即使使用大量初始组件(例如 10 个)训练模型,此结果也保持不变。 作为练习,我建议使用其他值重复该示例,检查权重之间的差异。 贝叶斯高斯混合因避免过拟合的能力而非常强大。 实际上,虽然标准的高斯混合将通过减小它们的协方差来使用所有成分,但必要时(以便覆盖密集区域),这些模型利用了 Dirichlet 过程/分布的特性,以避免激活
组件过多。 例如,可以通过检查模型可实现的最少组件数来深入了解潜在的数据生成过程。 在没有任何其他先验知识的情况下,这样的值是最终配置的良好候选者,因为较少数量的组件也将产生较低的最终可能性。 当然,可以将 AIC / BIC 与这种方法一起使用,以进行另一种形式的确认。 但是,与标准高斯混合的主要区别在于可以包括来自专家的先验信息(例如,均值和协方差的原因结构)。 因此,我邀请您通过更改
`mean_precision_prior`
的值来重复该示例。 例如,可以将
`mean_prior`
参数设置为与
`X`
的平均值不同的值,并调整
`mean_precision_prior`
,以便基于某些参数强制模型实现不同的细分 先验知识
(即,区域中的所有样本应由特定组件生成)。
可以看到,该模型执行了组件数量的自动选择,并且已将较大的右 Blob 分成几乎正交的两个部分。 即使使用大量初始组件(例如 10 个)训练模型,此结果也保持不变。 作为练习,我建议使用其他值重复该示例,检查权重之间的差异。 贝叶斯高斯混合因避免过拟合的能力而非常强大。 实际上,虽然标准的高斯混合将通过减小它们的协方差来使用所有成分,但必要时(以便覆盖密集区域),这些模型利用了 Dirichlet 过程/分布的特性,以避免激活
成分过多。 例如,可以通过检查模型可实现的最少组件数来深入了解潜在的数据生成过程。 在没有任何其他先验知识的情况下,这样的值是最终配置的良好候选者,因为较少数量的组件也将产生较低的最终可能性。 当然,可以将 AIC / BIC 与这种方法一起使用,以进行另一种形式的确认。 但是,与标准高斯混合的主要区别在于可以包括来自专家的先验信息(例如,均值和协方差的原因结构)。 因此,我邀请您通过更改
`mean_precision_prior`
的值来重复该示例。 例如,可以将
`mean_prior`
参数设置为与
`X`
的平均值不同的值,并调整
`mean_precision_prior`
,以便基于某些先验知识强制模型实现不同的细分
(即,区域中的所有样本应由特定组件生成)。
...
...
@@ -583,7 +583,7 @@ Weights: [3.07496936e-01 2.02264778e-01 2.94642240e-01 1.95417680e-01 1.78366038
我们将采用一个简单的过程,使用主要步骤中讨论的权重,均值和协方差矩阵的更新公式,如下所示:
*
所有标记的样本均被视为事实依据。 因此,如果有 k 个类别,我们还需要定义
`k`
个组件,并将每个类别分配给其中一个。 因此,如果
`x[i]`
是标有
`y[i] = {1, 2, ..., k}`
的通用样本, 相应的概率向量将是
`p(x[i]) = (0, 0, ..., 1, 1, 0, ..., 0)`
,其中 1 对应于
与
`y[i]`
类相关的高斯。 换句话说,我们信任标记的样本,并强制单个高斯生成具有相同标记的子集。
*
所有标记的样本均被视为事实依据。 因此,如果有 k 个类别,我们还需要定义
`k`
个组件,并将每个类别分配给其中一个。 因此,如果
`x[i]`
是标有
`y[i] = {1, 2, ..., k}`
的通用样本, 相应的概率向量将是
`p(x[i]) = (0, 0, ..., 1, 1, 0, ..., 0)`
,其中 1 对应于与
`y[i]`
类相关的高斯。 换句话说,我们信任标记的样本,并强制单个高斯生成具有相同标记的子集。
*
所有未标记的样本均以标准方式处理,概率向量是通过将权重乘以每个高斯下的概率来确定的。
让我们首先生成一个包含 500 个二维样本(标记为
`100`
,其余标记为未标记),真实标记为
`0`
和
`1`
且未标记为
`-1`
的数据集:
...
...
new/handson-unsup-learn-py/06.md
浏览文件 @
e5047c8d
...
...
@@ -46,7 +46,7 @@
在所有先前的章节
中,我们一直认为我们的数据集是从隐式数据生成过程
`p_data`
以及所有算法假设
`x[i] ∈ X`
为
**独立且均匀分布的**
(
**IID**
)并进行均匀采样。 我们假设
`X`
足够准确地表示
`p_data`
,以便算法可以学习使用有限的初始知识进行概括。 相反,在本章中,我们感兴趣的是直接建模
`p_data`
,而没有任何具体限制(例如,高斯混合模型通过对数据结构施加约束来实现此目标 分布)。 在讨论一些非常有效的方法之前,简要回顾一下在可测量子集
`X`
包含于
`ℜ^n`
上定义的通用连续概率密度函数
`p(x)`
的性质很有帮助(避免
混淆,我们将用
`p(x)`
表示密度函数,用
`P(x)`
表示实际概率):
在所有先前的章节
中,我们一直认为我们的数据集是从隐式数据生成过程
`p_data`
以及所有算法假设
`x[i] ∈ X`
为
**独立且均匀分布的**
(
**IID**
)并进行均匀采样。 我们假设
`X`
足够准确地表示
`p_data`
,以便算法可以学习使用有限的初始知识进行概括。 相反,在本章中,我们感兴趣的是直接建模
`p_data`
,而没有任何具体限制(例如,高斯混合模型通过对数据结构施加约束来实现此目标分布)。 在讨论一些非常有效的方法之前,简要回顾一下在可测量子集
`X`
包含于
`ℜ^n`
上定义的通用连续概率密度函数
`p(x)`
的性质很有帮助(为了避免
混淆,我们将用
`p(x)`
表示密度函数,用
`P(x)`
表示实际概率):
![](
img/56c00e44-2ed4-4572-a7cd-087d8160596e.png
)
...
...
@@ -58,7 +58,7 @@
![](
img/1eb5c69f-9568-4996-aae5-d3c8b80ba47a.png
)
即使连续空间(例如,高斯)中某个事件的绝对概率为零(因为积分具有相同的极值),概率密度函数还是一种非常有用的度量,可以用来
了解一个样本比 另一个
。 例如:考虑高斯分布
`N(0, 1)`
,密度
`p(1)= 0.4`
,而对于
`x = 2`
密度降低到大约
`0.05`
。 这意味着
`1`
的可能性比
`2`
高
`0.4 / 0.05 = 8`
倍。 同样,我们可以设置可接受阈值
`α`
并定义所有
`x[i]`
样本,
`p(x[i]) < α`
的这些样本为异常(例如,在我们的情况下,
`α = 0.01`
)。 这种选择是异常检测过程中的关键步骤,正如我们将要讨论的那样,它还必须包括潜在的异常值,但是这些异常值仍然是常规样本。
即使连续空间(例如,高斯)中某个事件的绝对概率为零(因为积分具有相同的极值),概率密度函数还是一种非常有用的度量,可以用来
将一个样本与另一个对比来了解它
。 例如:考虑高斯分布
`N(0, 1)`
,密度
`p(1)= 0.4`
,而对于
`x = 2`
密度降低到大约
`0.05`
。 这意味着
`1`
的可能性比
`2`
高
`0.4 / 0.05 = 8`
倍。 同样,我们可以设置可接受阈值
`α`
并定义所有
`x[i]`
样本,
`p(x[i]) < α`
的这些样本为异常(例如,在我们的情况下,
`α = 0.01`
)。 这种选择是异常检测过程中的关键步骤,正如我们将要讨论的那样,它还必须包括潜在的异常值,但是这些异常值仍然是常规样本。
在许多情况下,特征向量是使用多维随机变量建模的。 例如:数据集
`X`
包含于
`R^3`
可以用联合概率密度函数
`p(x, y, z)`
表示。 在一般情况下,实际概率需要三重积分:
...
...
@@ -82,7 +82,7 @@
显然,这是一个非常简单的示例,不需要任何模型。 但是,在现实生活中,密度的结构可能非常复杂,几个高概率区域被低概率区域包围。 这就是为什么必须采用更通用的方法来对整个样本空间进行建模的原因。
当然,异常的语义无法标准化,并且始终取决于所分析的特定问题。 因此,定义异常概念的
常见方法是在
**异常值**
和
**新奇**
之间进行区分。 前者是数据集中包含的样本,即使它们与其他样本之间的距离大于平均值。 因此,
**离群值检测**
过程旨在找出此类
*奇怪的*
样本(例如:考虑之前的示例,如果将
`0.25×0.25`
英寸的芯片包含在数据集中,则显然是一个离群值 )。 相反,
**新奇检测**
的目标略有不同,因为在这种情况下,我们假定使用仅包含
*正常*
样本的数据集; 因此,给定一个新的芯片,我们有兴趣了解我们是否可以将其视为来自原始数据生成过程还是离群值(例如:新手技术人员向我们提出以下问题:是
`0.25×0.25`
英寸的芯片 如果我们已经收集了
*正常*
芯片的
数据集,则可以使用我们的模型来回答问题。
当然,异常的语义无法标准化,并且始终取决于所分析的特定问题。 因此,定义异常概念的
常见方法是在
**异常值**
和
**新奇**
之间进行区分。 前者是数据集中包含的样本,即使它们与其他样本之间的距离大于平均值。 因此,
**离群值检测**
过程旨在找出此类
*新奇*
的样本(例如:考虑之前的示例,如果将
`0.25×0.25`
英寸的芯片包含在数据集中,则显然是一个离群值)。 相反,
**新奇检测**
的目标略有不同,因为在这种情况下,我们假定使用仅包含
*正常*
样本的数据集; 因此,给定一个新的芯片,我们有兴趣了解我们是否可以将其视为来自原始数据生成过程还是离群值(例如:新手技术人员向我们提出以下问题:
`0.25×0.25`
英寸的芯片是否是
*正常*
芯片)。如果我们已经收集了
数据集,则可以使用我们的模型来回答问题。
描述这种情况的另一种方法是将样本视为一系列可能受可变噪声影响的值:
`y(t) = x(t) + n(t)`
。 当
`||n(t)|| << ||x(t)||`
可以分类为
*干净*
:
`y(t) ≈ x(t)`
。 相反,当
`||n(t)|| ≈ ||x(t)||`
时(或更高),它们是离群值,不能代表真实的基础过程
`p_data`
。 由于噪声的平均大小通常比信号小得多,因此
`P(||n(t)|| ≈ ||x(t)||)`
的概率接近于零。 因此,我们可以将异常想象为受异常外部噪声影响的正常样本。 异常和噪声样本管理之间真正的主要区别通常在于检测真实异常并相应地标记样本的能力。 实际上,虽然嘈杂的信号肯定已损坏,然后目标是最大程度地减少噪声的影响,但是异常现象可以很容易地被人类识别并正确标记。 但是,正如已经讨论过的,在本章中,我们有兴趣找出不依赖现有标签的发现方法。 此外,为避免混淆,我们总是引用异常,每次定义数据集的内容(仅内部数据或内部数据及异常值)以及我们的分析目标。 在下一部分中,我们将简要讨论数据集的预期结构。
...
...
@@ -99,7 +99,7 @@
*
`N[outlier] << N`
,如果存在离群检测(即数据集部分为
*污垢*
; 因此找出一种方法将所有异常值过滤掉)
*
`N[outlier] = 0`
(或更实际地,
`P(N[outlier] > 0) → 0`
,如果存在新颖性检测(也就是说,我们通常可以信任现有样本,而将注意力集中在新样本上)
这些标准的原因很明显:让我们考虑前面讨论的示例。 如果在 1,000,000 个处理步骤后观察到的异常率等于 0.2%,则表示存在 2,000 个异常,这对于一个工作过程而言可能是一个合理的值。 如果这个数字大得多,则意味着系统中应该存在一个更严重的问题,这超出了数据科学家的职责范围。 因此,在这种情况下,我们期望一个数据集包含大量正确的样本和非常少的异常(甚至为零)。 在许多情况下,经验法则是反映潜在的数据生成过程,因此,如果专家可以确认例如发生 0.2% 的异常,则该比率应为
`1000÷2`
来找出现实的概率密度函数。 实际上,在这种情况下,更重要的是找出确定异常值可区分性的因素。 另一方面,如果要求我们仅执行新颖性检测(例如:区分有效和恶意网络请求),则必须对数据集进行验证,以便不包含异常,但同时要进行反映
负责所有可能有效样本的真实数据生成过程。
这些标准的原因很明显:让我们考虑前面讨论的示例。 如果在 1,000,000 个处理步骤后观察到的异常率等于 0.2%,则表示存在 2,000 个异常,这对于一个工作过程而言可能是一个合理的值。 如果这个数字大得多,则意味着系统中应该存在一个更严重的问题,这超出了数据科学家的职责范围。 因此,在这种情况下,我们期望一个数据集包含大量正确的样本和非常少的异常(甚至为零)。 在许多情况下,经验法则是反映潜在的数据生成过程,因此,如果专家可以确认例如发生 0.2% 的异常,则该比率应为
`1000÷2`
来找出现实的概率密度函数。 实际上,在这种情况下,更重要的是找出确定异常值可区分性的因素。 另一方面,如果要求我们仅执行新颖性检测(例如:区分有效和恶意网络请求),则必须对数据集进行验证,以便不包含异常,但同时要进行反映负责所有可能有效样本的真实数据生成过程。
实际上,如果正确样本的数量是详尽无遗的,则与高概率区域的任何较大偏差都足以触发警报。 相反,真实数据生成过程的有限区域可能会导致假阳性结果(也就是说,尚未包含在训练集中并被错误标识为异常值的有效样本)。 在最坏的情况下,如果特征发生更改(即,错误地识别为有效样本的离群值),则噪声很大的子集也可能确定假阴性。 但是,在大多数现实生活中,最重要的因素是样本的数量和收集样本的环境。 毋庸置疑,任何模型都必须使用将要测试的相同类型的元素进行训练。 例如:如果使用低精度的仪器在化工厂内部进行测量,则高精度采集的测试可能无法代表总体(当然,它们比数据集可靠得多)。 因此,在进行分析之前,我强烈建议您仔细检查数据的性质,并询问是否所有测试样本均来自同一数据生成过程。
...
...
@@ -113,7 +113,7 @@
找出概率密度函数近似值的最简单方法是基于频率计数。 如果我们有一个包含
`m`
样本的数据集
`x[i] ∈ X`
(为简单起见,我们仅考虑单变量分布,但是
过程对于多维样本完全相同),我们可以如下定义
`m`
和
`M`
:
找出概率密度函数近似值的最简单方法是基于频率计数。 如果我们有一个包含
`m`
样本的数据集
`x[i] ∈ X`
(为简单起见,我们仅考虑单变量分布,但是过程对于多维样本完全相同),我们可以如下定义
`m`
和
`M`
:
![](
img/b6ea63ae-87e5-4be6-8def-520a63fe135a.png
)
...
...
@@ -459,7 +459,7 @@ p(Age = 90) = 0.0000000 (Anomaly)
本示例基于 KDD Cup 99 数据集,该数据集收集了一系列正常和恶意的互联网活动。 特别是,我们将重点放在 HTTP 请求的子集上,该子集具有四个属性:持续时间,源字节,目标字节和行为(这是一个分类元素,但是对我们而言,可以立即访问某些特定的属性很有帮助。 攻击)。 由于原始值是非常小的零附近的数字,因此所有版本(包括 scikit-learn 在内)都使用公式
`log(x + 0.1)`
(因此,在
模拟 新样本的异常检测
)。 当然,逆变换如下:
本示例基于 KDD Cup 99 数据集,该数据集收集了一系列正常和恶意的互联网活动。 特别是,我们将重点放在 HTTP 请求的子集上,该子集具有四个属性:持续时间,源字节,目标字节和行为(这是一个分类元素,但是对我们而言,可以立即访问某些特定的属性很有帮助。 攻击)。 由于原始值是非常小的零附近的数字,因此所有版本(包括 scikit-learn 在内)都使用公式
`log(x + 0.1)`
(因此,在
用新样本模拟异常检测时必须使用它
)。 当然,逆变换如下:
![](
img/98a32c8c-7f0e-4862-bebe-331853a2ba0f.png
)
...
...
new/handson-unsup-learn-py/10.md
浏览文件 @
e5047c8d
...
...
@@ -54,7 +54,7 @@
4.
没有; k 型参量可以采用任何度量。
5.
没有; DBSCAN 对几何不敏感,并且可以管理任何种类的群集结构。
6.
我们已经表明,小批量 K 均值的性能稍差于 K 均值。 因此,答案是肯定的。 使用批处理算法可以节省内存。
7.
考虑到噪声的方差为
`σ^2 = 0.005 → σ ≈ 0.07`
,它比聚类标准偏差小约 14 倍,因此,我们不能期望
有这么多的新 在稳定的群集配置中分配(80%)
。
7.
考虑到噪声的方差为
`σ^2 = 0.005 → σ ≈ 0.07`
,它比聚类标准偏差小约 14 倍,因此,我们不能期望
这么多的新分配(80%)在稳定的群集配置中
。
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录