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