聚类与聚类模型

Python 中的离散事件模拟

Diogo Costa (PhD, MSc)

Adjunct Professor, University of Saskatchewan, Canada & CEO of ImpactBLUE-Scientific

模型结果的直方图

  • 探索模型结果
  • 识别拐点与瓶颈
  • 优化系统

直方图

  • 显示频率分布的图形
  • 给出区间内的观测数

Matplotlib 包

import matplotlib.pyplot as plt

用法: 用 50 个箱绘制数据集 data 的直方图

plt.hist(data, bins=50)

一个含 50 个箱的直方图,显示两个高斯分布,提示存在两个数据簇。

Python 中的离散事件模拟

聚类分析及其在模型中的应用

  • 应用
    • 模式识别(如模型结果)
    • 图像分析

北美夜间灯光的卫星图像。

  • 数据压缩
  • 计算机图形学
  • 机器学习

    一幅大脑中神经网络的示意图,暗示该技术在机器学习中揭示数据模式与聚类。

  • 在离散事件模型中

    • 识别模型输出模式
    • 提供更可操作的信息
Python 中的离散事件模拟

k-means 聚类

本节重点

  • k-means 聚类(质心模型)
  • 将观测划分为 k 个簇
  • 每个观测归入均值最近的簇
  • 簇的均值称为"簇质心"

观测与簇质心

展示用 k-means 计算簇质心的数据图。

Python 中的离散事件模拟

用 SciPy 实现 k-means 聚类

SciPy 方法

scipy.cluster.vq.kmeans()

实现

import scipy
scipy.cluster.vq.kmeans(
obs, k_or_guess, iter=20, thresh=1e-05,
check_finite=True, *, seed=None)
  • obs 是一个 numpy 数组
  • 返回:
    1. 聚类质心
    2. 失真度(观测与生成质心的平均距离)
Python 中的离散事件模拟

数据白化:去相关与重缩放

运行 k-means 前:白化数据

  1. 去相关 obs 数据
  2. 按各维度标准差重缩放 obs

该图含三幅面板:第一幅为相关数据,第二幅为去相关数据,第三幅为白化后的数据。

在 SciPy 中

scipy.cluster.vq.whiten(
obs, check_finite=True)
  • obs 是一个 numpy 数组
Python 中的离散事件模拟

白化与 k-means 示例

  • 多工序制造活动
  • 观察 Process 1 的影响

DNT_CURLY_TAG_2 图示原始数据与白化数据中,工序1用时与总用时的关系,并给出 k-means 聚类结果。

导入包

import scipy.cluster.vq as scvq

对白化模型结果

white_data = scvq.whiten(model_results)

寻找 2 个聚类(蓝点)

cluster_centroids, distortion = 
scvq.kmeans(white_data, 2)
Python 中的离散事件模拟

最优聚类数

技术

  • 简单法(最大聚类数)
  • 肘部法
  • 轮廓系数
  • Gap 统计量

简单法

  • 确定最大聚类数
  • 用法:$\Big(\dfrac{nobs}{2}\Big)^{0.5}$
    • nobs = 观测数
num_clusters = 
  int((model_results.shape[0]/2)**0.5)
  • 控制台输出
    22
    
Python 中的离散事件模拟

最优聚类数:轮廓系数法

  • 导入库
from sklearn.metrics import silhouette_score

计算 k 个聚类的轮廓系数

for k in range(2, 6):
  model = KMeans(n_clusters=k)
  model.fit(model_results)
  pred = model.predict(model_results)
  score = silhouette_score(model_results, pred)

控制台输出

Silhouette Score for k = 2: 0.591
Silhouette Score for k = 3: 0.472
Silhouette Score for k = 4: 0.381
Silhouette Score for k = 5: 0.364
Silhouette Score for k = 6: 0.373

结果解读

  • 最佳:score = 1
  • 最差:score = -1
  • 簇重叠:score 接近 0
Python 中的离散事件模拟

Passons à la pratique !

Python 中的离散事件模拟

Preparing Video For Download...