哈工大-机器学习-实验三:EM、k-means、GMM
时间: 2023-07-27 21:12:17 浏览: 63
实验三主要包括三个部分:EM、k-means 和 GMM。
1. EM:通过实现高斯混合模型的 EM 算法,对一组数据进行聚类。具体步骤包括初始化模型参数、E 步计算每个数据点属于每个高斯分布的后验概率、M 步更新每个高斯分布的均值和协方差矩阵、重复执行 E 步和 M 步直到收敛。
2. k-means:通过实现 k-means 算法,对一组数据进行聚类。具体步骤包括随机初始化 k 个聚类中心、将每个数据点分配到最近的聚类中心、更新每个聚类中心为所包含数据点的平均值、重复执行直到收敛。
3. GMM:通过实现高斯混合模型的最大似然估计算法,对一组数据进行聚类。具体步骤包括随机初始化模型参数、计算数据点的似然函数值、根据似然函数值计算每个数据点属于每个高斯分布的后验概率、使用极大似然估计法更新每个高斯分布的均值和协方差矩阵、重复执行直到收敛。
以上三种算法都可以用于聚类问题,但是它们的实现方式和结果可能会有所不同,需要根据具体问题进行选择。
相关问题
EM、k-means、GMM代码样例
EM算法样例代码:
```
import numpy as np
# 定义高斯分布函数
def gaussian(x, mean, cov):
n = x.shape[0]
exp_part = np.exp(-0.5 * (x - mean).T.dot(np.linalg.inv(cov)).dot(x - mean))
coef = 1 / np.sqrt(((2 * np.pi) ** n) * np.linalg.det(cov))
return coef * exp_part
# EM算法
def EM(X, K, max_iter):
n, m = X.shape
# 初始化参数
pi = np.ones(K) / K
mu = X[np.random.choice(n, K, replace=False)]
sigma = [np.eye(m) for i in range(K)]
# 迭代
for iter in range(max_iter):
# E步
gamma = np.zeros((n, K))
for i in range(n):
for j in range(K):
gamma[i, j] = pi[j] * gaussian(X[i], mu[j], sigma[j])
gamma[i] /= np.sum(gamma[i])
# M步
N_k = np.sum(gamma, axis=0)
for j in range(K):
mu[j] = np.sum(gamma[:, j].reshape(-1, 1) * X, axis=0) / N_k[j]
sigma[j] = (X - mu[j]).T.dot(gamma[:, j].reshape(-1, 1) * (X - mu[j])) / N_k[j]
pi[j] = N_k[j] / n
return pi, mu, sigma
```
k-means算法样例代码:
```
import numpy as np
# k-means算法
def kmeans(X, K, max_iter):
n, m = X.shape
# 随机初始化聚类中心
centers = X[np.random.choice(n, K, replace=False)]
# 迭代
for iter in range(max_iter):
# 计算每个样本到各个聚类中心的距离
dists = np.zeros((n, K))
for j in range(K):
dists[:, j] = np.sum((X - centers[j]) ** 2, axis=1)
# 将样本划分到最近的聚类中心
labels = np.argmin(dists, axis=1)
# 更新聚类中心
for j in range(K):
if np.sum(labels == j) > 0:
centers[j] = np.mean(X[labels == j], axis=0)
return centers, labels
```
GMM算法样例代码:
```
import numpy as np
# 定义高斯分布函数
def gaussian(x, mean, cov):
n = x.shape[0]
exp_part = np.exp(-0.5 * (x - mean).T.dot(np.linalg.inv(cov)).dot(x - mean))
coef = 1 / np.sqrt(((2 * np.pi) ** n) * np.linalg.det(cov))
return coef * exp_part
# GMM算法
def GMM(X, K, max_iter):
n, m = X.shape
# 初始化参数
pi = np.ones(K) / K
mu = X[np.random.choice(n, K, replace=False)]
sigma = [np.eye(m) for i in range(K)]
# 迭代
for iter in range(max_iter):
# E步
gamma = np.zeros((n, K))
for i in range(n):
for j in range(K):
gamma[i, j] = pi[j] * gaussian(X[i], mu[j], sigma[j])
gamma[i] /= np.sum(gamma[i])
# M步
N_k = np.sum(gamma, axis=0)
for j in range(K):
mu[j] = np.sum(gamma[:, j].reshape(-1, 1) * X, axis=0) / N_k[j]
sigma[j] = np.zeros((m, m))
for i in range(n):
sigma[j] += gamma[i, j] * np.outer(X[i] - mu[j], X[i] - mu[j])
sigma[j] /= N_k[j]
pi[j] = N_k[j] / n
return pi, mu, sigma
```
K-means和GMM的对比分析
K-means和GMM都是常用的聚类方法,但两者在一些方面存在差异。
1. 数据假设
K-means假设数据点属于一个确定的簇,而GMM假设数据点来自于多个高斯分布,每个高斯分布代表一个簇。
2. 聚类形状
K-means对聚类簇的形状有限制,只适用于凸形状的簇,而GMM则没有这个限制,可以适用于任意形状的簇。
3. 簇的数量
K-means需要预先指定簇的数量,而GMM可以自动估计簇的数量。
4. 簇成员权重
K-means将簇中的所有数据点看作是等权重的,而GMM可以给每个数据点分配不同的权重,这些权重可以用来表示数据点在簇中的相对重要性。
5. 对噪声数据的处理
K-means对噪声数据的处理较为简单,将其归为最近的簇中,而GMM可以通过将噪声数据分配给一个特定的混合分量来更好地处理噪声数据。
总的来说,K-means适用于数据点形状较为简单且簇的数量已知的情况,而GMM适用于数据点形状复杂且簇的数量未知或者需要自动估计的情况。