EM求解GMM代码

import numpy as np
from numpy import linalg
import math
from sklearn.mixture import GaussianMixture


class GMM(object):
    def __init__(self, X, K):
        self.N, self.D = X.shape
        self.K = K
        self.Mu, self.Sigma, self.Pi, self.Gamma = self.init_params()
    
    def init_params(self):
        Mu = np.random.rand(self.K, self.D)  # K*D
        Sigma = np.array([np.eye(self.D)] * self.K) * 0.1  # K*D*D
        Pi = np.array([1.0 / self.K] * self.K)  # K
        Gamma = np.random.rand(self.N, self.K)
        return Mu, Sigma, Pi, Gamma
    
    def e_step(self, X):
        prob = []
        for i in range(self.K):
            prob.append(get_Gaussian_prob(X, self.Mu[i], self.Sigma[i]))
        prob = np.array(prob).T
        Pi_Gussian = prob * self.Pi
        sum_K = np.sum(Pi_Gussian, axis=1)
        return (Pi_Gussian.T / sum_K).T  # Gamma
    
    def m_step(self, X):
        NK = np.sum(self.Gamma, axis=0)
        _1_NK = 1 / NK
        # get new Mu
        m = np.dot(self.Gamma.T, X)
        newMu = (_1_NK * m.T).T
        # get new Sigma
        newSigma = []
        for i in range(self.K):
            newSigma.append(_1_NK[i] * np.dot((self.Gamma[:, i] * (X - newMu[i]).T), (X - newMu[i])))
        newSigma = np.array(newSigma)
        # get Pi
        newPi = NK / self.N
        return newMu, newSigma, newPi
    
    def train(self, X, times):
        for i in range(times):
            self.Gamma = self.e_step(X)
            self.Mu, self.Sigma, self.Pi = self.m_step(X)
        return self.Mu, self.Sigma, self.Pi, self.Gamma


def get_Gaussian_prob(X, mu, sigma):
    """已知一个高斯分布的参数,求其概率"""
    D = len(sigma)
    if X.size == D:
        n = 1
    else:
        n, _ = X.shape
    det = linalg.det(sigma)
    
    norm_const = 1.0 / (math.pow(2 * math.pi, float(D) / 2) * math.pow(det, 1.0 / 2))
    x_mu = np.array(X - mu)
    inv = linalg.inv(sigma)
    result = np.power(math.e, -0.5 * np.dot(np.dot(x_mu, inv), x_mu.T))
    if n != 1:
        result = np.diag(result)
    return norm_const * result

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
GMM(高斯混合模型)是一种用于聚类分析的机器学习算法,它假设每个聚类都服从高斯分布。下面是用Python编写的GMM求解代码示例: ```python import numpy as np from sklearn.mixture import GaussianMixture # 生成随机数据 np.random.seed(0) n_samples = 1000 n_features = 2 X = np.random.randn(n_samples, n_features) # 初始化GMM模型 n_components = 3 gmm = GaussianMixture(n_components=n_components) # 使用GMM拟合数据 gmm.fit(X) # 预测每个样本的聚类类别 labels = gmm.predict(X) # 获取每个样本属于每个聚类的概率 probabilities = gmm.predict_proba(X) # 打印聚类结果 print("聚类类别:", labels) print("聚类概率:", probabilities) ``` 上述代码首先导入需要的库,然后通过`np.random.randn()`生成了一个包含1000个样本和2个特征的随机数据集`X`。接下来,使用`GaussianMixture`类初始化了一个GMM模型,并指定了聚类的个数`n_components`为3。 然后,调用`fit()`方法拟合数据,获得模型对于数据的拟合结果。再调用`predict()`方法预测每个样本的聚类类别,使用`predict_proba()`方法获取每个样本属于每个聚类的概率。 最后,打印了聚类的结果,包括每个样本的聚类类别和属于每个聚类的概率。 请注意,上述代码使用了`sklearn`库中的`GaussianMixture`类实现了GMM算法,这是一个非常方便的工具。在实际应用中,可以根据需要对代码进行修改和优化,以适应具体的问题和数据集。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值