哈喽,我是kk~
最近有同学面试完米哈游,拿到offer的第二天,就入职了。
在这两周工作下来,忙的不可开交,这样的情况不知道如何维系。好处是确实进步很快,各种问题解决起来越来越熟悉。缺点是,他这边的活儿太多了,时间压缩,经常半夜,可能是自己时间分配不合理,也可能是和leader沟通有gap。
不管怎么说,给他的建议是,及时和leader沟通,事儿总要分步骤来,不能一下全部压到自己身上也不发声。
好了,今儿和大家分享一个他在面试中遇到的知识点:高斯混合模型
高斯混合模型(Gaussian Mixture Model, GMM)是一种用于聚类的概率模型,它假设数据来自多个高斯分布的混合。GMM 是一种生成模型,用于估计观测数据的分布,并可以通过期望最大化(EM)算法实现参数估计。
1. GMM 基础理论
假设数据 是由 个高斯分布混合而成,每个样本 的概率密度函数表示为:
其中:
是第 个高斯分布,均值为 ,协方差矩阵为 ,表示为:
是第 个高斯分布的混合系数,满足 且 。 是模型的参数集。
2. 参数估计:EM算法
EM算法是一种迭代优化方法,分为 E步 和 M步:
E步(期望步骤):
计算后验概率 ,即样本 属于第 个分布的概率:
M步(最大化步骤):
更新模型参数 :
迭代以上两步,直到对数似然函数 收敛:
3. 案例分析
我们通过一个实际案例,使用虚拟数据集,进行高斯混合模型的拟合与聚类。
以下代码包括:
生成虚拟数据集(2维数据分布)。 使用 sklearn 的 GMM 模块拟合数据。 绘制原始数据分布、聚类结果及高斯分布等高线。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from matplotlib.patches import Ellipse
# 设置随机种子
np.random.seed(42)
# 1. 生成虚拟数据集(2D数据)
n_samples = 5000
# 三个高斯分布的参数
means = [[0, 0], [5, 5], [8, 1]]
covariances = [[[1, 0.5], [0.5, 1]], [[1, -0.8], [-0.8, 1]], [[1, 0.3], [0.3, 1]]]
weights = [0.4, 0.35, 0.25] # 混合权重
# 按比例生成样本
data = []
for i in range(len(weights)):
samples = np.random.multivariate_normal(mean=means[i], cov=covariances[i], size=int(n_samples * weights[i]))
data.append(samples)
data = np.vstack(data)
# 2. 使用GMM拟合数据
gmm = GaussianMixture(n_components=3, covariance_type='full', random_state=42)
gmm.fit(data)
labels = gmm.predict(data)
# 3. 绘制结果
def plot_ellipse(position, covariance, ax, **kwargs):
"""绘制高斯分布的等高线"""
if covariance.shape == (2, 2):
eigenvalues, eigenvectors = np.linalg.eigh(covariance)
order = eigenvalues.argsort()[::-1]
eigenvalues, eigenvectors = eigenvalues[order], eigenvectors[:, order]
angle = np.degrees(np.arctan2(*eigenvectors[:, 0][::-1]))
width, height = 2 * np.sqrt(eigenvalues)
ellipse = Ellipse(position, width, height, angle, **kwargs)
ax.add_patch(ellipse)
# 创建画布
fig, ax = plt.subplots(1, 2, figsize=(16, 8))
# 原始数据
ax[0].scatter(data[:, 0], data[:, 1], c='gray', s=10, alpha=0.6, label='Original Data')
ax[0].set_title('Original Data Distribution')
ax[0].legend()
# 聚类结果 + 高斯分布
colors = ['red', 'blue', 'green']
for i, (mean, cov) in enumerate(zip(gmm.means_, gmm.covariances_)):
ax[1].scatter(data[labels == i, 0], data[labels == i, 1], s=10, alpha=0.6, label=f'Cluster {i+1}', color=colors[i])
plot_ellipse(mean, cov, ax[1], edgecolor=colors[i], facecolor='none', linestyle='--', linewidth=2)
ax[1].set_title('GMM Clustering Result and Gaussian Ellipses')
ax[1].legend()
plt.tight_layout()
plt.show()
1. 数据分布: 原始数据由三个二维高斯分布混合生成,每个分布有不同的均值和协方差,具有明显的非均匀性。
2. GMM 拟合: 模型成功将数据分为三类,并绘制出每个高斯分布的等高线(椭圆表示)。
面试米哈游,太痛苦了。。
左图展示了原始数据的随机分布。 右图展示了聚类结果和每个分布的高斯椭圆。