一维GMM的Python代码实现
import numpy as np class GMM(object): """Gaussian Mixture Model """ def __init__(self, data, K): """ K: the number of gaussian models alpha: the weight for corresponding gaussian model mu: the vector of means sigma2: the vector of variances N: the number of samples K: the number of gaussian models """ self.data = data self.K = K self.alpha = (np.ones(K) / K) self.mu = (np.arange(K) - K // 2) * (data.max() - data.min()) / K self.sigma2 = (np.ones(K)) self.N = len(data) self.gamma = np.ones((self.N, K)) / K def phi(self): # phi.shape(K, N) phi = (1 / np.sqrt(2 * np.pi * self.sigma2.reshape(self.K, 1)) * np.exp(- (self.data - self.mu.reshape(self.K, 1)) ** 2 / (2 * self.sigma2.reshape(self.K, 1)))) return phi def fit(self): sigma2_ = self.sigma2 mu_ = self.mu while True: # gamma.shape(N, K) self.gamma = (0.1 * self.gamma + 0.9 * self.phi().T * self.alpha / (self.phi().T * self.alpha).sum(axis=1).reshape(self.N, 1)) # mu.shape(1, K) self.mu = (0.1 * self.mu + 0.9 * np.matmul(self.data, self.gamma) / self.gamma.sum(axis=0)) # sigma2.shape(1,K) self.sigma2 = (0.1 * self.sigma2 + 0.9 * (self.gamma * (data.reshape(self.N, 1) - self.mu) ** 2).sum(axis=0) / self.gamma.sum(axis=0)) # alpha.shape(1, K) self.alpha = (0.1 * self.alpha + 0.9 * self.gamma.sum(axis=0) / self.N) if (np.sum((self.mu - mu_) ** 2) + np.abs(self.sigma2 - sigma2_).sum()) < 10 ** (-10): break mu_ = self.mu sigma2_ = self.sigma2 print(self.gamma.argmax(axis=1)) return self.gamma.argmax(axis=1) data = np.concatenate((np.random.normal(-4, 1, 2000), np.random.normal(4, 1, 2000))) gmm = GMM(data, 2) label = gmm.fit()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?