机器学习之无监督学习算法大总结

机器学习之无监督学习算法大总结

  • [第二章 无监督学习算法](#第二章 无监督学习算法)
    • [2.1 聚类算法](#2.1 聚类算法)
      • [2.1.1 概念](#2.1.1 概念)
      • [2.1.2 常见聚类算法分类](#2.1.2 常见聚类算法分类)
      • [2.1.3 常见聚类算法](#2.1.3 常见聚类算法)
        • [2.1.3.1 K 均值聚类](#2.1.3.1 K 均值聚类)
        • [2.1.3.2 层次聚类](#2.1.3.2 层次聚类)
          • [2.1.3.2.1 计算簇间相似度](#2.1.3.2.1 计算簇间相似度)
        • [2.1.3.3 密度聚类](#2.1.3.3 密度聚类)
        • [2.1.3.4 聚类算法评估指标](#2.1.3.4 聚类算法评估指标)
          • [2.1.3.4.1 轮廓系数(Silhouette Coefficient)](#2.1.3.4.1 轮廓系数(Silhouette Coefficient))
          • [2.1.3.4.2 簇内平方和(Within-Cluster Sum of Squares)](#2.1.3.4.2 簇内平方和(Within-Cluster Sum of Squares))
          • [2.1.3.4.3 肘部法](#2.1.3.4.3 肘部法)
          • [2.1.3.4.4 CH 指数(Calinski-Harabasz Index)](#2.1.3.4.4 CH 指数(Calinski-Harabasz Index))
          • [2.1.3.4.5 聚类评估 API 使用](#2.1.3.4.5 聚类评估 API 使用)
    • [2.2 降维](#2.2 降维)
      • [2.2.1 奇异值分解](#2.2.1 奇异值分解)
        • [2.2.1.1 概念](#2.2.1.1 概念)
        • [2.2.1.2 奇异值分解算法](#2.2.1.2 奇异值分解算法)
      • [2.2.2 主成分分析](#2.2.2 主成分分析)
        • [2.2.2.1 概念](#2.2.2.1 概念)
        • [2.2.2.2 奇异值分解实现主成分分析](#2.2.2.2 奇异值分解实现主成分分析)
    • [2.3 关联分析](#2.3 关联分析)
      • [2.3.1 Apriori算法](#2.3.1 Apriori算法)
      • [2.3.2 FP-growth算法](#2.3.2 FP-growth算法)
      • [2.3.3 Eclat算法](#2.3.3 Eclat算法)

第二章 无监督学习算法

2.1 聚类算法

2.1.1 概念

聚类(Clustering)旨在将数据集中的样本分成若干个簇,使得同一个簇内的对象彼此相似,不同簇间的对象差异较大。聚类是一种无监督学习算法,不需要预先标记数据的标签,完全依赖数据本身内在结构和特征来进行分组,最终簇所对应的概念语义需由使用者来把握和命名。

聚类的核心是"物以类聚",具体通过以下步骤实现:

  • 定义相似性:选择一个度量标准(如欧氏距离,余弦相似度)来衡量对象之间的相似性或距离。
  • 分组:根据相似性将对象分配到不同的簇中。
  • 优化:通过迭代或直接计算,调整簇的划分,使簇内相似性最大化,簇间差异最大化。

聚类应用场景:

  • 可用于发现不同公司客户群体的特征,消费者行为分析,市场细分,交易数据分析,动植物种群分类,医疗领域的疾病诊断,环境质量检测等领域,也可以用于Internet领域和电子商务领域中客户分析以及行为特征分类分析等。
  • 图像分割:将图像像素按颜色或纹理聚类。
  • 异常检测:识别不属于任何主要簇的异常点。
  • 生物信息:对基因表达数据进行分组。

2.1.2 常见聚类算法分类

基于层次的聚类(HierarchicalMethod),基于划分的聚类(PartitioningMethod,PAM),基于密度的聚类,基于约束的聚类,基于网络的聚类等。

  • 基于层次的聚类:将数据集划分为不同的层次,并使用合并或者分解的操作进行聚类,主要包括BIRCH(BalancedIterativeReducingandClusteringusingHierarchies)、CURE(ClusteringUsingRepresentatives)等。
  • 基于划分的聚类:将数据集划分为k个簇,然后计算其中的样本距离以获得假设簇的中心点,之后使用簇的中心点重新迭代计算新的中心点,直到k个簇的中心点收敛为止。基于划分的聚类有k-均值(k-means)等
  • 基于密度的聚类:根据样本的密度不断增长聚类,最终形成一组"密集连接"的点集。
    • 核心思想:只要数据的密度大于阈值,就可以将数据合并到一个簇当中,可以对噪声进行过滤,聚类的结果可以是任何形状的,不一定是凸形。
    • 主要方法:DBSCAN(Density-BasedSpatialClusteringofApplicationwithNoise)、OPTICS(OrderingPointsToIdentifytheClusteringStructure)等。
  • 均值漂移(Mean Shift):通过迭代移动数据点向密度较高的区域进行聚类,不需要指定簇的数量。
  • 高斯混合模型(GMM):基于概率模型,假设数据来自于多个高斯分布的混合,利用期望最大化(EM)算法进行优化。

2.1.3 常见聚类算法

2.1.3.1 K 均值聚类

K 均值聚类(K-means)是基于样本集合划分的聚类方法,将样本集合划分为𝑘个子集构成𝑘个簇,将𝑛个样本分到𝑘个簇中,每个样本到其所属簇的中心的距离最小。每个样本只能属于一个簇,所以 K 均值聚类是硬聚类

K 均值聚类归结为样本集合的划分,通过最小化损失函数来选取最优的划分 C ∗ C^* C∗。首先使用欧氏距离平方作为样本之间的距离:
d ( x i , x j ) = ∣ ∣ x i − x j ∣ ∣ 2 d(x_i,x_j) = ||x_i-x_j||^2 d(xi,xj)=∣∣xi−xj∣∣2

定义样本与其所属簇的中心之间的距离总和作为损失函数:
W ( C ) = ∑ l = 1 k ∑ C ( i ) = l ∣ ∣ x i − x ˉ l ∣ ∣ 2 W(C)=\sum_{l=1}^k\sum_{C(i)=l}||x_i-\bar{x}_l||^2 W(C)=l=1∑kC(i)=l∑∣∣xi−xˉl∣∣2

  • x ˉ l \bar{x}_l xˉl:第𝑙个簇的中心。
  • C ( i ) = l C(i)=l C(i)=l:第𝑖个样本是否属于簇𝑙。

K均值聚类就是求解最优化问题:
C ∗ = a r g m i n c W ( C ) = a r g m i n c ∑ l = 1 k ∑ C ( i ) = l ∣ ∣ x i − x ˉ l ∣ ∣ 2 C^* = argmin_{c} W(C) = argmin_{c} \sum_{l=1}^k \sum_{C(i)=l} ||x_i-\bar{x}_l||^2 C∗=argmincW(C)=argmincl=1∑kC(i)=l∑∣∣xi−xˉl∣∣2

相似的样本被聚到同一个簇时损失函数最小。这是一个组合优化问题,𝑛个样本分到𝑘个簇,所有可能的分法数目为 S ( n , k ) = 1 k ! ∑ l = 0 k ( − 1 ) l C k l ( k − l ) n S(n,k) = \frac{1}{k!} \sum_{l=0}^k(-1)^lC_k^l(k-l)^n S(n,k)=k!1∑l=0k(−1)lCkl(k−l)n,这个数目是指数级的,现实中采用迭代的方法求解。

K 均值聚类工作流程

  • 初始化,随机选择𝑘个样本点作为初始簇中心。
  • 对样本进行聚类,计算每个样本到各个簇中心的距离,将每个样本分到与其最近的簇,构成聚类结果。
  • 计算聚类结果中每个簇中所有样本的均值,作为新的簇中心。
  • 使用新的簇中心重复上述过程,直到收敛或符合停止条件(例如划分不再改变)。

K 均值聚类特点

  • K 均值聚类的初始中心的选择会直接影响聚类结果,并且不适合非凸形状簇。
  • K均值聚类需要事先指定簇个数𝑘,而实际中最优的𝑘值是不知道的,需要尝试使用不同的𝑘值检验聚类结果质量,可以采用二分查找快速找到最优𝑘值。聚类结果的质量可以用簇的平均直径来衡量,一般地,簇个数变小时平均直径会增加;簇个数变大超过某个值后平均直径会不变,而这个值正是最优的𝑘值。
  • 需要预先指定簇的数量K:大多数划分聚类算法(如K-Means)需要用户指定簇的数目,选择K的值可能会影响聚类结果。
  • 对初始值敏感:K-Means等算法容易受到初始簇中心选择的影响,可能导致算法陷入局部最优解。
  • 不能发现非球形簇:K-Means等算法假设簇是球形的,对于形状不规则的簇(如长条形、链状簇),效果较差。
  • 对噪声和离群点敏感:K-Means等算法对离群点敏感,因为它依赖于数据点的均值或中位数,离群点可能会影响最终的簇中心。

API调用:

python 复制代码
kmeans = KMeans(n_clusters=3)
# n_clusters: 指定 K 的值
kmeans.fit(X) # 训练
kmeans.predict(X) # 预测
kmeans.fit_predict(X) # 训练并预测
# 示例代码:
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs # 自动生成二维聚类数据
plt.rcParams["font.sans-serif"] = ["KaiTi"]
plt.rcParams["axes.unicode_minus"] = False
# 使用 make_blobs 生成 3 个簇,每个簇 100 个点
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=2)
fig, ax = plt.subplots(2, figsize=(8, 8))
ax[0].scatter(X[:, 0], X[:, 1], s=50, c="gray", label="原始数据")
ax[0].set_title("原始数据")
ax[0].legend()
# 使用 K-Means 聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_kmeans = kmeans.predict(X) # 预测每个点的簇标签
centers = kmeans.cluster_centers_ # 获取簇中心
ax[1].scatter(X[:, 0], X[:, 1], s=50, c=y_kmeans)
ax[1].scatter(centers[:, 0], centers[:, 1], s=200, c="red", marker="o",
label="簇中心")
ax[1].set_title("K-means 聚类结果 (K=3)")
ax[1].legend()
plt.show()
2.1.3.2 层次聚类

层次聚类(Hierarchical Clustering)假设簇之间存在层次结构,将样本聚到层次化的簇中。层次聚类有自下而上的聚合方法和自上而下的分裂方法。因为每个样本只属于一个簇,所以层次聚类属于硬聚类

  • 聚合聚类:开始将每个样本各自分到一个簇,之后将相距最近的两个簇合并,如此往复直至满足停止条件(例如达到预设的簇的个数、每个簇只包含一个样本、簇内样本相似性达到某个阈值等)。
  • 分裂聚类:开始将整个数据集视作一个整体,之后根据某种距离或相似性度量,选择一个现有的簇将其分裂成两个簇,使分裂后子簇内相似性高,子簇间差异大,如此往复直至满足停止条件。

层次聚类的特点:

  • 不需要输入聚类数目k
  • 一旦一个合并被执行,就不能修正
  • 没有一个全局最优化的目标函数
  • 计算量较大
2.1.3.2.1 计算簇间相似度

(1)MIN(单连接)

单链接的计算方法是将两个簇的数据点中距离最近的两个数据点间的距离作为这两个簇的距离。

  • 这种方法容易受到极端值的影响。两个并非很相似的簇可能由于其中的某个极端的数据点距离较近而组合在一起;
  • 单连接产生非常分散的簇,擅长处理非球形簇;
  • 对离群点和噪声敏感
    (2)MAX(全连接)
    全链接(Complete Linkage)的计算方法与单链接相反,将两个簇的数据点中距离最远的两个数据点间的距离作为这两个簇的距离。
  • 对那些与总体结构不太一致的离群点给予了过多的关注。也就是说,全连接聚类并不能找出最直观的簇结构,容易打破大团
  • 对离群点和噪声敏感
    (3)Group Average(组平均)
    组平均(Average Linkage)的计算方法是计算两个簇的数据点中的每个数据点与其他所有数据点的距离。
  • 对单链接和全链接的权衡,方法计算量比较大,但结果比前两种方法合理
  • 对噪声和离群点没那么敏感
    (4)Distance Between Centroids(质心距离)
    质心距离(Distance Between Centroids)的计算方法是将两个簇的质心距离作为这两个簇的距离。
  • 减少组平均方法计算量比较大问题
  • 对噪声和离群点没那么敏感
  • 偏向于球型簇
2.1.3.3 密度聚类

密度聚类(Density-Based Clustering)假设聚类结构能通过样本分布的紧密程度确定。通常情况下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展簇以获得最终聚类效果。

优点:

  • 无需指定簇数:与K-Means等算法不同,DBSCAN不需要预先指定簇的数量。
  • 能够识别任意形状的簇:DBSCAN通过密度的定义可以识别出任意形状的簇,而不像K-Means那样要求簇的形状是圆形的。
  • 处理噪声和离群点:DBSCAN具有较强的噪声抑制能力,能够自动识别并剔除噪声点和离群点。
  • 适用于非均匀密度数据:DBSCAN适合处理簇的密度不均匀的情况,能够处理一些复杂的聚类结构。

缺点:

  • 参数敏感:DBSCAN的效果非常依赖于参数Eps和MinPts的选择。在不同的数据集上,选择不同的参数值可能会导致完全不同的聚类结果。
  • 高维数据表现不佳:在高维数据中,距离的概念变得不那么可靠,DBSCAN可能难以有效地处理高维数据。
  • 性能问题:DBSCAN的时间复杂度为O(n^2),在大规模数据集上可能会导致较高的计算开销。

DBSCAN 是一种著名的密度聚类算法,基于邻域参数来刻画样本分布的紧密程度。对于给定数据集 D = { x 1 , x 2 , . . . , x n } D=\{x_1,x_2,...,x_n\} D={x1,x2,...,xn},定义下列概念:

  • ε − \varepsilon- ε−邻域:对于 x i ∈ D x_i\in D xi∈D,其 ε − \varepsilon- ε−邻域包含样本集𝐷中与 x i x_i xi的距离不大于 ε \varepsilon ε的样本。
  • 核心对象:若 x i x_i xi的 ε − \varepsilon- ε−邻域至少包含𝑀𝑖𝑛𝑃𝑡𝑠个对象,则 x i x_i xi是一个核心对象。
  • 密度直达:若 x j x_j xj位于 x i x_i xi的 ε − \varepsilon- ε−邻域中,且 x i x_i xi是核心对象,则称 x j x_j xj由 x i x_i xi密度直达。
  • 密度可达:对 x i x_i xi和 x j x_j xj,若存在样本序列 p 1 , p 2 , . . . , p n p_1,p_2,...,p_n p1,p2,...,pn,其中 p 1 = x i , p n = x j p_1=x_i, p_n=x_j p1=xi,pn=xj,且 p i + 1 p_{i+1} pi+1由 p i p_i pi密度直达,则称 x j x_j xj由 x i x_i xi密度可达。
  • 密度相连:对 x i x_i xi和 x j x_j xj,存在 x k x_k xk使得 x i x_i xi和 x j x_j xj均由 x k x_k xk密度可达,则称 x j x_j xj与 x i x_i xi密度相连。
  • 噪声点:不属于任何簇的点,既不是核心对象也不在核心对象邻域内。
  • 核心点(Core Point):如果某个点在其Eps邻域内至少有MinPts个点,则这个点被称为核心点。
  • 边界点(Border Point):如果某个点在Eps邻域内少于MinPts个点,但该点位于某个核心点的邻域内,则称该点为边界点。
  • 噪声点(Noise Point):如果一个点既不是核心点也不是边界点,那么它就是噪声点。

    基于这些概念,DBSCAN 将簇定义为由密度可达关系导出的最大密度相连样本集合 。DBSCAN 先根据邻域参数 ( ε , M i n p t s ) (\varepsilon, Minpts) (ε,Minpts)找出所有核心对象,再以任一核心对象为出发点找出由其密度可达的样本生成一个簇,直到所有核心对象均被访问过为止。

    密度聚类能识别任意形状的簇,可以自动识别并排除噪声点。但 ε , M i n p t s \varepsilon, Minpts ε,Minpts的选择对密度聚类结果影响较大,且密度聚类难以适应密度变化较大的数据集。
2.1.3.4 聚类算法评估指标

由于聚类任务没有预定义的标签(不像监督学习有真实类别可供比较),所以需要依赖聚类结果和原始数据来衡量模型的好坏,主要关注簇内的紧凑性和簇间的分离性。

2.1.3.4.1 轮廓系数(Silhouette Coefficient)

计算每个样本到同簇其他样本的平均距离(内聚度 a i a_i ai)和到最近其他簇样本的平均距离(分离度 b i b_i bi),综合评价聚类紧密度和分离度:
s i = b i − a i m a x ( a i , b i ) ∈ [ − 1 , 1 ] s_i = \frac{b_i-a_i}{max(a_i,b_i)} \in [-1,1] si=max(ai,bi)bi−ai∈[−1,1]
s i s_i si的值越接近 1,聚类效果越好。总体轮廓系数是所有 s i s_i si的平均值。

2.1.3.4.2 簇内平方和(Within-Cluster Sum of Squares)

衡量簇内数据点到簇中心的总距离平方和,常用于 K-means。
W C S S = ∑ k = 1 K ∑ i ∈ C k ∣ ∣ x i − μ k ∣ ∣ 2 WCSS = \sum_{k=1}^K \sum_{i \in C_k} ||x_i - \mu_k||^2 WCSS=k=1∑Ki∈Ck∑∣∣xi−μk∣∣2

其中 μ k \mu_k μk是第k个簇的中心。

2.1.3.4.3 肘部法

肘部法用于确定最佳簇数𝐾,在使用 K-means 时非常常见,它通过绘制簇数𝐾和某个聚

类质量指标(通常是簇内平方和)的关系曲线,找到一个拐点或"肘部",即增加簇数带来

的收益显著减少的点,这个点通常被认为是最佳的𝐾值。

2.1.3.4.4 CH 指数(Calinski-Harabasz Index)

簇间和簇内分散度的比值,也称方差比准则(越大越好):
C H = B C S S K − 1 W C S S N − K , B C S S = ∑ k = 1 K n k ∣ ∣ μ k − μ ∣ ∣ 2 , W C S S = ∑ k = 1 K ∑ i ∈ C k ∣ ∣ x i − μ k ∣ ∣ 2 CH= \frac{\frac{BCSS}{K-1}}{\frac{WCSS}{N-K}},BCSS=\sum_{k=1}^Kn_k||\mu_k-\mu||^2,WCSS = \sum_{k=1}^K\sum_{i \in C_k}||x_i-\mu_k||^2 CH=N−KWCSSK−1BCSS,BCSS=k=1∑Knk∣∣μk−μ∣∣2,WCSS=k=1∑Ki∈Ck∑∣∣xi−μk∣∣2

𝐵𝐶𝑆𝑆:簇间平方和, n k n_k nk是第𝑘个簇的样本数, μ k \mu_k μk为第𝑘个簇的中心,𝜇是所有样本的中心。

𝑊𝐶𝑆𝑆:簇内平方和。

2.1.3.4.5 聚类评估 API 使用
python 复制代码
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score, calinski_harabasz_score
plt.rcParams["font.sans-serif"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False
# 使用 make_blobs 生成 3 个簇,每个簇 100 个点
X, y_true = make_blobs(n_samples=300, centers=3, cluster_std=5)
# 使用 K-Means 聚类
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_kmeans = kmeans.predict(X) # 预测每个点的簇标签
centers = kmeans.cluster_centers_ # 获取簇中心
plt.scatter(X[:, 0], X[:, 1], s=50, c=y_kmeans, cmap="viridis")
plt.scatter(centers[:, 0], centers[:, 1], s=200, c="red", marker="*",
label="簇中心")
plt.legend()
print("簇内平方和:", kmeans.inertia_)
print("轮廓系数:", silhouette_score(X, y_kmeans))
print("CH 指数:", calinski_harabasz_score(X, y_kmeans))
plt.show()

2.2 降维

2.2.1 奇异值分解

2.2.1.1 概念

奇异值分解(Singular Value Decomposition,SVD)是一种矩阵因子分解方法,用于将矩阵分解为更简单的形式,从而揭示数据的内在结构和特性。通过保留最大的几个奇异值及其对应的奇异向量,可以近似重构原始矩阵,减少数据维度,同时保留主要信息。主成分分析,潜在语义分析等都用到了奇异值分解。

矩阵的奇异值分解是指将一个非零的实矩阵 A ∈ R n × p A \in R^{n \times p} A∈Rn×p表示为三个矩阵的乘积(因子分解)的形式:KaTeX parse error: Undefined control sequence: \sumV at position 6: A = U\̲s̲u̲m̲V̲^T

  • U是n阶正交矩阵: U U T = I UU^T = I UUT=I
  • V是p阶正交矩阵: V V T = I VV^T = I VVT=I
  • ∑ \sum ∑是由降序排列的非负的对角元素组成的 n × p n \times p n×p矩形对角阵: ∑ = d i a g ( σ 1 , σ 2 , . . . , σ p ) , σ 1 ≥ σ 2 ≥ . . . ≥ σ p ≥ 0 , p = m i n ( n , p ) \sum=diag(\sigma_1,\sigma_2,...,\sigma_p), \sigma_1 \ge \sigma_2 \ge ...\ge \sigma_p \ge 0, p=min(n,p) ∑=diag(σ1,σ2,...,σp),σ1≥σ2≥...≥σp≥0,p=min(n,p)
    KaTeX parse error: Undefined control sequence: \sumV at position 2: U\̲s̲u̲m̲V̲^T称为矩阵A的奇异值分解, σ i \sigma_i σi称为矩阵A的奇异值,U的列向量称为左齐异向量,V的列向量称为优异齐向量。任意实矩阵一定存在奇异值分解,且奇异值分解不唯一。

2.2.1.2 奇异值分解算法

矩阵𝐴的奇异值分解可以通过求对称矩阵 A T A A^TA ATA的特征值和特征向量得到。 A T A A^TA ATA的单位化特征向量构成正交矩阵𝑉的列; A T A A^TA ATA的特征值的平方根为奇异值 σ i \sigma_i σi,对其由大到小排列作为对角线元素构成对角矩阵Σ;求正奇异值对应的左奇异向量,再求扩充的 A T A^T AT的标准正交基,构成正交矩阵𝑈的列。具体过程如下:

首先求 A T A A^TA ATA的特征值和特征向量: ( 𝐴 𝑇 𝐴 ―𝜆 𝐼 ) 𝑥 = 0 (𝐴^𝑇𝐴 ― 𝜆𝐼)𝑥 = 0 (ATA―𝜆I)x=0

得到特征值并将其由大到小排序: 𝜆 1 ≥ 𝜆 2 ≥ ... ≥ 𝜆 𝑝 ≥ 0 𝜆_1 ≥ 𝜆_2 ≥ ... ≥ 𝜆_𝑝 ≥ 0 𝜆1≥𝜆2≥...≥𝜆p≥0

将特征值带入方程求出对应的特征向量,并将特征向量单位化,得到单位特征向量构成正交矩阵𝑉: 𝑉 = [ 𝒗 1 𝒗 2 ... 𝒗 𝑝 ] 𝑉 = [𝒗_1 𝒗_2 ... 𝒗_𝑝] V=[v1v2...vp]

特征值的平方根构成𝑛 × 𝑝矩形对角阵Σ: ∑ = d i a g ( 𝜆 1 , 𝜆 2 , ... , 𝜆 p \sum = diag(\sqrt{𝜆}_1, \sqrt{𝜆}_2,..., \sqrt{𝜆}_p ∑=diag(𝜆 1,𝜆 2,...,𝜆 p

对𝐴的正奇异值计算𝑈的列向量,A的秩为𝑟:
u j = 1 σ j A v j , j = 1 , 2 , . . . , r , U 1 = [ u 1 u 2 . . . u r ] u_j = \frac{1}{\sigma_j}Av_j, j=1,2,...,r, U_1 = [u_1 u_2 ... u_r] uj=σj1Avj,j=1,2,...,r,U1=[u1u2...ur]

若𝑛 > 𝑟,则需要补充额外的正交向量使𝑈成为𝑛×𝑛矩阵。求 𝐴 𝑇 𝐴^𝑇 AT的零空间的一组标准

正交基 𝒖 𝑟 + 1 , 𝒖 𝑟 + 2 , ... , 𝒖 𝑛 {𝒖_{𝑟+1},𝒖_{𝑟+2},...,𝒖_𝑛} ur+1,ur+2,...,un:
𝑈 2 = [ 𝒖 𝑟 + 1 𝒖 𝑟 + 2 ... 𝒖 𝑛 ] , 𝑈 = [ 𝑈 1 𝑈 2 ] 𝑈2 = [𝒖_{𝑟+1} 𝒖_{𝑟+2} ... 𝒖_𝑛], 𝑈 = [𝑈_1 𝑈_2] U2=[ur+1ur+2...un],U=[U1U2]

以求 A = [ 1 1 2 2 0 0 ] A = \begin{bmatrix} 1 & 1 \\ 2 & 2 \\ 0 & 0 \\ \end{bmatrix} A= 120120 的奇异值分解为例: A T A = [ 1 2 0 1 2 0 ] [ 1 1 2 2 0 0 ] = [ 5 5 5 5 ] , ( A T A − λ I ) x = 0 A^TA = \begin{bmatrix} 1 & 2 & 0 \\ 1 & 2 & 0 \\ \end{bmatrix} \begin{bmatrix} 1 & 1 \\ 2 & 2 \\ 0 & 0 \\ \end{bmatrix} = \begin{bmatrix} 5 & 5 \\ 5 & 5 \\ \end{bmatrix},(A^TA-\lambda I)x = 0 ATA=[112200] 120120 =[5555],(ATA−λI)x=0

得到齐次线性方程组: { ( 5 − λ ) x 1 + 5 x 2 = 0 5 x 1 + ( 5 − λ ) x 2 = 0 \begin{cases} (5-\lambda)x_1+5x_2 = 0 \\ 5x_1 + (5-\lambda)x_2= 0 \end{cases} {(5−λ)x1+5x2=05x1+(5−λ)x2=0

该方程组有非零解的充要条件是:
∣ 5 − λ 5 5 5 − λ ∣ = 0 , λ 2 − 10 λ = 0 \begin{vmatrix} 5-\lambda & 5 \\ 5 & 5-\lambda \end{vmatrix} = 0, \lambda^2-10\lambda=0 5−λ555−λ =0,λ2−10λ=0

解得 λ 1 = 10 , λ 2 = 0 \lambda_1=10,\lambda_2=0 λ1=10,λ2=0带入线性方程组,得到对应的单位向量:


上述过程只是为了说明计算的过程,实际应用中不会使用此算法。

2.2.2 主成分分析

2.2.2.1 概念

主成分分析(Principal Component Analysis,PCA)是一种常用的无监督学习方法,旨在找到数据中"最重要的方向",即方差最大的方向,并用这些方向重新表达数据。在主成分分析过程中,首先将数据的每个特征规范化为平均值为 0 方差为 1,以消除不同特征之间量纲的差异,再使用正交变换把线性相关的原始数据转换为线性无关的新数据(主成分)主成分彼此正交并且能够最大化地保留原始数据的方差信息。主成分分析主要用于降维和发现数据的基本结构。

主成分分析可直观解释为对数据所在的原始坐标系进行旋转变换,将数据投影到新坐标系的坐标轴上,新坐标系的第一坐标轴、第二坐标轴等分别表示第一主成分、第二主成分等。数据在每一轴上的坐标值的平方表示相应变量的方差,并且这个坐标系是所有可能的新坐标系中,坐标轴上的方差的和最大的。

在数据总体上进行的主成分分析称为总体主成分分析,在有限样本上进行的主成分分析称为样本主成分分析。在实际问题中,通常需要在观测数据上进行主成分分析,也就是样本主成分分析。

传统的主成分分析通过协方差矩阵或相关矩阵的特征值分解进行。

  • 协方差矩阵描述变量之间的方差和协方差,适用于未标准化的数据;
  • 相关矩阵描述变量之间的标准化相关性,适用于标准化的数据。
  • 特征值分解的结果给出了主成分的方向(特征向量)和每个主成分的方差(特征值)。

现在常用的方法是通过奇异值分解(SVD)进行主成分分析。

2.2.2.2 奇异值分解实现主成分分析

通过奇异值分解实现主成分分析可以避免计算协方差矩阵或相关矩阵,可以提高计算效率。

计算过程如下:

2.3 关联分析

关联分析(AssociativeAnalysis)是通过对数据集当中同时发生的事件的概率进行分析,从而挖掘它们之间是否存在一定的关联关系。

关联分析的典型应用------购物篮分析,通过分析购物篮中不同商品之间的关联来分析消费者的消费行为,根据消费者的消费习惯制定个性化的营销策略,以支持产品促销,产品定价,产品地理位置的摆放等因素,除此之外,还可以用来划分不同的消费者群体。

关联分析主要包括的算法有:Apriori算法、FP-growth算法以及Eclat算法。

关联规则挖掘:一种发现大量数据中事物(特征)之间有趣的关联的技术。

关联规则挖掘例子

TID Items

T1 {牛奶,面包}

T2 {面包,尿布,啤酒,鸡蛋}

T3 {牛奶,尿布,啤酒,可乐}

T4 {面包,牛奶,尿布,啤酒}

T5 {面包,牛奶,尿布,可乐}

总项集I={牛奶,面包,尿布,啤酒,鸡蛋,可乐}。

{啤酒}->{尿布} 是一条表征购买了啤酒也会购买尿布的关联规则。

关联规则定义

假设 I = { I 1 , I 2 , . . . I m } I = \{I_1,I_2,...I_m\} I={I1,I2,...Im}是项的集合。给定一个事务数据库D,其中每个事务(Transaction) t是I的非空子集

关联规则:不相交的非空项集X、Y,蕴含式X-->Y,X-->Y是一条关联规则。其中X含于I,Y含于I,且X^Y=非空集合

关联规则的度量:支持度(support)

支持度的定义:support(X-->Y) = |X^Y|/N=集合X与集合Y中的项在一条记录中同时出现的次数/数据记录的个数。

例如:support({尿布}-->{啤酒}) = 啤酒和尿布同时出现的次数/数据记录数= 3/5=60%

关联规则的度量:置信度(confidence)来描述

置信度:confidence(X-->Y) = |X^Y|/|X| = 集合X与集合Y中的项在一条记录中同时出现的次数/集合X出现的个数。

confidence({尿布}-->{啤酒}) = 啤酒和尿布同时出现的次数/尿布出现的次数= 3/4 = 75%

关联规则的度量:支持度和置信度越高,说明规则越强。关联规则挖掘就是要找出数据库中满足支持度support >= min_support、置信度confidence >= min_confidence的所有规则

关联规则挖掘的步骤

一个简单而粗暴的方法

  • 列出所有规则
  • 计算这些规则的支持度和置信度
  • 留下满足支持度置信度阈值的关联规则

关联规则挖掘的定义与步骤

仔细想一下,我们发现对于{啤酒-->尿布},{尿布-->啤酒}这两个规则的支持度实际上只需要计算{尿布,啤酒}的支持度。于是我们可以把关联规则挖掘拆解成按支持度和置信度两个要求分开计算。

关联规则挖掘的定义:给定一个交易数据集T,找出其中所有支持度support >= min_support、置信度confidence >= min_confidence的关联规则。

关联规则分为两步:

  • 找出所有频繁项集
  • 由频繁项集生成满足最小信任度阈值的规则

关联规则挖掘的步骤

  • 找出所有频繁项集:这一阶段找出所有满足最小支持度的项集,找出的这些项集称为频繁项集。
  • 由频繁项集生成满足最小信任度阈值的规则,在上一步产生的频繁项集的基础上生成满足最小置信度的规则,产生的规则称为强规则。

2.3.1 Apriori算法

主要实现过程:首先生成所有的频繁项集,之后采用频繁项集构造出满足最小置信度的规则。

特点:由于Apriori算法需要对样本集进行多次扫描,因此需要从候选的频繁项集中生成频繁项集,故在处理大量数据时,其效率较低。为了减少频繁项集的搜索空间,应该尽早的消除一些完全不可能是频繁项集的集合。

Apriori算法是一种经典的关联分析算法,用于挖掘数据集中的频繁项集和关联规则。其基本思想是通过扫描数据集多次来发现频繁项集的出现频率,并利用频繁项集生成关联规则。

apriori定律,频繁项集的非空子集必为频繁项集。

apriori定律的性质

  • 如果一个集合是频繁项集,则它的所有非空子集都是频繁项集。
    • 举例:假设一个集合{A,B}是频繁项集,即A、B同时出现在一条记录的次数大于等于最小支持度min_support,则它的子集{A},{B}出现次数必定大于等于min_support,即它的子集都是频繁项集。
  • 如果一个集合不是频繁项集,则它的所有超集都不是频繁项集。
    • 举例:假设集合{A}不是频繁项集,即A出现的次数小于min_support,则它的任何超集如{A,B}出现的次数必定小于min_support,因此其超集必定也不是频繁项集。

下面是Apriori算法的详细步骤:

  • 初始化:设置最小支持度阈值和最小置信度阈值。最小支持度阈值用于筛选频繁项集,最小置信度阈值用于筛选关联规则。
  • 扫描数据集:遍历数据集,统计每个项的出现次数,得到频繁1-项集(单个项)。
  • 构建候选项集:基于频繁1-项集,生成候选2-项集。对于候选k-项集,其生成方法是将两个频繁k-1-项集连接,然后进行剪枝操作。
  • 计算支持度:对于每个候选项集,扫描数据集,计算其支持度(出现次数除以数据集大小)。
  • 筛选频繁项集:根据支持度阈值,筛选出频繁项集。
  • 生成关联规则:对于每个频繁项集,根据置信度阈值,生成关联规则。生成规则的方法是将频繁项集划分为两个非空子集,计算置信度(频繁项集支持度除以子集支持度),并检查是否满足置信度阈值。
  • 输出结果:输出频繁项集和满足置信度阈值的关联规则。

通过以上步骤,Apriori算法可以找到数据集中的频繁项集和关联规则,从而发现事物之间的关联性和依赖关系。

需要注意的是,Apriori算法的效率随着数据集大小和项集数量的增加而下降。为了提高算法效率,可以采用优化技巧,如使用哈希表来快速计算支持度、使用剪枝策略等。

2.3.2 FP-growth算法

基于FP树生成频繁项集的FP-growth算法

  • 该算法仅扫描数据集两次,不使用候选项目集,而是根据支持程度直接构建频繁模式树,并使用该树生成关联规则,当处理相对较大的数据集时,其效率比Apriori算法大约快一个数量级
  • 对于海量数据,可以通过数据分区和样本采样之类的方法再次对其进行改进和优化。

FP-growth是一种高效的关联规则挖掘算法,用于发现数据集中的频繁项集和关联规则。相比于Apriori算法,FP-growth算法通过构建FP树(Frequent Pattern Tree)来减少候选项集的生成和扫描次数,从而提高了算法的效率。

下面是FP-growth算法的详细步骤:

  • 构建频繁项集的头指针表和计数表:遍历数据集,统计每个项的出现次数,并构建频繁项集的头指针表和计数表。头指针表用于快速访问相同项的节点,计数表记录每个项的支持度计数。
  • 构建FP树:第二次遍历数据集,对每个事务的项按照频繁项集的支持度降序排序,然后插入到FP树中。如果已经存在相同的路径,则增加该节点的计数;否则,创建一个新的路径。构建FP树的过程可以通过递归实现。
  • 生成条件模式基:对于每个频繁项,利用FP树的条件模式基进行构建。条件模式基是指以当前频繁项为结尾的路径集合,可以通过遍历FP树的方式获取。对于每个频繁项,通过连接当前项的前缀路径,得到条件模式基。
  • 递归构建频繁项集:对于每个频繁项和其对应的条件模式基,进行递归构建。将条件模式基作为新的数据集,重复上述步骤,直到无法继续生成频繁项集为止。
  • 生成关联规则:根据生成的频繁项集,通过递归方式生成关联规则。对于每个频繁项,将其划分为两个非空子集,并检查是否满足置信度阈值。如果满足,则可以生成一条关联规则。

通过以上步骤,FP-growth算法可以高效地挖掘数据集中的频繁项集和关联规则。相比于Apriori算法,FP-growth算法在构建FP树时避免了候选项集的生成和扫描,大大提高了算法的效率。

需要注意的是,FP-growth算法的实现依赖于数据结构FP树和条件模式基的构建,在处理大规模数据时可能需要消耗较多的内存。针对大规模数据集,可以采用压缩技术和分布式计算等方法进行改进。

2.3.3 Eclat算法

Eclat算法:一种深度优先算法,该算法使用垂直数据表示,并基于前缀的等价关系将搜索空间划分为较小的子空间,从而可以快速进行频繁项集的挖掘。

Eclat算法的核心思想:倒排,转换事务数据中的事务主键与项目(item),采用项目作为主键的方式。

好处:能够很明显地看到每个项目有哪些对应的事务ID,以方便项目频次的计算,从而迅速地获取频繁项集

特点:

  • 在Eclat算法中,可以通过计算项集的交集并切割结果来快速地获得候选集的支持率。
  • 由于计算交集需要很长的时间,因此在该过程中,时间复杂度高并且效率很低。
  • 该算法的空间复杂度同样较高,消耗了大量的存储空间。
相关推荐
2501_941111689 小时前
模板编译期哈希计算
开发语言·c++·算法
CoovallyAIHub10 小时前
智能体与小模型:AI迈向平民化的新浪潮
深度学习·算法·计算机视觉
jllllyuz10 小时前
基于粒子群优化(PSO)的特征选择与支持向量机(SVM)分类
开发语言·算法·matlab
因为奋斗超太帅啦10 小时前
Git分布式版本控制工具学习笔记(一)——git本地仓库的基本使用
笔记·git·学习
啊吧怪不啊吧10 小时前
贪心算法(局部最优实现全局最优)第一篇
算法·贪心算法
Jeled10 小时前
RecyclerView ViewHolder 复用机制详解(含常见错乱问题与优化方案)
android·学习·面试·kotlin
Yue丶越11 小时前
【C语言】深入理解指针(四)
java·c语言·算法
可可苏饼干11 小时前
LVS服务器
linux·运维·笔记·学习·lvs
四谎真好看11 小时前
Java 黑马程序员学习笔记(进阶篇27)
java·开发语言·笔记·学习·学习笔记
Abona11 小时前
自动驾驶、无人机、机器人核心技术双范式
算法·机器人·自动驾驶·无人机