赞
踩
无监督学习是机器学习的一个分支,它的目的是对数据集进行自动分析,以发现其中的模式和结构,而无需事先对数据集进行标记。聚类、降维、异常检测是无监督学习的三个主要应用。本文将从原理和实例两个方面对这三个应用进行详细介绍,并提供代码示例帮助读者理解。
聚类算法是将数据集中的对象分为多个类别的过程,每个类别内的对象具有相似的属性。聚类算法有多种实现方式,其中K-Means算法是最常用的一种。
K-Means算法是一种简单而有效的聚类算法。该算法通过将样本数据分配到预定义数量的簇中,使得簇内的样本相似度较高,而簇间的相似度较低。其基本思想是随机选择k个初始中心点,然后将每个数据点分配到与其距离最近的中心点所在的簇中,接着根据簇内的数据点重新计算中心点的位置,迭代该过程直到满足停止条件。
K-Means算法的目标是将数据集中的n个对象分为k个类别,使得每个类别内的对象之间的差异最小。算法的流程如下:
以下是一个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()
运行结果如下图所示:
在上述代码中,我们首先定义了一个KMeans类,其中包含了初始化方法、fit方法和predict方法。fit方法是算法的核心,它使用迭代的方式不断地计算簇的中心点,并将数据点分配到最近的中心点所在的簇中。predict方法则将给定的数据点分配到最终的簇中。在测试代码中,我们使用Numpy生成了一组随机数据,并使用KMeans算法将其分为3个簇,并将结果可视化显示。
主成分分析(Principal Component Analysis,PCA)是一种常见的线性降维方法,它通过线性变换将高维数据映射到低维空间中。PCA的目标是找到一个新的坐标系,使得映射后数据的方差最大化。具体地,设 X X X 是一个 n × p n \times p n×p 的数据矩阵,其中每行表示一个样本,每列表示一个特征,假设 X X X 的每个特征都已经标准化,即均值为0,方差为1。PCA 的步骤如下:
其中,变换矩阵 W W W 是一个 p × k p \times k p×k 的矩阵,它的列向量是前 k k k 大的特征值对应的特征向量。
下面我们使用 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 将原始的二维数据压缩到了一维,并且保留了数据的聚类结构。
异常检测(Anomaly detection)是一种无监督学习算法,其目的是在不知道正常值的情况下,识别出与其他值不同的异常值。这个问题在很多领域都有应用,比如欺诈检测、机器设备的故障检测等等。
基于高斯分布的异常检测是一种常见的异常检测算法,也被称为正态分布异常检测。该算法的基本思想是假设正常数据集是由高斯分布生成的,而异常点则偏离了高斯分布的中心,因此可以通过计算数据点与高斯分布中心之间的距离来确定异常点。具体地,算法包括以下步骤:
对于数据集 X X X,先求出每个特征的均值和标准差,得到一个 n n n 维高斯分布的概率密度函数。
对于一个新的数据点 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=1∏np(xj;μj,σj2)=j=1∏n2π σ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 个特征上的均值和方差。
下面给出一个基于高斯分布的异常检测的代码实例。假设有一个二维的数据集 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()
运行以上代码可以得到以下输出结果:
无监督学习是机器学习中重要的一部分,其目标是通过从数据中学习隐藏的模式和结构,为数据提供更深刻的洞察力。聚类、降维和异常检测是无监督学习中最常用的技术之一。
聚类是将数据点分组到不同的簇中的过程,从而找到数据中的相似性和差异性。K-Means是聚类算法中最常用的算法之一,它是一种迭代算法,可以将数据点分为预定的簇数,该算法通常用于挖掘大规模数据集的内在结构,例如在市场细分、图像分割和生物信息学中。
降维是减少数据维度的过程,同时保留数据的最大信息。主成分分析是降维中最常用的技术之一,它通过线性变换将原始数据映射到一个较小的维度空间,从而捕捉数据的主要变化模式,简化数据分析的复杂性。主成分分析通常用于减少数据的噪音和冗余信息,同时保留数据的主要特征。
异常检测是识别和诊断不正常的数据点的过程,通常用于发现意外的数据集合,如检测欺诈行为和网络入侵等。基于高斯分布的异常检测是最常用的技术之一,它通过估计数据的概率分布,计算每个数据点相对于该分布的异常程度,并将异常点识别为概率低的数据点。此外,异常检测还可以使用聚类算法和密度估计方法。
无监督学习是一个广泛的领域,包含许多技术和算法,它们的应用涵盖许多领域,如金融、医学、社交网络和工业生产。无监督学习的主要优点是无需标签或先验知识,它可以自动地从数据中挖掘模式,探索数据的内在结构,并为其他任务提供有价值的信息。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。