面试米哈游,太痛苦了。。

文摘   2024-11-18 17:15   北京  

哈喽,我是kk~

最近有同学面试完米哈游,拿到offer的第二天,就入职了。

在这两周工作下来,忙的不可开交,这样的情况不知道如何维系。好处是确实进步很快,各种问题解决起来越来越熟悉。缺点是,他这边的活儿太多了,时间压缩,经常半夜,可能是自己时间分配不合理,也可能是和leader沟通有gap。

不管怎么说,给他的建议是,及时和leader沟通,事儿总要分步骤来,不能一下全部压到自己身上也不发声。


好了,今儿和大家分享一个他在面试中遇到的知识点:高斯混合模型

高斯混合模型(Gaussian Mixture Model, GMM)是一种用于聚类的概率模型,它假设数据来自多个高斯分布的混合。GMM 是一种生成模型,用于估计观测数据的分布,并可以通过期望最大化(EM)算法实现参数估计。

1. GMM 基础理论

假设数据  是由  个高斯分布混合而成,每个样本  的概率密度函数表示为:

其中:

  •  是第  个高斯分布,均值为 ,协方差矩阵为 ,表示为:
  •  是第  个高斯分布的混合系数,满足   
  •  是模型的参数集。

2. 参数估计:EM算法

EM算法是一种迭代优化方法,分为 E步  M步

  1. E步(期望步骤):
    计算后验概率 ,即样本  属于第  个分布的概率:
  1. M步(最大化步骤):
    更新模型参数 
  1. 迭代以上两步,直到对数似然函数  收敛:

3. 案例分析

我们通过一个实际案例,使用虚拟数据集,进行高斯混合模型的拟合与聚类。

以下代码包括:

  1. 生成虚拟数据集(2维数据分布)。
  2. 使用 sklearn 的 GMM 模块拟合数据。
  3. 绘制原始数据分布、聚类结果及高斯分布等高线。
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 = [[00], [55], [81]]
covariances = [[[10.5], [0.51]], [[1-0.8], [-0.81]], [[10.3], [0.31]]]
weights = [0.40.350.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 == (22):
        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(12, figsize=(168))

# 原始数据
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 拟合: 模型成功将数据分为三类,并绘制出每个高斯分布的等高线(椭圆表示)。

面试米哈游,太痛苦了。。

  • 左图展示了原始数据的随机分布。
  • 右图展示了聚类结果和每个分布的高斯椭圆。

kk机器学习算法
机器学习基础、计算机视觉…
 最新文章