Pyspark聚类--GaussianMixture

本文介绍了如何使用PySpark的GaussianMixture进行多元高斯混合模型聚类,通过实例展示了数据预处理、模型训练、参数理解和结果分析过程。重点讲解了模型的k值、概率预测、权重及高斯分布等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GaussianMixture

class pyspark.ml.clustering.GaussianMixture(featuresCol=‘features’, predictionCol=‘prediction’, k=2, probabilityCol=‘probability’, tol=0.01, maxIter=100, seed=None)

GaussianMixture 聚类。 此类执行多元高斯混合模型 (GMM) 的期望最大化。 GMM 表示独立高斯分布的复合分布,具有相关的“混合”权重,指定每个对复合的贡献。 给定一组样本点,此类将最大化 k 高斯混合的对数似然,迭代直到对数似然变化小于收敛Tol,或者直到它达到最大迭代次数。 虽然这个过程通常可以保证收敛,但不能保证找到全局最优值。

对于高维数据(具有许多特征),该算法可能表现不佳。 这是由于高维数据 (a) 使其难以聚类(基于统计/理论认证)和高斯分布的数值问题

k = Param(parent=‘undefined’, name=‘k’, doc=‘混合模型中独立高斯的数量。必须> 1。’)

probabilityCol = Param(parent=‘undefined’, name=‘probabilityCol’, doc=‘预测类条件概率的列名。注意:并非所有模型都输出经过良好校准的概率估计!这些概率应该被视为置信度,而不是精确概率 .’)

model.weights:混合中每个高斯分布的权重。这是 k 个高斯分布的多项式概率分布,其中 weights[i] 是高斯 i 的权重,权重总和为 1。

model.gaussiansDF:检索高斯分布作为 DataFrame。每行代表一个高斯分布。 DataFrame 有两列:mean(向量)和 cov(矩阵)

model.summary.logLikelihood:该模型在给定数据上的总对数似然。

**model.summary.probability **:每个训练数据点的每个集群的概率的 DataFrame。

model.summary.clusterSizes:每个聚类的大小(数据点的数量)。

01.创建数据集

from pyspark.sql import SparkSession
spark = SparkSession.builder.config("spark.driver.host","192.168.1.10")\
    .config("spark.ui.showConsoleProgress","false").appName("GaussianMixture")\
    .master("local[*]").getOrCreate()
from pyspark.ml.linalg import Vectors
data = [(Vectors.dense([-0.1, -0.05 ]),),
        (Vectors.dense([-0.01, -0.1]),),
        (Vectors.dense([0.9, 0.8]),),
        (Vectors.dense([0.75, 0.935]),),
        (Vectors.dense([-0.83, -0.68]),),
        (Vectors.dense([-0.91, -0.76]),)]
df = spark.createDataFrame(data, ["features"])
df.show()
df.printSchema()

​ 输出结果:

+-------------+
|     features|
+-------------+
| [-0.1,-0.05]|
| [-0.01,-0.1]|
|    [0.9,0.8]|
| [0.75,0.935]|
|[-0.83,-0.68]|
|[-0.91,-0.76]|
+-------------+

root
 |-- features: vector (nullable = true)

02.构建高斯混合聚类模型,转换原数据查看结果

from pyspark.ml.clustering import GaussianMixture
gaussianMixture = GaussianMixture(k=3,maxIter=10,tol=0.0001,seed=10)
model = gaussianMixture.fit(df)
print(model.transform(df).collect())

​ 输出结果:

[Row(features=DenseVector([-0.1, -0.05]), prediction=0, probability=DenseVector([0.9855, 0.0094, 0.0051])),  Row(features=DenseVector([-0.01, -0.1]), prediction=1, probability=DenseVector([0.0, 0.6484, 0.3516])), Row(features=DenseVector([0.9, 0.8]), prediction=1, probability=DenseVector([0.0, 0.6509, 0.3491])), Row(features=DenseVector([0.75, 0.935]), prediction=1, probability=DenseVector([0.0, 0.6672, 0.3328])), Row(features=DenseVector([-0.83, -0.68]), prediction=0, probability=DenseVector([1.0, 0.0, 0.0])), Row(features=DenseVector([-0.91, -0.76]), prediction=0, probability=DenseVector([1.0, 0.0, 0.0]))]

