GMM高斯混合模型结合EM算法实现聚类

基本概念

似然函数:在数理统计学中,似然函数是一种关于统计模型中的参数的函数,表示模型参数中的似然性。“似然性”与“或然性”或“概率”意思相近,都是指某种事件发生的可能性。

极大似然:相当于最大可能的意思。

概率与似然的区别:概率是已知条件推算结果,似然则是根据结果反推条件。

例1:已知参数B,推测A会发生的概率

P( A|B)=\frac{P(AB)}{P(B)}

通过贝叶斯:

P(B|A)=\frac{P(A|B)P(B)}{P(A)}

反过来:A已经发生了,通过似然函数L(B|A),估计参数B的可能性

例2:

1.首先我们从10万学员中抽取到100个男生/女生的身高,组成样本集X,X={x1,x2,…,xN},其中xi表示抽到的第i个人的身高,N等于100,表示抽到的样本个数。
2.假定男生的身高服从正态分布 ,女生的身高则服从另一个正态分布
3.这两个分布的均值u和方差∂2都不知道,设为未知参数θ=[u, ∂]T
4.现在需要用极大似然法(MLE),通过这100个男生或100个女生的身高结果,即样本集X来估计两个正态分布的未知参数θ,问题定义相当于已知X,求θ,换言之就是求p(θ|x)
 

 

 EM算法:

将上述例子更加复杂化,将男女生混合,我们只知道身高数据,此时男女性别就是隐变量。通常我们可以根据正态分布参数来计算每个人是男是女的可能性,或者根据每个人是男是女的可能性来计算正态分布参数。

现在的情况:正态分布的参数未知,每个身高对应的男女性别也未知。

EM算法的思想:

  1.   给\theta定个初值。
  2. E:根据给定的观测数据和当前的参数\theta,求未观测数据Z的条件概率分布的期望
  3. M:求得Z,根据极大似然估计求最优\theta
  4. 重复2,3,直到收敛

经典例子:抛硬币

 下面是GMM高斯混合模型利用EM算法计算参数的聚类的代码:

from sklearn.mixture import GaussianMixture
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
import numpy as np
import matplotlib.pyplot as plt

# 准备五维观测变量数据
data = np.random.rand(100, 5)*10
print(data)
# data = np.array([[1.2, 4.1, 1.5, 4.1, 5.1], [, y2, z2, w2, v2], ..., [xn, yn, zn, wn, vn]])

# 设置聚类数量的范围
min_clusters = 2
max_clusters = 10

best_score = -1
best_clusters = None

# 尝试不同的聚类数量
for n_clusters in range(min_clusters, max_clusters+1):
    # 使用K-means进行初始聚类
    kmeans = KMeans(n_clusters=n_clusters)
    kmeans.fit(data)
    kmeans_labels = kmeans.labels_

    # 使用K-means聚类结果初始化GMM模型
    gmm = GaussianMixture(n_components=n_clusters, init_params='kmeans')
    gmm.fit(data, kmeans_labels)

    # 获取聚类结果和后验概率
    labels = gmm.predict(data)
    probs = gmm.predict_proba(data)

    # 计算轮廓系数
    score = silhouette_score(data, labels)

    # 保存最优的聚类数量和轮廓系数
    if score > best_score:
        best_score = score
        best_clusters = n_clusters
print(best_score,best_clusters)
# 使用最优的聚类数量进行最终的聚类
kmeans = KMeans(n_clusters=best_clusters)
kmeans.fit(data)
kmeans_labels = kmeans.labels_

gmm = GaussianMixture(n_components=best_clusters, init_params='kmeans')
gmm.fit(data, kmeans_labels)
labels = gmm.predict(data)
probs = gmm.predict_proba(data)

print(labels )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秃头馍馍粥

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

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

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

打赏作者

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

抵扣说明:

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

余额充值