无监督学习(聚类 异常检测)

目录

无监督学习 (Unsupervised Learning)

相比有监督学习,无监督学习的训练数据不包含人工标注的标签,模型需要直接从数据中探索潜在的结构或模式。

  • 有监督学习 :解决预测问题 (输出已知)。
    • 任务类型:分类(离散输出)、回归(连续输出)。
    • 典型应用:房价预测、垃圾邮件识别。
  • 无监督学习 :解决结构发现 问题(输出未知)。
    • 任务类型:聚类(分组)、降维(压缩数据)、关联规则(发现规律)。
    • 典型应用:客户分群、异常检测、推荐系统。

有监督学习关注"答案是什么",无监督学习关注"数据中有什么"。

聚类 (Clustering)[K-means]

K-means 的直观理解

K-means 算法通过迭代优化执行两个关键步骤:

  1. 分配阶段:将每个数据点分配到最近的簇质心(基于欧氏距离等度量);
  2. 更新阶段:重新计算每个簇的质心(取簇内所有点的均值位置)。

这两个步骤交替进行,直到质心位置收敛或达到最大迭代次数。

这里按照两个簇的聚类来举例,K-means首先会随机猜测两个簇质心(Cluster centroids)的位置,如下图中红叉和蓝叉的位置。

分配阶段,将每个数据点分配到最近的簇质心。

)

更新阶段,重新计算每个簇的质心(取簇内所有点的均值位置)。

持续迭代,质心会逐渐偏移。

当迭代到质心位置不变,图中各个样本的颜色不发生改变,意味着此时K-means算法发生收敛,此时也分类好了簇。

K-means 算法

在数学中,两点之间的距离通常写成 ∣ ∣ x ( i ) − μ k ∣ ∣ ||x^{(i)}-μ_{k}|| ∣∣x(i)−μk∣∣,这种也称为L2范数(L2 norm)。

通过计算出该样本点 i i i 与每个簇质心的两点之间的距离,就可以得到 m i n ∣ ∣ x ( i ) − μ k ∣ ∣ min||x^{(i)}-μ_{k}|| min∣∣x(i)−μk∣∣,从而得到距离最近的簇质心索引 c ( i ) c^{(i)} c(i)。
簇质心的计算是通过对属于该簇的所有样本点在每个维度上取平均值得到的,即得到簇质点 μ i μ_i μi。

非良好分离的数据集上,K-means 聚类算法的表现通常会受限,甚至可能得到不符合直觉的聚类结果。但是也可以进行运用,如下图所示。定义T恤的小码、中码和大码应该多大,可以使用 K-means 进行。

当数据点之间没有清晰的边界,或者簇的形状不是凸形时,K-means 很容易将属于不同真实簇的数据点分到同一个簇中,或者将同一个真实簇的数据点分到不同的簇中。

优化目标

对于样本 i i i,它被分配到的簇的中心是 μ c ( i ) μ_{c^{(i)}} μc(i),其中 c ( i ) c^{(i)} c(i) 代表样本 i i i 被分配到的簇的索引。这个 μ c ( i ) μ_{c^{(i)}} μc(i) 是由所有被分配到簇 c ( i ) c^{(i)} c(i) 的样本点共同计算得出的均值。

K-means 算法的目标是最小化其代价函数。在算法的分配阶段,每个数据点被分配到距离其最近的簇中心。这一操作保证了在给定当前簇中心的情况下,通过最小化每个点到其所属簇中心的距离平方和,从而达到降低整体代价函数值的目的。因此也意味着这个算法保证收敛(代价保持不变或者变小)。

一旦有一次迭代保持不变,意味着K-means已经收敛。

K-means 初始化

K-means 算法的一个主要缺点是它对初始质心的选择非常敏感。K-means 算法的一个主要缺点是它对初始质心的选择非常敏感。通过不同的随机初始化簇质心,并选择其中最好的结果,可以使聚类效果变得更好。

如下图所示,不同初始化的簇质心所得到的最终效果。

根据初始值的不同,K-means 可能会陷入局部最小值。当然,对于二维可以用图像解决。

由于 K-means 算法是一个非凸优化问题,它易于收敛到局部最优解而非全局最优解。为了提高获得高质量聚类结果(即具有更低代价函数值)的可能性,通常会采用多种不同的初始化方案来多次运行 K-means 算法。在每次运行结束后,算法都会收敛到一个局部最优的代价函数值。最终,我们会比较这些不同初始化方案下收敛后的代价函数值,并选择其中代价函数值最小的那个聚类结果作为最终的输出。这种方法有助于降低陷入较差局部最优解的风险。

