在文章开始之前,推荐一篇值得阅读的好文章!感兴趣的也可以去看一下,并关注作者!
今日推荐:前端部署相关知识导览
文章链接:https://cloud.tencent.com/developer/article/2467869
通过这篇文章,你将能够深入了解前端部署的相关技巧和命令指南,掌握前端开发过程中的部署环节,进一步提高开发效率,缩短从开发到上线的时间。无论你是刚开始接触前端开发,还是已经有一定经验的开发者,都能从中获益良多。本文不仅将介绍前端部署的基本概念,还将详细分析常用的部署工具、命令和配置技巧,帮助你快速上手并有效解决部署过程中遇到的问题。
在数据科学和机器学习中,聚类是重要的无监督学习任务。高斯混合模型(GMM)是一种常用的概率模型,用于描述数据的分布。在应用高斯混合模型时,EM(Expectation-Maximization)算法被广泛用于参数估计。本文将深入探讨EM算法的基本原理,并结合高斯混合模型,展示如何实现基于EM算法的聚类。
EM算法是一种迭代算法,广泛用于估计含有隐变量(latent variables)的概率模型的参数。它主要由两步组成:
EM算法通过不断重复E步和M步,逐步逼近最大似然估计。
EM算法不仅在高斯混合模型中有广泛应用,还在许多其他领域也有应用,例如:
高斯混合模型是一种假设数据点是由多个高斯分布成分组成的概率模型。每个高斯成分有自己的均值、方差和权重。GMM是通过EM算法来估计这些参数的。
GMM的概率密度函数可以表示为:
在聚类问题中,GMM通过拟合多个高斯分布来表示不同的聚类中心,数据点的归属通过计算其属于各个高斯成分的概率来确定。与K-means算法相比,GMM可以捕捉数据的多模态特性,不仅仅是基于距离的硬分类,还能通过概率分配进行软分类。
使用EM算法训练高斯混合模型时,主要目标是最大化数据点在模型下的对数似然函数。每次迭代中,E步通过计算数据点属于每个高斯成分的概率,M步则更新模型参数,使得对数似然函数最大化。
具体步骤如下:
GMM广泛应用于图像处理、文本分析、市场细分等领域。在聚类任务中,GMM可以帮助发现数据中的潜在模式,并且相比于传统的K-means算法,它能够更好地处理复杂的分布。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_blobs
我们使用make_blobs生成带有多个聚类的模拟数据:
# 生成模拟数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
plt.scatter(X[:, 0], X[:, 1], s=30)
plt.title("Generated Data")
plt.show()
我们使用GaussianMixture类来拟合GMM模型:
# 使用GMM进行聚类
gmm = GaussianMixture(n_components=4)
gmm.fit(X)
labels = gmm.predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.title("GMM Clustering Results")
plt.show()
# 可视化每个聚类的高斯分布
ax = plt.gca()
ax.set_title("GMM Clustering with Gaussian Components")
# 绘制数据点
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
# 绘制每个高斯分布的轮廓
for i in range(4):
covariances = gmm.covariances_[i]
mean = gmm.means_[i]
v, w = np.linalg.eigh(covariances)
v = 2.0 * np.sqrt(2.0) * np.sqrt(v) # Elongate the axes by a factor of 2
u = w[0] / np.linalg.norm(w[0]) # Normalize the eigenvector
angle = np.arctan(u[1] / u[0]) # Rotation angle
# Plot ellipse for each Gaussian component
ellipse = plt.matplotlib.patches.Ellipse(mean, v[0], v[1], 180.0 * angle / np.pi, color='red', alpha=0.4)
ax.add_patch(ellipse)
plt.show()
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_blobs
# 生成模拟数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 可视化生成的数据
plt.scatter(X[:, 0], X[:, 1], s=30)
plt.title("Generated Data")
plt.show()
# 使用GMM进行聚类
gmm = GaussianMixture(n_components=4)
gmm.fit(X)
labels = gmm.predict(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.title("GMM Clustering Results")
plt.show()
# 可视化每个聚类的高斯分布
ax = plt.gca()
ax.set_title("GMM Clustering with Gaussian Components")
# 绘制数据点
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
# 绘制每个高斯分布的轮廓
for i in range(4):
covariances = gmm.covariances_[i]
mean = gmm.means_[i]
v, w = np.linalg.eigh(covariances)
v = 2.0 * np.sqrt(2.0) * np.sqrt(v) # Elongate the axes by a factor of 2
u = w[0] / np.linalg.norm(w[0]) # Normalize the eigenvector
angle = np.arctan(u[1] / u[0]) # Rotation angle
# 修改部分:修正了 Ellipse 参数传递
ellipse = plt.matplotlib.patches.Ellipse(mean, v[0], v[1], angle=angle * 180.0 / np.pi, color='red', alpha=0.4)
ax.add_patch(ellipse)
plt.show()
可视化:
Wine 数据集概况
样本数:178
类别数:3
特征数:13
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from sklearn.datasets import load_wine
from sklearn.decomposition import PCA
# 加载Wine数据集
wine = load_wine()
X = wine.data # 特征数据
y = wine.target # 标签(真实类别)
# 使用PCA进行降维,便于在二维平面中可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)
# 使用GMM进行聚类
gmm = GaussianMixture(n_components=3, random_state=0)
gmm.fit(X_pca)
labels = gmm.predict(X_pca)
# 1. 原始数据的分布图
plt.figure(figsize=(6, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=y, cmap='viridis', s=50, edgecolor='k', alpha=0.7)
plt.title("Wine Dataset - Original Data Distribution")
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.colorbar(label='True Labels')
plt.show()
# 2. GMM 聚类结果图
plt.figure(figsize=(6, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels, cmap='viridis', s=50, edgecolor='k', alpha=0.7)
plt.title("GMM Clustering Results")
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.colorbar(label='Cluster Labels')
plt.show()
# 3. GMM 每个聚类的高斯分布轮廓图
plt.figure(figsize=(6, 6))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels, cmap='viridis', s=50, edgecolor='k', alpha=0.7)
plt.title("GMM Clustering with Gaussian Components")
# 绘制每个高斯成分的轮廓
ax = plt.gca()
for i in range(3): # 有3个聚类
mean = gmm.means_[i]
cov = gmm.covariances_[i]
v, w = np.linalg.eigh(cov)
v = 2.0 * np.sqrt(2.0) * np.sqrt(v) # Elongate the axes by a factor of 2
u = w[0] / np.linalg.norm(w[0]) # Normalize the eigenvector
angle = np.arctan(u[1] / u[0]) # Rotation angle
# 绘制椭圆
ellipse = plt.matplotlib.patches.Ellipse(mean, v[0], v[1], angle=angle * 180.0 / np.pi, color='red', alpha=0.4)
ax.add_patch(ellipse)
plt.xlabel("PCA Component 1")
plt.ylabel("PCA Component 2")
plt.colorbar(label='Cluster Labels')
plt.show()
通过本文的介绍,我们了解了EM算法的基本原理,并结合高斯混合模型(GMM)展示了如何使用EM算法进行聚类。与传统的K-means聚类相比,GMM能够提供更精确的结果,尤其是在数据分布不规则或复杂时。随着算法的不断发展和优化,GMM在实际应用中将展现出更大的潜力。
【1】Bishop, C. M. (2006). Pattern Recognition and Machine Learning. Springer.
挑战与创造都是很痛苦的,但是很充实。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。