一、什麼是GMM演算法
GMM(Gaussian Mixture Model)是一種基於概率密度函數的聚類方法。GMM演算法把數據看作若干個高斯分布隨機變數的組合,因此,它也被稱為混合高斯模型。在GMM模型中,每一個數據點都可以被多個高斯分布所解釋,每一個高斯分布代表簇中的一個部分。通過計算每個高斯分布對於數據點的貢獻度,可以確定該數據點所屬的聚類簇。
二、GMM演算法的原理
GMM演算法把數據看成由若干個高斯分布組成的混合分布,並通過最大似然估計來求解模型參數。模型參數包括每個高斯分布的均值、協方差矩陣和權重。具體來說,GMM演算法的原理包括以下幾個步驟:
1、初始化模型參數:包括高斯分布的均值、協方差矩陣和權重。一般地,初始化時選取K個隨機數,分別作為K個高斯分布的均值,對於協方差矩陣採用單位矩陣進行初始化,而每個高斯分布的權重使用平均值進行初始化。
import numpy as np from sklearn.mixture import GaussianMixture X = np.array([...]) gm_model = GaussianMixture(n_components=K, covariance_type='full', random_state=0) gm_model.fit(X) print(gm_model.means_) # K個高斯分布的均值 print(gm_model.covariances_) # K個高斯分布的協方差矩陣 print(gm_model.weights_) # K個高斯分布的權重
2、E步驟:計算數據點被每個高斯分布所解釋的概率。具體來講就是計算每個數據點分別屬於這K個高斯分布的概率分布,並且使用權重對其進行加權求和。
import numpy as np from scipy.stats import multivariate_normal def calc_prob(X, mu, sigma, alpha): prob = [] for i in range(K): norm = multivariate_normal(mean=mu[i], cov=sigma[i]) prob.append(norm.pdf(X) * alpha[i]) return prob X = np.array([...]) mu = np.array([...]) # K個高斯分布的均值 sigma = np.array([...]) # K個高斯分布的協方差矩陣 alpha = np.array([...]) # K個高斯分布的權重 prob = calc_prob(X, mu, sigma, alpha)
3、M步驟:更新高斯分布的均值、協方差矩陣和權重,使得對於每個數據點,被加權後的高斯分布概率值最大。具體的更新方式如下:
對於每個高斯分布,更新均值與協方差矩陣
import numpy as np def update_mu_sigma(X, prob): mu = [] sigma = [] for i in range(K): mu_i = np.sum(prob[:, i].reshape(-1, 1) * X, axis=0) / np.sum(prob[:, i]) mu.append(mu_i) sigma_i = np.zeros((n_features, n_features)) for j in range(n_samples): sigma_i += prob[j][i] * np.dot((X[j] - mu_i).reshape(-1, 1), (X[j] - mu_i).reshape(1,-1)) sigma_i /= np.sum(prob[:, i]) sigma.append(sigma_i) return np.array(mu), np.array(sigma) X = np.array([...]) prob = np.array([...]) n_samples, n_features = X.shape mu_new, sigma_new = update_mu_sigma(X, prob)
對於每個高斯分布,更新權重
import numpy as np def update_alpha(prob): alpha = np.sum(prob, axis=0) / prob.shape[0] return alpha prob = np.array([...]) alpha_new = update_alpha(prob)
4、重複進行E步驟和M步驟,直至收斂。
import numpy as np from scipy.stats import multivariate_normal def calc_prob(X, mu, sigma, alpha): prob = [] for i in range(K): norm = multivariate_normal(mean=mu[i], cov=sigma[i]) prob.append(norm.pdf(X) * alpha[i]) return prob def update_mu_sigma(X, prob): mu = [] sigma = [] for i in range(K): mu_i = np.sum(prob[:, i].reshape(-1, 1) * X, axis=0) / np.sum(prob[:, i]) mu.append(mu_i) sigma_i = np.zeros((n_features, n_features)) for j in range(n_samples): sigma_i += prob[j][i] * np.dot((X[j] - mu_i).reshape(-1, 1), (X[j] - mu_i).reshape(1,-1)) sigma_i /= np.sum(prob[:, i]) sigma.append(sigma_i) return np.array(mu), np.array(sigma) def update_alpha(prob): alpha = np.sum(prob, axis=0) / prob.shape[0] return alpha X = np.array([...]) n_samples, n_features = X.shape mu = [...] # K個高斯分布的均值 sigma = [...] # K個高斯分布的協方差矩陣 alpha = [...] # K個高斯分布的權重 tolerance = 1e-3 # 迭代收斂的閾值 max_iteration = 100 # 最大迭代次數 for i in range(max_iteration): prob = calc_prob(X, mu, sigma, alpha) mu_new, sigma_new = update_mu_sigma(X, prob) alpha_new = update_alpha(prob) # 計算收斂程度 diff_mu = np.abs(np.linalg.norm(mu_new) - np.linalg.norm(mu)) diff_sigma = np.abs(np.linalg.norm(sigma_new) - np.linalg.norm(sigma)) diff_alpha = np.abs(np.linalg.norm(alpha_new) - np.linalg.norm(alpha)) mu, sigma, alpha = mu_new, sigma_new, alpha_new if diff_mu < tolerance and diff_sigma < tolerance and diff_alpha < tolerance: break
三、GMM演算法的應用
GMM演算法在數據聚類、圖像分割、異常檢測等領域都有廣泛的應用。其中,最常用的就是數據聚類。通過對數據進行聚類,我們可以發現不同的數據所對應的高斯分布,從而識別不同的數據類別。下面是一個使用GMM演算法進行數據聚類的例子。
import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.mixture import GaussianMixture n_samples = 300 centers = [[1, 1], [-1, -1], [1, -1]] X, y_true = make_blobs(n_samples=n_samples, centers=centers, cluster_std=0.5) gm_model = GaussianMixture(n_components=3, covariance_type='full', random_state=0) gm_model.fit(X) labels = gm_model.predict(X) plt.scatter(X[:,0], X[:,1], c=labels, s=40, cmap='viridis') plt.show()
四、GMM演算法的優缺點
GMM演算法最大的優點是對數據的偏移和形狀沒有過多的要求,對於非線性、複雜的數據可以產生很好的聚類效果。而缺點則是演算法的複雜度較高,計算量大,需要進行多次迭代,計算效率較低。同時,GMM演算法還需要對初始值進行敏感的設置,對於不同的數據集,需要進行不同的參數調整。
原創文章,作者:MGXRW,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/349328.html