随机初始化时,假设要分出 K 个簇,随机挑选数据集中的 K 个样本,作为 K 个簇中心的初始值。

如下图所示,随机初始化的步骤流程。

选择聚类的数目

选择 K-means(或其他聚类算法)的聚类数目 K 是一个常见且重要的问题,因为 K-means 需要预先指定 K 值。没有一个放之四海而皆准的"最佳"方法,通常需要结合多种技术和领域知识来判断。

肘部法则 (Elbow Method)

计算不同 K 值下的代价函数。随着 K 的增加,代价函数的值会不断减小。当 K 增加到一定程度时,代价函数的下降幅度会显著变小,图线会呈现一个"肘部"形状。这个"肘部"点通常被认为是最佳的 K 值,因为它代表了在增加更多簇时,模型改进的边际收益递减的点。但是,在下降平缓的情况下,"肘部"不明显,难以确定,可能出现多个"肘部"。

随着 K 值增大,代价函数总在变小。因此选择代价函数最小(即取最大 K )并没有实际意义。

手动决定 K 值

如下图所示的T恤大小,决定尺码的多和少,依赖于后续的目的而看。

异常检测 (Anomaly detection)

发现异常事件

异常检测目标是识别与大多数数据点显著不同的数据点、事件或观测结果。这些"异常"可能预示着一些重要但罕见的事件,例如欺诈交易、设备故障或网络入侵等。异常检测的核心思想是"物以类聚,人以群分"。它通过学习正常数据的模式,来识别那些"不合群"的、偏离正常模式的数据点,并将其标记为异常。

最常见的进行异常检测的方法是通过一种叫做**密度估计 (Density Estimation)**的技术,如下图所示。

fraud 诈骗

高斯 (正态) 分布

X X X ~ N ( μ , σ 2 ) N(μ, σ^2) N(μ,σ2)

如下图所示,通过矩估计法将数据集的正态分布的 μ μ μ 和 σ 2 σ^2 σ2求出来,这里虽然采用的是样本二阶中心矩,而非样本方差,但是差距不大。


极大似然估计 (Maximum Likelihood Estimation, MLE)
以下所参考的视频

从分布中采样是已知一些分布参数得到的观测结果,结果出现的可能性用"概率"描述;而在已知观测结果对分布的参数进行估计或猜测,参数估计的可能性就用"似然"描述。

我们的目标是从一组已有的数据点 x 1 , x 2 , ... , x n x_1,x_2,...,x_n x1,x2,...,xn 中,找到最能解释这些数据背后生成过程的高斯分布。这个高斯分布由其参数均值 μ 和方差 σ 2 σ^2 σ2 决定。通过找到一对参数 ( μ μ μ, σ 2 σ^2 σ2),使得这个似然函数(联合概率密度)达到最大值。这个过程就是"极大似然估计"。采用联合概率密度,来自于贝叶斯定律的先验概率与后验概率的思想。

由于概率连乘的概率会越来越小,会存在过小的问题,通常采用取对数运算来解决。

假设线性回归中,将目标值 y y y 看作从一个高斯分布中采样而来的数据,在给定 x x x 情况下, y y y 是不确定的,现在的数据只不过是其中的一种采样结果,相当于增加了一个均值为 0 的噪声项。误差符合正态分布落在 y i = w x i y_i = wx_i yi=wxi 函数的两边,即把"误差"认为是符合"均值为0"的高斯分布。

整合到一块就如下图所示,形成了一种正态分布,这种依赖于条件分布的假设在机器学习中叫判别式模型

假设所有样本数据都遵循一个条件分布,且数据点相互独立,便可以极大似然估计。

最后便得到了最小二乘估计。

异常检测算法------密度估计 (Density Estimation)

拆成多个高斯分布,再求联合概率,整个过程就是极大似然估计 (MLE)。

开发和评估异常检测系统

CV ------ cross validation set

在实际操作中,如果有一些实例确实是异常,但却意外被标记为 y = 0,异常检测算法仍然可以正常工作。

通过交叉验证集来调整参数 ε ε ε,将其设置得更高或者更低。

整个过程为先用正常的数据拟合训练集模型,然后在cv和test集里穿插一些异常样本,看 ε ε ε 多大可以找出穿插的异常样本。

当异常样本过少时,可以选择仅有训练集和交叉验证集,但可能过拟合的风险会增高。

