楼宇建筑是当下能源消耗的 “大户”。建筑物严重依赖照明, 供暖, 空调等设施, 给楼层中的人们提供舒适的办公, 居住, 以及生活环境。研究人员为了研究能源使用的效率, 模拟了12 种不同的建筑外形。每一种建筑在覆盖玻璃的区域, 玻璃区域的分布位置, 建筑方位等方面都有所不同。 本案例提供了一份有关楼宇能源的数据集, 共有 10 个特征, 768 个样本。 需要关注的重点是建筑物的供暖负荷和冷却负荷。
我们使用高斯混合模型,对数据集进行聚类,并使用KMeans模型作为对照,展现高斯混合模型在聚类问题上的应用。
import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
data = pd.read_csv('./input/energy-efficiency.csv')
type(data.values)
data.head()
data.info()
data.describe()
scaler = StandardScaler().fit(data)
scaler.mean_
scaler.scale_
scaled_data = scaler.transform(data)
scaled_data
from sklearn.manifold import TSNE
from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
iris = load_iris()
X_tsne = TSNE(n_components=3, learning_rate=100).fit_transform(scaled_data)
X_pca = PCA(n_components=3).fit_transform(scaled_data)
plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c = scaled_data[:,-2])
plt.subplot(122)
plt.scatter(X_pca[:, 0], X_pca[:, 1], c = scaled_data[:, -2])
plt.show()
from mpl_toolkits.mplot3d import Axes3D
X_tsne = TSNE(n_components=3, learning_rate=100).fit_transform(scaled_data)
X_pca = PCA(n_components=3).fit_transform(scaled_data)
fig = plt.figure(figsize=(10, 5))
ax = fig.add_subplot(121, projection='3d')
ax.scatter(X_tsne[:, 0], X_tsne[:, 1], X_tsne[:, 2], c = scaled_data[:,-2])
ax = fig.add_subplot(122, projection='3d')
ax.scatter(X_pca[:, 0], X_pca[:, 1], X_pca[:, 2], c = scaled_data[:,-2])
plt.show()
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
estimator = KMeans(n_clusters=3)
estimator.fit(data.values)
labels = estimator.labels_
X_tsne = TSNE(n_components=2, learning_rate=100).fit_transform(scaled_data)
plt.figure(figsize=(10, 5))
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c = labels)
plt.show()
假定数据集中的数据记录来自不同的数据分布,那么对数据集进行聚类可以使用高斯混合(Gaussian Mixture Model)模型。GMM使用EM算法确定每个组成部分所在分布的参数。
给定$z$是一个$K$维的随机隐变量,其中$z_{k} \in \{0, 1\}, \quad \sum_{k}z_{k} = 1$,变量$z$的分布为$p(z_{k} = 1) = \pi_{k}$
\begin{equation} p(x) = \sum_{z}p(z)p(x \vert z) \\ = \sum_{k = 1}^{K}p(z)\prod_{k = 1}^{K} (\mathcal{N}(x \vert \mu_{k}, \Sigma_{k}))^{z_{k}} = \sum_{k = 1}^{K}\pi_{k} \mathcal{N}(x \vert \mu_{k}, \Sigma_{k}) \end{equation}从上面的公式可以看出,GMM模型实质上是K个高斯模型的线性叠加。进一步来讲,对于聚类问题,我们关注$p(z_{k} = 1 \vert x, \theta )$,也就是数据x属于簇$k$的后验概率概率。
我们给出高斯混模型求参的EM框架:
对上式求偏导,就可以得到参数的解析式为
\begin{equation} \pi_{k} = \dfrac{1}{N}\sum_{n = 1}^{N}\gamma_{n}(z_{k}) \\ \mu_{k} = \sum_{n = 1}^{N}\dfrac{\gamma_{n}(z_{k})x_{n}}{\gamma(z_{k})} \\ \Sigma_{k} = \dfrac{\sum_{n = 1}^{N}\gamma_{n}(z_{k})x_{n}x_{n}^{T}}{\gamma(z_{k})} - \mu_{k}\mu_{k}^{T} \end{equation}from sklearn.mixture import GaussianMixture
import matplotlib.pyplot as plt
gmm_random = GaussianMixture(n_components=3, covariance_type='full', init_params='random').fit(scaled_data)
labels_random = gmm.predict(scaled_data)
gmm_kmeans = GaussianMixture(n_components=3, covariance_type='full').fit(scaled_data)
labels_kmeans = gmm.predict(scaled_data)
X_tsne = TSNE(n_components=2, learning_rate=100).fit_transform(scaled_data)
#plt.figure(figsize=(10, 5))
plt.subplot(121)
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c = labels_random)
plt.subplot(122)
plt.scatter(X_tsne[:, 0], X_tsne[:, 1], c = labels_kmeans)
plt.show()