基本概念
似然函数:在数理统计学中,似然函数是一种关于统计模型中的参数的函数,表示模型参数中的似然性。“似然性”与“或然性”或“概率”意思相近,都是指某种事件发生的可能性。
极大似然:相当于最大可能的意思。
概率与似然的区别:概率是已知条件推算结果,似然则是根据结果反推条件。
例1:已知参数B,推测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算法的思想:
- 给定个初值。
- E:根据给定的观测数据和当前的参数,求未观测数据Z的条件概率分布的期望
- M:求得Z,根据极大似然估计求最优
- 重复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 )