无监督学习算法概览:聚类、降维、异常检测等

无监督学习是机器学习的一个分支,它的目的是对数据集进行自动分析,以发现其中的模式和结构,而无需事先对数据集进行标记。聚类、降维、异常检测是无监督学习的三个主要应用。本文将从原理和实例两个方面对这三个应用进行详细介绍,并提供代码示例帮助读者理解。

1. 聚类算法

聚类算法是将数据集中的对象分为多个类别的过程,每个类别内的对象具有相似的属性。聚类算法有多种实现方式,其中K-Means算法是最常用的一种。

1.1 K-Means算法原理

K-Means算法是一种简单而有效的聚类算法。该算法通过将样本数据分配到预定义数量的簇中,使得簇内的样本相似度较高,而簇间的相似度较低。其基本思想是随机选择k个初始中心点,然后将每个数据点分配到与其距离最近的中心点所在的簇中,接着根据簇内的数据点重新计算中心点的位置,迭代该过程直到满足停止条件。

K-Means算法的目标是将数据集中的n个对象分为k个类别,使得每个类别内的对象之间的差异最小。算法的流程如下:

  1. 从数据集中随机选取k个对象作为初始的聚类中心;
  2. 对于数据集中的每个对象,计算它与k个聚类中心的距离,并将它分配到距离最近的聚类中心所在的类别中;
  3. 对于每个类别,计算其中所有对象的平均值,并将该平均值作为该类别的新聚类中心;
  4. 重复步骤2和步骤3,直到聚类中心的位置不再发生变化。

1.2 K-Means算法代码实例

以下是一个K-Means算法的Python代码实现:

import numpy as np
import matplotlib.pyplot as plt

class KMeans:
    def __init__(self, n_clusters=3, max_iter=100):
        self.n_clusters = n_clusters # 簇的数量
        self.max_iter = max_iter # 最大迭代次数
    
    def fit(self, X):
        # 随机初始化簇的中心点
        self.centers = X[np.random.choice(X.shape[0], self.n_clusters, replace=False), :]
        
        for i in range(self.max_iter):
            # 分配数据点到最近的中心点
            labels = np.argmin(np.linalg.norm(X[:, np.newaxis, :] - self.centers, axis=2), axis=1)
            
            # 重新计算中心点的位置
            new_centers = np.array([X[labels == j].mean(axis=0) for j in range(self.n_clusters)])
            
            # 判断是否满足停止条件
            if np.allclose(new_centers, self.centers):
                break
            
            self.centers = new_centers
        
        # 将数据点分配到最终的簇中
        self.labels_ = np.argmin(np.linalg.norm(X[:, np.newaxis, :] - self.centers, axis=2), axis=1)
    
    def predict(self, X):
        # 将数据点分配到最终的簇中
        return np.argmin(np.linalg.norm(X[:, np.newaxis, :] - self.centers, axis=2), axis=1)

# 测试代码
np.random.seed(0)
X = np.random.randn(100, 2)
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
labels = kmeans.predict(X)

plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(kmeans.centers[:, 0], kmeans.centers[:, 1], marker='x', s=200, linewidths=3, color='r')
plt.show()

运行结果如下图所示:
K-means聚类

在上述代码中,我们首先定义了一个KMeans类,其中包含了初始化方法、fit方法和predict方法。fit方法是算法的核心,它使用迭代的方式不断地计算簇的中心点,并将数据点分配到最近的中心点所在的簇中。predict方法则将给定的数据点分配到最终的簇中。在测试代码中,我们使用Numpy生成了一组随机数据,并使用KMeans算法将其分为3个簇,并将结果可视化显示。

2. 降维算法

2.1 主成分分析原理

主成分分析(Principal Component Analysis,PCA)是一种常见的线性降维方法,它通过线性变换将高维数据映射到低维空间中。PCA的目标是找到一个新的坐标系,使得映射后数据的方差最大化。具体地,设 X X X 是一个 n × p n \times p n×p 的数据矩阵,其中每行表示一个样本,每列表示一个特征,假设 X X X 的每个特征都已经标准化,即均值为0,方差为1。PCA 的步骤如下:

  1. 计算样本的协方差矩阵 C = 1 n X T X C = \frac{1}{n} X^T X C=n1XTX
  2. 对协方差矩阵 C C C 进行特征值分解,得到特征值和特征向量;
  3. 将特征向量按照特征值大小降序排列,选择前 k k k 个特征向量组成变换矩阵 W W W
  4. 将原始数据 X X X 乘以变换矩阵 W W W,得到降维后的数据 Y = X W Y = XW Y=XW

其中,变换矩阵 W W W 是一个 p × k p \times k p×k 的矩阵,它的列向量是前 k k k 大的特征值对应的特征向量。

2.2 主成分分析代码实例

下面我们使用 Python 的 scikit-learn 库来演示 PCA 的应用,首先我们生成一个二维的高斯分布数据集,并可视化。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.decomposition import PCA

# 生成二维高斯分布数据
X, y = make_blobs(n_samples=200, centers=3, n_features=2, random_state=0)

# 可视化数据
plt.scatter(X[:, 0], X[:, 1], c=y, cmap='viridis')
plt.show()

运行结果如下图所示:

