高斯混合聚类python实现
时间: 2023-07-11 11:46:18 浏览: 46
好的,以下是高斯混合聚类的Python实现:
```python
import numpy as np
from scipy.stats import multivariate_normal
class GMM:
def __init__(self, k, max_iterations=100):
self.k = k
self.max_iterations = max_iterations
def fit(self, X):
self.n, self.m = X.shape
self.phi = np.full(shape=self.k, fill_value=1/self.k)
self.weights = np.full(shape=self.k, fill_value=1/self.k)
self.means = np.random.rand(self.k, self.m)
self.covs = np.array([np.eye(self.m)] * self.k)
self.log_likelihoods = []
self.responsibilities = np.zeros(shape=(self.n, self.k))
for i in range(self.max_iterations):
self._e_step(X)
self._m_step(X)
log_likelihood = self._compute_log_likelihood(X)
self.log_likelihoods.append(log_likelihood)
def _e_step(self, X):
for j in range(self.k):
self.responsibilities[:, j] = self.phi[j] * multivariate_normal.pdf(
X, self.means[j], self.covs[j])
self.responsibilities = (self.responsibilities.T / np.sum(self.responsibilities, axis=1)).T
def _m_step(self, X):
for j in range(self.k):
resp = self.responsibilities[:, j]
total_resp = np.sum(resp)
self.weights[j] = total_resp / self.n
self.phi[j] = np.mean(resp)
self.means[j] = np.sum(X * resp.reshape(-1, 1), axis=0) / total_resp
x_mean = (X - self.means[j])
self.covs[j] = np.dot(resp * x_mean.T, x_mean) / total_resp
def _compute_log_likelihood(self, X):
log_likelihood = 0
for i in range(self.n):
tmp = 0
for j in range(self.k):
tmp += self.phi[j] * multivariate_normal.pdf(X[i], self.means[j], self.covs[j])
log_likelihood += np.log(tmp)
return log_likelihood
def predict(self, X):
resp = np.zeros((X.shape[0], self.k))
for j in range(self.k):
resp[:, j] = self.weights[j] * multivariate_normal.pdf(
X, self.means[j], self.covs[j])
return np.argmax(resp, axis=1)
```
其中,fit方法用于拟合数据,predict方法用于预测新数据的类别。