以下几个评估的指标在二分类中出现过,这里也是二分类的结果,因此可以使用。

异常检测 vs. 监督学习

特性 异常检测 (Anomaly detection) 监督学习 (Supervised learning)
正向例子 (y=1) 数量 非常少(通常 0-20 个) 数量多
负向例子 (y=0) 数量 数量多 数量多
异常/正向例子类型 有许多不同类型,未来出现的异常可能与训练集中的例子大不相同。 有足够的例子,未来出现的正向例子很可能与训练集中的例子相似。
典型应用 诈骗(Fraud)检测 垃圾邮件(Spam)分类

金融诈骗,每隔几个月或每年都会出现新的金融诈骗类型。
垃圾邮件,监督学习对垃圾邮件的检测到的效果很好,因为更多的垃圾邮件都是见过的。
简单来说:异常检测→白名单 监督学习→黑名单

特性 异常检测 (Anomaly detection) 监督学习 (Supervised learning)
制造业 寻找新的、以前未见过的缺陷(例如,飞机引擎)。 寻找已知的、以前见过的缺陷(例如,划痕,y=1)。
其他应用 欺诈(Fraud)检测、数据中心机器监控。 电子邮件垃圾邮件分类、天气预测(晴天/雨天等)、疾病分类。

特征的选择

构建异常检测算法时,选择合适的特征非常重要。

在监督学习中,如果特征选择了不是很对的特征或是有些与问题不相关的额外特征,通常也没关系,因为算法有监督信号,可以自动降低这些无用特征的影响,或者在模型训练过程中将其排除。

"监督信号"是标签数据 (labeled data),或者更具体地说是每个输入数据对应的正确输出值或"答案"

在异常检测算法中,它的运行仅依赖于无标签数据,算法更难以确定忽略应该忽略哪些特征,因此仔细选择特征对于异常检测比监督学习更为重要。

通过绘制特征的数据直方图,可以观察该特征是否符合高斯分布,高斯分布下有助于区分异常特征,作为一个很好的候选特征。

python 复制代码
# 绘制直方图
plt.hist
# plt.hist(x, bins=50) 更密的直方图

但很多时候绘制特征的直方图时,得到的分布可能不符合高斯分布。可以考虑对特征进行转换,使其更接近高斯分布。

因为自然界很多数据源于很多数字相乘,可以转为对数后相加,最后服从中心极限定律。

中心极限定理的核心:

当你把大量独立的、来自任何分布 (只要它们的均值和方差是有限的)的随机变量相加或求平均 时,这个"和"或"平均值"的分布将趋近于正态分布

简单的例子:

  • 单个随机变量: 假设你扔一个公平的骰子。结果是1到6,每个数字出现的概率都是1/6。这个分布是均匀分布,而不是正态分布。
  • 随机变量的平均值: 现在你连续扔100次骰子,并记录每次的平均值。如果你重复这个过程很多次(比如扔100次,得到一个平均值;再扔100次,得到另一个平均值...),然后把这些平均值画成直方图,你会发现这个直方图的形状非常接近一个正态分布

可通过以下转换,对于 log ⁡ ( x 2 + c ) \log (x_2 + c) log(x2+c) 这种, C C C 值越大对该分布的转换越小。

异常检测的核心挑战是找到一个能区分异常和正常的标准

很多时候,原始特征并不能很好地做到这一点,如下图所示,仅有 x 1 x_1 x1 特征会导致正常数据的 p ( x 1 ) p(x_1) p(x1) 也很小。

例如,正常点的概率值可能是 10 − 5 10^{−5} 10−5,而异常点的概率值可能是 10 − 6 10^{−6} 10−6。虽然理论上异常点的概率更小,但在实际操作中,这种微小的差异很容易被噪声淹没,导致我们无法用一个简单的阈值 ε ε ε 来清晰地将它们区分开来。

创造一个新特征 p ( x ) p(x) p(x),使得:

  • 对正常数据 x n o r m a l x_{normal} xnormal,新特征的值 p ( x n o r m a l ) p(x_{normal}) p(xnormal) 很大。
  • 对异常数据 x a b n o r m a l x_{abnormal} xabnormal,新特征的值 p ( x n o r m a l ) p(x_{normal}) p(xnormal) 很小。

如下图所示,以数据中心的电脑监控为例,可以创建如 x 5 x_5 x5 和 x 6 x_6 x6 的特征来识别出CPU负载高而网路流量下的异常情况,通过尝试各种不同的特征选择,来保持 p ( x ) p(x) p(x) 对于正常样本很大。