03.查看模型的相关属性

print(model.hasSummary)
print(model.weights)
print(model.summary.k)

​ 输出结果:

True
[0.49760344861768196, 0.32931251892752, 0.1730840324547981]
3

04.检索高斯分布作为 DataFrame

model.gaussiansDF.show()
print(model.gaussiansDF.head(6))

​ 输出结果:

+--------------------+--------------------+
|                mean|                 cov|
+--------------------+--------------------+
|[-0.6158006194417...|0.132188091748508...|
|[0.54523101952700...|0.159129291449328...|
|[0.54042985246699...|0.161430620150746...|
+--------------------+--------------------+

[Row(mean=DenseVector([-0.6158, -0.4988]), cov=DenseMatrix(2, 2, [0.1322, 0.1152, 0.1152, 0.1003], False)), Row(mean=DenseVector([0.5452, 0.5449]), cov=DenseMatrix(2, 2, [0.1591, 0.1764, 0.1764, 0.2112], False)), Row(mean=DenseVector([0.5404, 0.5369]), cov=DenseMatrix(2, 2, [0.1614, 0.1785, 0.1785, 0.2126], False))]

05.查看模型汇总摘要的相关信息

print(model.summary.clusterSizes)
print(model.summary.logLikelihood

​ 输出结果:

[3, 3, 0]
7.266248915058737
### 文本聚类的方法及应用场景 #### 方法概述 文本聚类是指将一组文档划分为若干组,使得同一簇内的文档相似度较高,而不同簇之间的差异较大。常见的文本聚类方法主要包括基于距离的聚类算法、层次聚类、谱聚类以及概率模型等。 #### 基于距离的聚类算法 K-means 是一种广泛应用的距离基聚类算法,在 Python 中可以通过 `sklearn.cluster.KMeans` 实现[^2]。该算法通过迭代优化簇中心的位置来最小化簇内样本间的平方误差之和。对于大规模数据集,MiniBatch K-Means 可作为更高效的替代方案。此外,DBSCAN (Density-Based Spatial Clustering of Applications with Noise) 则适用于发现任意形状的数据簇,并能有效识别噪声点。 ```python from sklearn.cluster import KMeans, DBSCAN import numpy as np # 使用KMeans进行聚类 kmeans = KMeans(n_clusters=3).fit(X) # 使用DBSCAN进行聚类 dbscan = DBSCAN(eps=0.5, min_samples=5).fit(X) ``` #### 层次聚类 Agglomerative clustering 是自底向上的层次聚类方式之一,初始时每个对象视为独立的一类,随后逐步合并最接近的对象直至满足停止条件。这种方法适合探索性数据分析,尤其当预先不知道合适的类别数量时尤为有用。 ```python from sklearn.cluster import AgglomerativeClustering agg_clust = AgglomerativeClustering(n_clusters=None, distance_threshold=1.).fit(X) ``` #### 谱聚类 Spectral clustering 将原始空间中的复杂结构映射到低维嵌入空间后再执行简单图割操作完成最终分类任务。此法特别擅长处理非凸形分布的数据集合。 ```python from sklearn.cluster import SpectralClustering spec_clust = SpectralClustering(n_clusters=3, affinity='nearest_neighbors').fit(X) ``` #### 概率模型——高斯混合模型(GMM) Gaussian Mixture Model 是一种软分配的概率建模工具,允许单个实例属于多个潜在类别并给出相应隶属程度。Spark MLlib 提供了分布式 GMM 的实现支持大数据量下的高效运算[^3]。 ```python from pyspark.ml.clustering import GaussianMixture gmm = GaussianMixture(k=3).fit(dataframe) ``` #### 应用场景 - **客户细分**:通过对用户行为日志或评论内容实施聚类分析帮助企业更好地理解客户需求偏好; - **主题检测与跟踪**:自动识别新闻报道或其他媒体资源中讨论的主题领域变化趋势; - **垃圾邮件过滤**:依据邮件正文特征区分正常通信与恶意信息发送源; - **社交网络社区发现**:揭示在线平台内部形成的隐含社会关系网结构特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值