Translated ['src/AI/AI-Unsupervised-Learning-Algorithms.md'] to zh

This commit is contained in:
Translator 2025-06-08 00:48:20 +00:00
parent 0a7a0a8b3f
commit 238c377d2a

View File

@ -4,7 +4,7 @@
## 无监督学习 ## 无监督学习
无监督学习是一种机器学习类型,其中模型在没有标记响应的数据上进行训练。目标是发现数据中的模式、结构或关系。与监督学习不同,监督学习模型从标记示例中学习,无监督学习算法则处理未标记的数据。 无监督学习是一种机器学习类型,其中模型在没有标记响应的数据上进行训练。目标是发现数据中的模式、结构或关系。与监督学习不同,监督学习模型从标记示例中学习,无监督学习算法则处理未标记的数据。
无监督学习通常用于聚类、降维和异常检测等任务。它可以帮助发现数据中的隐藏模式,将相似的项目分组,或在保留数据基本特征的同时减少数据的复杂性。 无监督学习通常用于聚类、降维和异常检测等任务。它可以帮助发现数据中的隐藏模式,将相似的项目分组,或在保留数据基本特征的同时减少数据的复杂性。
### K均值聚类 ### K均值聚类
@ -12,7 +12,7 @@
K均值是一种基于质心的聚类算法通过将每个点分配给最近的聚类均值将数据划分为K个聚类。该算法的工作流程如下 K均值是一种基于质心的聚类算法通过将每个点分配给最近的聚类均值将数据划分为K个聚类。该算法的工作流程如下
1. **初始化**选择K个初始聚类中心质心通常是随机选择或通过更智能的方法如k-means++。 1. **初始化**选择K个初始聚类中心质心通常是随机选择或通过更智能的方法如k-means++。
2. **分配**:根据距离度量(例如,欧几里得距离)将每个数据点分配给最近的质心。 2. **分配**:根据距离度量(例如,欧几里得距离)将每个数据点分配给最近的质心。
3. **更新**:通过计算分配给每个聚类的所有数据点的均值来重新计算质心。 3. **更新**:通过取分配给每个聚类的所有数据点的均值重新计算质心。
4. **重复**重复步骤2-3直到聚类分配稳定质心不再显著移动 4. **重复**重复步骤2-3直到聚类分配稳定质心不再显著移动
> [!TIP] > [!TIP]
@ -21,17 +21,17 @@ K均值是一种基于质心的聚类算法通过将每个点分配给最近
#### K的选择 #### K的选择
聚类的数量K是一个超参数需要在运行算法之前定义。像肘部法则或轮廓系数等技术可以通过评估聚类性能来帮助确定K的适当值 聚类的数量K是一个超参数需要在运行算法之前定义。像肘部法则或轮廓系数等技术可以通过评估聚类性能来帮助确定K的适当值
- **肘部法则**将每个点到其分配的聚类质心的平方距离之和绘制为K的函数。寻找“肘部”点,在该点处,减少的速率急剧变化,指示适合的聚类数量。 - **肘部法则**绘制每个点到其分配的聚类质心的平方距离之和与K的关系图。寻找“肘部”点,在该点处,减少的速率急剧变化,指示适合的聚类数量。
- **轮廓系数**计算不同K值的轮廓系数。较高的轮廓系数表示聚类定义更好。 - **轮廓系数**计算不同K值的轮廓系数。较高的轮廓系数表示聚类定义更好。
#### 假设和限制 #### 假设和限制
K均值假设**聚类是球形且大小相等**,这可能不适用于所有数据集。它对质心的初始位置敏感,并可能收敛到局部最小值。此外K均值不适合具有不同密度或非球形形状的数据集以及具有不同尺度的特征。可能需要进行预处理步骤,如归一化或标准化,以确保所有特征对距离计算的贡献相等。 K均值假设**聚类是球形且大小相等**,这可能不适用于所有数据集。它对质心的初始位置敏感并可能收敛到局部最小值。此外K均值不适合具有不同密度或非球形形状的数据集以及具有不同尺度的特征。可能需要进行归一化或标准化等预处理步骤,以确保所有特征对距离计算的贡献相等。
<details> <details>
<summary>示例 -- 聚类网络事件 <summary>示例 -- 聚类网络事件
</summary> </summary>
下面我们模拟网络流量数据并使用K均值进行聚类。假设我们有连接持续时间和字节计数等特征的事件。我们创建3个“正常”流量的聚类和1个小聚类代表攻击模式。然后我们运行K均值看看它是否将它们分开。 下面我们模拟网络流量数据并使用K均值进行聚类。假设我们有连接持续时间和字节计数等特征的事件。我们创建3个“正常”流量的聚类和1个小聚类代表攻击模式。然后我们运行K均值看看它是否将它们分开。
```python ```python
import numpy as np import numpy as np
from sklearn.cluster import KMeans from sklearn.cluster import KMeans
@ -62,7 +62,7 @@ print(f" Cluster {idx}: {center}")
### 层次聚类 ### 层次聚类
层次聚类使用自下而上(聚合)或自上而下(分裂)方法构建簇的层次结构: 层次聚类使用自下而上(聚合)方法或自上而下(分裂)方法构建簇的层次结构:
1. **聚合(自下而上)**:从每个数据点作为单独的簇开始,迭代地合并最近的簇,直到只剩下一个簇或满足停止标准。 1. **聚合(自下而上)**:从每个数据点作为单独的簇开始,迭代地合并最近的簇,直到只剩下一个簇或满足停止标准。
2. **分裂(自上而下)**:从所有数据点在一个簇中开始,迭代地拆分簇,直到每个数据点都是自己的簇或满足停止标准。 2. **分裂(自上而下)**:从所有数据点在一个簇中开始,迭代地拆分簇,直到每个数据点都是自己的簇或满足停止标准。
@ -72,17 +72,17 @@ print(f" Cluster {idx}: {center}")
层次聚类生成一个树状图,显示不同粒度级别的簇之间的关系。可以在所需级别切割树状图以获得特定数量的簇。 层次聚类生成一个树状图,显示不同粒度级别的簇之间的关系。可以在所需级别切割树状图以获得特定数量的簇。
> [!TIP] > [!TIP]
> *网络安全中的用例:* 层次聚类可以将事件或实体组织成树状结构,以发现关系。例如,在恶意软件分析中,聚合聚类可以根据行为相似性对样本进行分组,揭示恶意软件家族和变种的层次结构。在网络安全中,可以对 IP 流量进行聚类,并使用树状图查看流量的子分组(例如,按协议,然后按行为)。因为不需要提前选择 K所以在探索未知攻击类别数量的新数据时非常有用。 > *网络安全中的用例:* 层次聚类可以将事件或实体组织成树,以发现关系。例如,在恶意软件分析中,聚合聚类可以根据行为相似性对样本进行分组,揭示恶意软件家族和变种的层次结构。在网络安全中,可以对 IP 流量进行聚类,并使用树状图查看流量的子分组(例如,按协议,然后按行为)。因为不需要提前选择 K所以在探索未知攻击类别数量的新数据时非常有用。
#### 假设和限制 #### 假设和限制
层次聚类不假设特定的簇形状,可以捕捉嵌套簇。它对于发现分类法或群体之间的关系(例如,根据家族子组对恶意软件进行分组)非常有用。它是确定性的(没有随机初始化问题)。一个关键优势是树状图,它提供了对数据聚类结构在所有尺度上的洞察——安全分析师可以决定适当的截止点以识别有意义的簇。然而,它在计算上是昂贵的(通常对于简单实现是 $O(n^2)$ 时间或更差),并且对于非常大的数据集不可行。它也是一种贪婪过程——一旦合并或拆分完成,就无法撤销,这可能导致如果早期发生错误则产生次优簇。离群值也可能影响某些链接策略(单链接可能导致“链式”效应,簇通过离群值链接)。 层次聚类不假设特定的簇形状,可以捕捉嵌套簇。它对于发现分类法或群体之间的关系(例如,根据家族子组对恶意软件进行分组)非常有用。它是确定性的(没有随机初始化问题)。一个关键优势是树状图,它提供了对数据聚类结构在所有尺度上的洞察——安全分析师可以决定适当的截止点以识别有意义的簇。然而,它在计算上是昂贵的(通常对于简单实现是 $O(n^2)$ 时间或更差),并且对于非常大的数据集不可行。它也是一种贪婪过程——一旦合并或拆分完成,就无法撤销,这可能导致早期发生错误时产生次优簇。离群值也可能影响某些链接策略(单链接可能导致“链式”效应,其中簇通过离群值链接)。
<details> <details>
<summary>示例 -- 事件的聚合聚类 <summary>示例 -- 事件的聚合聚类
</summary> </summary>
我们将重用 K-Means 示例中的合成数据3 个正常簇 + 1 个攻击簇)并应用聚合聚类。然后我们将说明如何获得树状图和簇标签。 我们将重用 K-Means 示例中的合成数据3 个正常簇 + 1 个攻击簇)并应用聚合聚类。然后我们将说明如何获得树状图和簇标签。
```python ```python
from sklearn.cluster import AgglomerativeClustering from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import linkage, dendrogram from scipy.cluster.hierarchy import linkage, dendrogram
@ -115,10 +115,10 @@ DBSCAN 识别核心点、边界点和噪声点:
- **边界点**:在 ε 距离内靠近核心点但邻居少于 MinPts 的点。 - **边界点**:在 ε 距离内靠近核心点但邻居少于 MinPts 的点。
- **噪声点**:既不是核心点也不是边界点的点。 - **噪声点**:既不是核心点也不是边界点的点。
聚类通过选择一个未访问的核心点开始,将其标记为新聚类,然后递归地添加所有从该点密度可达的点核心点及其邻居等。边界点被添加到附近核心的聚类中。在扩展所有可达点后DBSCAN 移动到另一个未访问的核心以开始新的聚类。未被任何核心到达的点仍然标记为噪声。 聚类通过选择一个未访问的核心点开始,将其标记为新聚类,然后递归地添加所有从密度可达的点核心点及其邻居等。边界点被添加到附近核心的聚类中。在扩展所有可达点后DBSCAN 移动到另一个未访问的核心以开始新的聚类。未被任何核心到达的点仍然标记为噪声。
> [!TIP] > [!TIP]
> *在网络安全中的用例:* DBSCAN 对于网络流量中的异常检测非常有用。例如正常用户活动可能在特征空间中形成一个或多个密集聚类而新颖的攻击行为则表现为分散的点DBSCAN 将其标记为噪声(离群点)。它已被用于聚类网络流量记录,可以检测到端口扫描或拒绝服务流量作为稀疏的点区域。另一个应用是对恶意软件变种进行分组:如果大多数样本按家族聚类,但少数样本不适合任何地方,这些少数样本可能是零日恶意软件。标记噪声的能力意味着安全团队可以专注于调查这些离群点。 > *在网络安全中的用例:* DBSCAN 对于网络流量中的异常检测非常有用。例如正常用户活动可能在特征空间中形成一个或多个密集聚类而新颖的攻击行为则表现为分散的点DBSCAN 将其标记为噪声(离群点)。它已被用于聚类网络流量记录,可以检测到端口扫描或拒绝服务流量作为稀疏的点区域。另一个应用是对恶意软件变种进行分组:如果大多数样本按家族聚类,但少数样本不适合任何地方,这些少数样本可能是零日恶意软件。标记噪声的能力意味着安全团队可以专注于调查这些离群点。
#### 假设和局限性 #### 假设和局限性
@ -150,7 +150,7 @@ num_noise = np.sum(labels == -1)
print(f"DBSCAN found {num_clusters} clusters and {num_noise} noise points") print(f"DBSCAN found {num_clusters} clusters and {num_noise} noise points")
print("Cluster labels for first 10 points:", labels[:10]) print("Cluster labels for first 10 points:", labels[:10])
``` ```
在这个片段中,我们调整了 `eps``min_samples` 以适应我们的数据规模(特征单位为 15.0,并且需要 5 个点来形成一个聚类。DBSCAN 应该找到 2 个聚类(正常流量聚类)并将 5 个注入的异常值标记为噪声。我们输出聚类数量与噪声点的对比以验证这一点。在实际设置中,可以对 ε 进行迭代(使用 k-距离图启发式选择 ε)和 MinPts通常设置为数据维度 + 1 作为经验法则)以找到稳定的聚类结果。显式标记噪声的能力有助于分离潜在攻击数据以进行进一步分析。 在这个片段中,我们调整了 `eps``min_samples` 以适应我们的数据规模(特征单位为 15.0,并且需要 5 个点来形成一个。DBSCAN 应该找到 2 个簇(正常流量簇)并将 5 个注入的异常值标记为噪声。我们输出簇的数量与噪声点的数量以验证这一点。在实际设置中,可以对 ε 进行迭代(使用 k-距离图启发式选择 ε)和 MinPts通常设置为数据维度 + 1 作为经验法则)以找到稳定的聚类结果。明确标记噪声的能力有助于分离潜在的攻击数据以进行进一步分析。
</details> </details>
@ -165,12 +165,12 @@ PCA 通过识别数据的主成分来工作,这些主成分是最大方差的
2. **协方差矩阵**:计算标准化数据的协方差矩阵,以了解特征之间的关系。 2. **协方差矩阵**:计算标准化数据的协方差矩阵,以了解特征之间的关系。
3. **特征值分解**:对协方差矩阵进行特征值分解,以获得特征值和特征向量。 3. **特征值分解**:对协方差矩阵进行特征值分解,以获得特征值和特征向量。
4. **选择主成分**:按降序排列特征值,并选择与最大特征值对应的前 K 个特征向量。这些特征向量形成新的特征空间。 4. **选择主成分**:按降序排列特征值,并选择与最大特征值对应的前 K 个特征向量。这些特征向量形成新的特征空间。
5. **转换数据**:使用选的主成分将原始数据投影到新的特征空间。 5. **转换数据**:使用选的主成分将原始数据投影到新的特征空间。
PCA 广泛用于数据可视化、噪声减少,以及作为其他机器学习算法的预处理步骤。它有助于在保留数据基本结构的同时减少数据的维度。 PCA 广泛用于数据可视化、噪声减少,以及作为其他机器学习算法的预处理步骤。它有助于在保留数据基本结构的同时减少数据的维度。
#### 特征值和特征向量 #### 特征值和特征向量
特征值是一个标量,指示其对应特征向量捕获的方差量。特征向量表示特征空间中的一个方向,数据在该方向上变化最大。 特征值是一个标量,指示其对应特征向量捕获的方差量。特征向量表示特征空间中数据变化最大的方向
假设 A 是一个方阵v 是一个非零向量,使得: `A * v = λ * v` 假设 A 是一个方阵v 是一个非零向量,使得: `A * v = λ * v`
其中: 其中:
@ -188,7 +188,7 @@ PCA 广泛用于数据可视化、噪声减少,以及作为其他机器学习
- 请注意,两个变量(在这种情况下是像素)之间的协方差指示它们共同变化的程度,因此这里的想法是找出哪些像素倾向于以线性关系一起增加或减少。 - 请注意,两个变量(在这种情况下是像素)之间的协方差指示它们共同变化的程度,因此这里的想法是找出哪些像素倾向于以线性关系一起增加或减少。
- 例如,如果像素 1 和像素 2 倾向于一起增加,它们之间的协方差将是正的。 - 例如,如果像素 1 和像素 2 倾向于一起增加,它们之间的协方差将是正的。
- 协方差矩阵将是一个 10,000x10,000 的矩阵,其中每个条目表示两个像素之间的协方差。 - 协方差矩阵将是一个 10,000x10,000 的矩阵,其中每个条目表示两个像素之间的协方差。
3. **求解特征值方程**:要解决的特征值方程是 `C * v = λ * v`,其中 C 是协方差矩阵v 是特征向量,λ 是特征值。可以使用以下方法解 3. **求解特征值方程**:要解决的特征值方程是 `C * v = λ * v`,其中 C 是协方差矩阵v 是特征向量,λ 是特征值。可以使用以下方法解:
- **特征值分解**:对协方差矩阵进行特征值分解,以获得特征值和特征向量。 - **特征值分解**:对协方差矩阵进行特征值分解,以获得特征值和特征向量。
- **奇异值分解 (SVD)**:或者,你可以使用 SVD 将数据矩阵分解为奇异值和向量,这也可以得到主成分。 - **奇异值分解 (SVD)**:或者,你可以使用 SVD 将数据矩阵分解为奇异值和向量,这也可以得到主成分。
4. **选择主成分**:按降序排列特征值,并选择与最大特征值对应的前 K 个特征向量。这些特征向量表示数据中最大方差的方向。 4. **选择主成分**:按降序排列特征值,并选择与最大特征值对应的前 K 个特征向量。这些特征向量表示数据中最大方差的方向。
@ -196,9 +196,9 @@ PCA 广泛用于数据可视化、噪声减少,以及作为其他机器学习
> [!TIP] > [!TIP]
> *网络安全中的用例:* PCA 在安全中的一个常见用途是异常检测的特征减少。例如,一个具有 40 多个网络指标(如 NSL-KDD 特征)的入侵检测系统可以使用 PCA 将其减少到少数几个组件以便于可视化或输入聚类算法。分析师可能会在前两个主成分的空间中绘制网络流量以查看攻击是否与正常流量分开。PCA 还可以帮助消除冗余特征(如发送的字节与接收的字节如果它们相关)以使检测算法更强大和更快。 > *网络安全中的用例:* PCA 在安全中的一个常见用途是异常检测的特征减少。例如,一个具有 40 多个网络指标(如 NSL-KDD 特征)的入侵检测系统可以使用 PCA 将其减少到少数几个组件以便于可视化或输入聚类算法。分析师可能会在前两个主成分的空间中绘制网络流量以查看攻击是否与正常流量分开。PCA 还可以帮助消除冗余特征(如发送的字节与接收的字节如果它们相关)以使检测算法更强大和更快。
#### 假设和局限性 #### 假设和限制
PCA 假设 **方差的主轴是有意义的**——这是一种线性方法因此它捕捉数据中的线性相关性。它是无监督的因为它仅使用特征协方差。PCA 的优点包括噪声减少(小方差组件通常对应于噪声)和特征的去相关性。对于中等高维度,它在计算上是高效的,并且通常是其他算法的有用预处理步骤(以减轻维度诅咒)。一个局限性是 PCA 限于线性关系——它不会捕捉复杂的非线性结构(而自编码器或 t-SNE 可能会。此外PCA 组件在原始特征方面可能难以解释(它们是原始特征的组合)。在网络安全中,必须谨慎:仅在低方差特征中造成微小变化的攻击可能不会出现在前几个主成分中(因为 PCA 优先考虑方差,而不一定是“有趣性”)。 PCA 假设 **方差的主轴是有意义的**——这是一种线性方法因此它捕捉数据中的线性相关性。它是无监督的因为它仅使用特征协方差。PCA 的优点包括噪声减少(小方差组件通常对应于噪声)和特征的去相关性。对于中等高维度,它在计算上是高效的,并且通常是其他算法的有用预处理步骤(以减轻维度诅咒)。一个限制是 PCA 仅限于线性关系——它不会捕捉复杂的非线性结构(而自编码器或 t-SNE 可能会。此外PCA 组件在原始特征方面可能难以解释(它们是原始特征的组合)。在网络安全中,必须谨慎:仅在低方差特征中造成微小变化的攻击可能不会出现在前几个主成分中(因为 PCA 优先考虑方差,而不一定是“有趣性”)。
<details> <details>
<summary>示例 -- 降低网络数据的维度 <summary>示例 -- 降低网络数据的维度
@ -224,17 +224,17 @@ print("Original shape:", data_4d.shape, "Reduced shape:", data_2d.shape)
# We can examine a few transformed points # We can examine a few transformed points
print("First 5 data points in PCA space:\n", data_2d[:5]) print("First 5 data points in PCA space:\n", data_2d[:5])
``` ```
在这里我们将早期的正常流量聚类扩展每个数据点增加了两个额外特征数据包和错误这些特征与字节和持续时间相关。然后使用PCA将4个特征压缩为2个主成分。我们打印解释的方差比率这可能显示例如>95%的方差由2个成分捕获意味着信息损失很小。输出还显示数据形状从(1500, 4)减少到(1500, 2)。PCA空间中的前几个点作为示例给出。在实践中可以绘制data_2d以直观检查聚类是否可区分。如果存在异常可能会看到它作为一个位于PCA空间主聚类之外的点。因此PCA有助于将复杂数据提炼可供人类解释或作为其他算法输入的可管理形式。 在这里我们将早期的正常流量聚类扩展每个数据点增加了两个额外特征数据包和错误这些特征与字节和持续时间相关。然后使用PCA将4个特征压缩为2个主成分。我们打印解释的方差比率这可能显示例如>95%的方差由2个成分捕获意味着信息损失很小。输出还显示数据形状从(1500, 4)减少到(1500, 2)。PCA空间中的前几个点作为示例给出。在实践中可以绘制data_2d以直观检查聚类是否可区分。如果存在异常可能会看到它作为一个位于PCA空间主聚类之外的点。因此PCA有助于将复杂数据提炼可供人类解释或作为其他算法输入的可管理形式。
### 高斯混合模型 (GMM) ### 高斯混合模型 (GMM)
高斯混合模型假设数据是由**几个具有未知参数的高斯(正态)分布的混合生成的**。本质上它是一种概率聚类模型它试图将每个点软性分配给K个高斯成分之一。每个高斯成分k都有一个均值向量μ_k、协方差矩阵Σ_k和一个混合权重π_k表示该聚类的普遍性。与K-Means进行“硬”分配不同GMM为每个点提供属于每个聚类的概率。 高斯混合模型假设数据是由**几个具有未知参数的高斯(正态)分布的混合生成的**。本质上,它是一种概率聚类模型:它试图将每个点软性分配给K个高斯成分之一。每个高斯成分k都有一个均值向量μ_k、协方差矩阵Σ_k和一个混合权重π_k表示该聚类的普遍性。与K-Means进行“硬”分配不同GMM为每个点提供属于每个聚类的概率。
GMM拟合通常通过期望最大化EM算法完成 GMM拟合通常通过期望最大化EM算法完成
- **初始化**从均值、协方差和混合系数的初始猜测开始或使用K-Means结果作为起点 - **初始化**从均值、协方差和混合系数的初始猜测开始或使用K-Means结果作为起点
- **E步期望**:给定当前参数,计算每个聚类对每个点的责任:本质上是`r_nk = P(z_k | x_n)`其中z_k是指示点x_n聚类归属的潜变量。这是使用贝叶斯定理完成的,我们根据当前参数计算每个点属于每个聚类的后验概率。责任的计算如下: - **E步期望**:给定当前参数,计算每个聚类对每个点的责任:本质上是`r_nk = P(z_k | x_n)`其中z_k是指示点x_n聚类归属的潜变量。这是使用贝叶斯定理完成的我们根据当前参数计算每个点属于每个聚类的后验概率。责任的计算如下
```math ```math
r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \mathcal{N}(x_n | \mu_j, \Sigma_j)} r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \mathcal{N}(x_n | \mu_j, \Sigma_j)}
``` ```
@ -252,13 +252,13 @@ r_{nk} = \frac{\pi_k \mathcal{N}(x_n | \mu_k, \Sigma_k)}{\sum_{j=1}^{K} \pi_j \m
结果是一组高斯分布共同建模整体数据分布。我们可以使用拟合的GMM通过将每个点分配给具有最高概率的高斯来进行聚类或者保留概率以表示不确定性。还可以评估新点的似然性以查看它们是否适合模型对异常检测有用 结果是一组高斯分布共同建模整体数据分布。我们可以使用拟合的GMM通过将每个点分配给具有最高概率的高斯来进行聚类或者保留概率以表示不确定性。还可以评估新点的似然性以查看它们是否适合模型对异常检测有用
> [!TIP] > [!TIP]
> *网络安全中的用例:* GMM可以通过建模正常数据的分布来用于异常检测任何在学习的混合下概率非常低的点都被标记为异常。例如您可以在合法网络流量特征上训练GMM一个与任何学习的聚类不相似的攻击连接将具有低似然性。GMM还用于聚类活动其中聚类可能具有不同的形状——例如通过行为特征对用户进行分组其中每个特征的特征可能类似于高斯但具有自己的方差结构。另一个场景网络钓鱼检测中,合法电子邮件特征可能形成一个高斯聚类,已知的网络钓鱼形成另一个,而新的网络钓鱼活动可能显示为单独的高斯或相对于现有混合的低似然点。 > *网络安全中的用例:* GMM可以通过建模正常数据的分布来用于异常检测在学习的混合下,任何概率非常低的点都被标记为异常。例如您可以在合法网络流量特征上训练GMM一个与任何学习的聚类不相似的攻击连接将具有低似然性。GMM还用于聚类活动其中聚类可能具有不同的形状——例如通过行为特征对用户进行分组其中每个特征的特征可能类似于高斯但具有自己的方差结构。另一个场景在钓鱼检测中合法电子邮件特征可能形成一个高斯聚类已知的钓鱼形成另一个而新的钓鱼活动可能显示为单独的高斯或相对于现有混合的低似然点。
#### 假设和限制 #### 假设和限制
GMM是K-Means的推广结合了协方差因此聚类可以是椭球形的不仅仅是球形。如果协方差是完整的它可以处理不同大小和形状的聚类。当聚类边界模糊时软聚类是一个优势——例如在网络安全中一个事件可能具有多种攻击类型的特征GMM可以通过概率反映这种不确定性。GMM还提供了数据的概率密度估计有助于检测离群值在所有混合成分下似然性低的点 GMM是K-Means的推广结合了协方差因此聚类可以是椭球形的不仅仅是球形。如果协方差是完整的它可以处理不同大小和形状的聚类。当聚类边界模糊时软聚类是一个优势——例如在网络安全中一个事件可能具有多种攻击类型的特征GMM可以通过概率反映这种不确定性。GMM还提供了数据的概率密度估计有助于检测离群值在所有混合成分下似然性低的点
缺点是GMM需要指定成分数量K尽管可以使用BIC/AIC等标准来选择。EM有时可能收敛缓慢或到局部最优因此初始化很重要通常多次运行EM。如果数据实际上不遵循高斯混合模型可能不适合。还有一个风险是一个高斯收缩到仅覆盖一个离群值尽管正则化或最小协方差界限可以缓解这一点 缺点是GMM需要指定成分数量K尽管可以使用BIC/AIC等标准来选择。EM有时可能收敛缓慢或到局部最优因此初始化很重要通常多次运行EM。如果数据实际上不遵循高斯混合,模型可能不适合。还有一个风险是一个高斯收缩到仅覆盖一个离群值(尽管正则化或最小协方差界限可以缓解这一点)。
<details> <details>
<summary>示例 -- 软聚类与异常分数 <summary>示例 -- 软聚类与异常分数
@ -281,22 +281,22 @@ log_likelihood = gmm.score_samples(sample_attack)
print("Cluster membership probabilities for sample attack:", probs) print("Cluster membership probabilities for sample attack:", probs)
print("Log-likelihood of sample attack under GMM:", log_likelihood) print("Log-likelihood of sample attack under GMM:", log_likelihood)
``` ```
在这段代码中我们使用3个高斯分布训练一个GMM针对正常流量假设我们知道3个合法流量的特征。打印的均值和协方差描述了这些聚类例如一个均值可能在[50,500]附近,对应于一个聚类的中心,等等)。然后我们测试一个可疑连接[duration=200, bytes=800]。predict_proba给出了该点属于这3个聚类的概率——我们预计这些概率会非常低或高度偏斜因为[200,800]远离正常聚类。打印整体的score_samples对数似然一个非常低的值表明该点与模型不匹配将其标记为异常。在实践中可以在对数似然或最大概率上设置阈值以决定一个点是否足够不可能被视为恶意。因此GMM提供了一种原则性的方法来进行异常检测并且还产生了承认不确定性的软聚类。 在这段代码中我们使用3个高斯分布训练一个GMM针对正常流量假设我们知道3个合法流量的特征。打印的均值和协方差描述了这些聚类(例如,一个均值可能在[50,500]附近,对应于一个聚类的中心,等等)。然后我们测试一个可疑连接[duration=200, bytes=800]。predict_proba给出了该点属于这3个聚类的概率——我们预计这些概率会非常低或高度偏斜因为[200,800]远离正常聚类。打印整体的score_samples对数似然一个非常低的值表明该点与模型不匹配将其标记为异常。在实践中可以在对数似然或最大概率上设置阈值以决定一个点是否足够不可能被视为恶意。因此GMM提供了一种原则性的方法来进行异常检测并且还产生了承认不确定性的软聚类。
### 隔离森林 ### 隔离森林
**隔离森林**是一种基于随机隔离点思想的集成异常检测算法。其原理是异常点数量少且不同,因此比正常点更容易被隔离。隔离森林构建许多二叉隔离树(随机决策树),随机划分数据。在树的每个节点,选择一个随机特征,并在该特征的最小值和最大值之间选择一个随机分割值。这个分割将数据分为两个分支。树的生长直到每个点在自己的叶子中被隔离,或者达到最大树高。 **隔离森林**是一种基于随机隔离点思想的集成异常检测算法。其原理是异常点数量少且不同,因此比正常点更容易被隔离。隔离森林构建许多二叉隔离树(随机决策树),随机划分数据。在树的每个节点,选择一个随机特征,并在该特征的最小值和最大值之间选择一个随机分割值。这个分割将数据分为两个分支。树的生长直到每个点被隔离在自己的叶子中,或者达到最大树高。
通过观察每个点在这些随机树中的路径长度来执行异常检测——隔离该点所需的分割次数。直观上,异常(离群点)往往更快被隔离,因为随机分割更可能将离群点(位于稀疏区域)与密集聚类中的正常点分开。隔离森林所有树的平均路径长度计算异常分数:平均路径越短→越异常。分数通常归一化到[0,1]其中1表示非常可能是异常。 通过观察这些随机树中每个点的路径长度来执行异常检测——隔离该点所需的分割次数。直观上,异常(离群点)往往更快被隔离,因为随机分割更可能将离群点(位于稀疏区域)与密集聚类中的正常点分开。隔离森林根据所有树的平均路径长度计算异常分数:平均路径越短→越异常。分数通常归一化到[0,1]其中1表示非常可能是异常。
> [!TIP] > [!TIP]
> *网络安全中的用例:* 隔离森林已成功用于入侵检测和欺诈检测。例如在主要包含正常行为的网络流量日志上训练一个隔离森林该森林将为奇怪的流量如使用不常见端口的IP或不寻常的数据包大小模式生成短路径标记其进行检查。因为它不需要标记攻击所以适合检测未知攻击类型。它还可以部署在用户登录数据上以检测账户接管异常的登录时间或地点会迅速被隔离。在一个用例中隔离森林可能通过监控系统指标并在一组指标CPU、网络、文件更改的组合与历史模式看起来非常不同短隔离路径时生成警报从而保护企业。 > *网络安全中的用例:* 隔离森林已成功用于入侵检测和欺诈检测。例如在主要包含正常行为的网络流量日志上训练一个隔离森林该森林将为奇怪的流量如使用不常见端口的IP或不寻常的数据包大小模式生成短路径标记其进行检查。因为它不需要标记攻击所以适合检测未知攻击类型。它还可以部署在用户登录数据上以检测账户接管异常的登录时间或地点会迅速被隔离。在一个用例中隔离森林可能通过监控系统指标并在一组指标CPU、网络、文件更改的组合与历史模式看起来非常不同短隔离路径时生成警报从而保护企业。
#### 假设和限制 #### 假设和局限性
**优点**:隔离森林不需要分布假设;它直接针对隔离。它在高维数据和大数据集上效率高(构建森林的线性复杂度为$O(n\log n)$),因为每棵树仅使用特征的子集和分割来隔离点。它通常能很好地处理数值特征,并且比基于距离的方法更快,后者可能是$O(n^2)$。它还自动给出异常分数,因此您可以设置警报的阈值(或使用污染参数根据预期的异常比例自动决定截止点)。 **优点**:隔离森林不需要分布假设;它直接针对隔离。它在高维数据和大数据集上效率高(构建森林的线性复杂度为$O(n\log n)$),因为每棵树仅使用特征的子集和分割来隔离点。它通常能很好地处理数值特征,并且比基于距离的方法更快,后者可能是$O(n^2)$。它还自动给出异常分数,因此您可以设置警报的阈值(或使用污染参数根据预期的异常比例自动决定截止点)。
**限制**:由于其随机特性,结果在不同运行之间可能略有不同(尽管树的数量足够多时,这种差异很小)。如果数据有很多无关特征,或者异常在任何特征上没有明显区分,隔离可能效果不佳(随机分割可能偶然隔离正常点——然而,平均多树可以减轻这一点)。此外,隔离森林通常假设异常是少数(这在网络安全场景中通常是正确的)。 **局限性**:由于其随机特性,结果在不同运行之间可能略有不同(尽管树的数量足够多时,这种差异很小)。如果数据有很多无关特征,或者异常在任何特征上没有明显区分,隔离可能效果不佳(随机分割可能偶然隔离正常点——然而,平均多树可以减轻这一点)。此外,隔离森林通常假设异常是少数(这在网络安全场景中通常是正确的)。
<details> <details>
<summary>示例 -- 检测网络日志中的离群点 <summary>示例 -- 检测网络日志中的离群点
@ -320,7 +320,7 @@ print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5]
``` ```
在这段代码中我们用100棵树实例化了`IsolationForest`并设置`contamination=0.15`这意味着我们预计大约有15%的异常;模型将设置其分数阈值,使得~15%的点被标记)。我们在包含正常和攻击点混合的`X_test_if`上进行拟合(注意:通常你会在训练数据上进行拟合,然后在新数据上使用预测,但这里为了说明我们在同一组上进行拟合和预测,以直接观察结果)。 在这段代码中我们用100棵树实例化了`IsolationForest`并设置`contamination=0.15`这意味着我们预计大约有15%的异常;模型将设置其分数阈值,使得~15%的点被标记)。我们在包含正常和攻击点混合的`X_test_if`上进行拟合(注意:通常你会在训练数据上进行拟合,然后在新数据上使用预测,但这里为了说明我们在同一组上进行拟合和预测,以直接观察结果)。
输出显示了前20个点的预测标签其中-1表示异常。我们还打印了总共检测到多少个异常以及一些示例异常分数。我们预计大约120个点中有18个会被标记为-1因为污染率为15%。如果我们的20个攻击样本确实是最偏离的大多数应该出现在这些-1预测中。异常分数Isolation Forest的决策函数对于正常点较高对于异常点较低更负——我们打印了一些值以查看分离。在实践中人们可能会按分数对数据进行排序以查看顶级异常并进行调查。因此Isolation Forest提供了一种有效的方法来筛选大量未标记的安全数据并挑选出最不规则的实例以供人工分析或进一步的自动审查。 输出显示了前20个点的预测标签其中-1表示异常。我们还打印了总共检测到的异常数量和一些示例异常分数。我们预计大约120个点中有18个会被标记为-1因为污染率为15%。如果我们的20个攻击样本确实是最偏离的大多数应该出现在这些-1预测中。异常分数Isolation Forest的决策函数对于正常点较高对于异常点较低更负——我们打印了一些值以查看分离情况。在实践中人们可能会按分数对数据进行排序以查看顶级异常并进行调查。因此Isolation Forest提供了一种有效的方法来筛选大量未标记的安全数据并挑选出最不规则的实例以供人工分析或进一步的自动审查。
### t-SNE (t-分布随机邻域嵌入) ### t-SNE (t-分布随机邻域嵌入)
@ -330,7 +330,7 @@ print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5]
1. **计算高维空间中的成对亲和度:** 对于每对点t-SNE计算选择该对作为邻居的概率这是通过在每个点上中心化高斯分布并测量距离来完成的——困惑度参数影响考虑的有效邻居数量 1. **计算高维空间中的成对亲和度:** 对于每对点t-SNE计算选择该对作为邻居的概率这是通过在每个点上中心化高斯分布并测量距离来完成的——困惑度参数影响考虑的有效邻居数量
2. **计算低维例如2D空间中的成对亲和度** 最初点在2D中随机放置。t-SNE为该图中的距离定义了类似的概率使用学生t分布核其尾部比高斯分布更重以允许远离的点有更多自由 2. **计算低维例如2D空间中的成对亲和度** 最初点在2D中随机放置。t-SNE为该图中的距离定义了类似的概率使用学生t分布核其尾部比高斯分布更重以允许远离的点有更多自由
3. **梯度下降:** t-SNE然后迭代地在2D中移动点以最小化高维亲和度分布和低维分布之间的KullbackLeiblerKL散度。这使得2D排列尽可能反映高维结构——在原始空间中近的点将相互吸引,而远离的点将相互排斥,直到找到平衡。 3. **梯度下降:** t-SNE然后迭代地在2D中移动点以最小化高维亲和度分布和低维分布之间的KullbackLeiblerKL散度。这使得2D排列尽可能反映高维结构——在原始空间中近的点将相互吸引,而远离的点将相互排斥,直到找到平衡。
结果通常是一个视觉上有意义的散点图,其中数据中的聚类变得明显。 结果通常是一个视觉上有意义的散点图,其中数据中的聚类变得明显。
@ -341,7 +341,7 @@ print("Example anomaly scores (lower means more anomalous):", anomaly_scores[:5]
t-SNE非常适合视觉发现模式。它可以揭示其他线性方法如PCA可能无法发现的聚类、子聚类和异常值。它已在网络安全研究中用于可视化复杂数据如恶意软件行为特征或网络流量模式。由于它保留了局部结构因此在显示自然分组方面表现良好。 t-SNE非常适合视觉发现模式。它可以揭示其他线性方法如PCA可能无法发现的聚类、子聚类和异常值。它已在网络安全研究中用于可视化复杂数据如恶意软件行为特征或网络流量模式。由于它保留了局部结构因此在显示自然分组方面表现良好。
然而t-SNE的计算负担较重大约为$O(n^2)$因此对于非常大的数据集可能需要抽样。它还有超参数困惑度、学习率、迭代次数这些参数可能会影响输出——例如不同的困惑度值可能会在不同的尺度上揭示聚类。t-SNE图有时可能被误解——图中的距离在全局上并不直接有意义它关注局部邻域有时聚类可能看起来人为地分开。此外t-SNE主要用于可视化不提供直接的方法来投影新数据点而不重新计算并且不适合用作预测建模的预处理UMAP是一个解决这些问题并具有更快速度的替代方案 然而t-SNE的计算负担较重大约为$O(n^2)$因此对于非常大的数据集可能需要抽样。它还有超参数困惑度、学习率、迭代次数这些参数可能会影响输出——例如不同的困惑度值可能会在不同的尺度上揭示聚类。t-SNE图有时可能被误解——图中的距离在全局上并不直接有意义它关注局部邻域有时聚类可能看起来人为地分开。此外t-SNE主要用于可视化并不提供直接的方法来投影新数据点而无需重新计算并且不适合用作预测建模的预处理UMAP是一个解决这些问题并具有更快速度的替代方案
<details> <details>
<summary>示例 -- 可视化网络连接 <summary>示例 -- 可视化网络连接
@ -430,7 +430,7 @@ plt.legend()
plt.tight_layout() plt.tight_layout()
plt.show() plt.show()
``` ```
在这里我们将之前的4D正常数据集与少量极端离群值结合在一起离群值有一个特征“持续时间”设置得非常高等以模拟一种奇怪的模式。我们以典型的困惑度30运行t-SNE。输出的data_2d形状为(1505, 2)。我们实际上不会在本文中绘图,但如果我们这样做,我们会期望看到大约三个紧密的簇对应于3个正常簇而5个离群值则作为远离这些簇的孤立点出现。在交互式工作流程中我们可以根据它们的标签正常或哪个簇与异常为点上色以验证这种结构。即使没有标签分析师也可能会注意到这5个点在2D图上坐落在空白区域,并标记它们。这表明t-SNE可以成为网络安全数据中视觉异常检测和簇检查的强大辅助工具补充上述自动化算法。 在这里我们将之前的4D正常数据集与少量极端离群值结合在一起离群值有一个特征“持续时间”设置得非常高等以模拟一种奇怪的模式。我们以典型的困惑度30运行t-SNE。输出的data_2d形状为(1505, 2)。我们实际上不会在本文中绘图,但如果我们这样做,我们预计会看到大约三个紧密的簇,分别对应于3个正常簇而5个离群值则作为远离这些簇的孤立点出现。在交互式工作流程中我们可以根据它们的标签正常或哪个簇与异常为点上色以验证这种结构。即使没有标签分析师也可能会注意到这5个点在2D图上处于空白空间中并标记它们。这表明t-SNE可以成为网络安全数据中视觉异常检测和簇检查的强大辅助工具补充上述自动化算法。
</details> </details>