二维高斯分布数据

接下来我们使用 PCA 将数据降到一维,并可视化。

# 使用PCA将数据降到一维
pca = PCA(n_components=1)
X_pca = pca.fit_transform(X)

# 可视化降维后的数据
plt.scatter(X_pca[:, 0], np.zeros(X_pca.shape[0]), c=y, cmap='viridis')
plt.show()

运行结果如下图所示:

降成一维的高斯分布数据
可以看到,PCA 将原始的二维数据压缩到了一维,并且保留了数据的聚类结构。

3. 异常检测算法

异常检测(Anomaly detection)是一种无监督学习算法,其目的是在不知道正常值的情况下,识别出与其他值不同的异常值。这个问题在很多领域都有应用,比如欺诈检测、机器设备的故障检测等等。

3.1 基于高斯分布的异常检测原理

基于高斯分布的异常检测是一种常见的异常检测算法,也被称为正态分布异常检测。该算法的基本思想是假设正常数据集是由高斯分布生成的,而异常点则偏离了高斯分布的中心,因此可以通过计算数据点与高斯分布中心之间的距离来确定异常点。具体地,算法包括以下步骤:

  1. 对于数据集 X X X,先求出每个特征的均值和标准差,得到一个 n n n 维高斯分布的概率密度函数。

  2. 对于一个新的数据点 x x x,计算其在各个特征上的概率密度值,即:

p ( x ) = ∏ j = 1 n p ( x j ; μ j , σ j 2 ) = ∏ j = 1 n 1 2 π σ j exp ⁡ ( − ( x j − μ j ) 2 2 σ j 2 ) p(x) = \prod_{j=1}^n p(x_j; \mu_j, \sigma_j^2) = \prod_{j=1}^n \frac{1}{\sqrt{2\pi}\sigma_j} \exp(-\frac{(x_j - \mu_j)^2}{2\sigma_j^2}) p(x)=j=1np(xj;μj,σj2)=j=1n2π σj1exp(2σj2(xjμj)2)

其中 p ( x j ; μ j , σ j 2 ) p(x_j; \mu_j, \sigma_j^2) p(xj;μj,σj2) x j x_j xj 在高斯分布中的概率密度值, μ j \mu_j μj σ j 2 \sigma_j^2 σj2 分别是数据集 X X X 在第 j j j 个特征上的均值和方差。

  1. 如果 p ( x ) < ϵ p(x) < \epsilon p(x)<ϵ,则将 x x x 视为异常点,其中 ϵ \epsilon ϵ 是阈值参数,通常由交叉验证等方法确定。

3.2 基于高斯分布的异常检测代码实例

下面给出一个基于高斯分布的异常检测的代码实例。假设有一个二维的数据集 X X X,我们希望找出其中的异常点。

import numpy as np
import matplotlib.pyplot as plt

# 生成二维数据集
np.random.seed(42)
X = np.random.randn(100, 2)
X[:5] += np.array([5, 5])  # 添加一些异常点

# 计算均值和方差
mu = np.mean(X, axis=0)
sigma = np.std(X, axis=0)

# 计算概率密度函数
p = np.prod(1 / (np.sqrt(2 * np.pi) * sigma) * np.exp(- (X - mu) ** 2 / (2 * sigma ** 2)), axis=1)

# 设置阈值
epsilon = 1e-4

# 找出异常点
outliers = X[p < epsilon]

# 绘制数据集和异常点
plt.scatter(X[:, 0], X[:, 1])
plt.scatter(outliers[:, 0], outliers[:, 1], color='r', marker='x', s=100)
plt.show()

运行以上代码可以得到以下输出结果:
基于高斯分布的异常检测

4.总结

无监督学习是机器学习中重要的一部分,其目标是通过从数据中学习隐藏的模式和结构,为数据提供更深刻的洞察力。聚类、降维和异常检测是无监督学习中最常用的技术之一。

聚类是将数据点分组到不同的簇中的过程,从而找到数据中的相似性和差异性。K-Means是聚类算法中最常用的算法之一,它是一种迭代算法,可以将数据点分为预定的簇数,该算法通常用于挖掘大规模数据集的内在结构,例如在市场细分、图像分割和生物信息学中。

降维是减少数据维度的过程,同时保留数据的最大信息。主成分分析是降维中最常用的技术之一,它通过线性变换将原始数据映射到一个较小的维度空间,从而捕捉数据的主要变化模式,简化数据分析的复杂性。主成分分析通常用于减少数据的噪音和冗余信息,同时保留数据的主要特征。

异常检测是识别和诊断不正常的数据点的过程,通常用于发现意外的数据集合,如检测欺诈行为和网络入侵等。基于高斯分布的异常检测是最常用的技术之一,它通过估计数据的概率分布,计算每个数据点相对于该分布的异常程度,并将异常点识别为概率低的数据点。此外,异常检测还可以使用聚类算法和密度估计方法。

无监督学习是一个广泛的领域,包含许多技术和算法,它们的应用涵盖许多领域,如金融、医学、社交网络和工业生产。无监督学习的主要优点是无需标签或先验知识,它可以自动地从数据中挖掘模式,探索数据的内在结构,并为其他任务提供有价值的信息。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PyTechShare

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值