聚类或聚类分析是无监督学习问题, 常被用于数据分析,本文记录聚类问题定义,以及常用聚类算法和实现。
聚类分析,即聚类,是一项无监督的机器学习任务。它包括自动发现数据中的自然分组。与监督学习(类似预测建模)不同,聚类算法只解释输入数据,并在特征空间中找到自然组或群集。
聚类技术适用于没有要预测的类,而是将实例划分为自然组的情况。 —源自:《数据挖掘页:实用机器学习工具和技术》2016年。
群集通常是特征空间中的密度区域,其中来自域的示例(观测或数据行)比其他群集更接近群集。群集可以具有作为样本或点特征空间的中心(质心),并且可以具有边界或范围。
有许多类型的聚类算法。许多算法在特征空间中的示例之间使用相似度或距离度量,以发现密集的观测区域。因此,在使用聚类算法之前,扩展数据通常是良好的实践。
scikit-learn 库提供了一套不同的聚类算法供选择,我们就以 skikit-learn 库的算法为例列举常用聚类算法与相应实践。
需要安装 Anaconda
安装 sklearn 库
1 | pip install scikit-learn |
|---|
我们将使用 python sk-learn 库中的方法生成测试数据,这些数据是二维的,可以用散点图绘制数据。
1234567 | from sklearn.datasets import *from matplotlib import pyplotfrom pandas import DataFrameimport mtutils as mtcolors = {0:'red', 1:'blue', 2:'green', 3:'yellow', 4:'purple'} |
|---|
生成代码:
12345678 | X, y = make_blobs(n_samples=2000, centers=4, n_features=2)# 散点图,按分类值着色df = DataFrame(dict(x=X:,0, y=X:,1, label=y))fig, ax = pyplot.subplots()grouped = df.groupby('label')for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colorskey)pyplot.show() |
|---|

生成代码:
12345678 | X, y = make_moons(n_samples=2000, noise=0.1)# 散点图,按分类值着色df = DataFrame(dict(x=X:,0, y=X:,1, label=y))fig, ax = pyplot.subplots()grouped = df.groupby('label')for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colorskey)pyplot.show() |
|---|

生成代码:
12345678 | X, y = make_circles(n_samples=2000, noise=0.05)# 散点图,按分类值着色df = DataFrame(dict(x=X:,0, y=X:,1, label=y))fig, ax = pyplot.subplots()grouped = df.groupby('label')for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colorskey)pyplot.show() |
|---|

生成代码:
12345678 | X, y = make_classification(2000, n_features=2, n_informative=2, n_redundant=0, n_classes=2, n_clusters_per_class=2)# 散点图,按分类值着色df = DataFrame(dict(x=X:,0, y=X:,1, label=y))fig, ax = pyplot.subplots()grouped = df.groupby('label')for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colorskey)pyplot.show() |
|---|

生成代码:
12345678 | X, y = make_gaussian_quantiles(mean=0,0, cov=5,5, n_samples=2000)# 散点图,按分类值着色df = DataFrame(dict(x=X:,0, y=X:,1, label=y))fig, ax = pyplot.subplots()grouped = df.groupby('label')for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colorskey)pyplot.show() |
|---|

1234567891011121314151617181920212223242526272829303132 | from sklearn.datasets import *from matplotlib import pyplotfrom pandas import DataFrameimport mtutils as mtdata = mt.pickle_load('blobs.pickle')colors = {0:'red', 1:'blue', 2:'green', 3:'yellow', 4:'purple', 5:'pink', 6:'black', 7:'yellow', 8:'black', 9:'yellow', 10:'black', 11:'purple'}from numpy import uniquefrom numpy import wherefrom sklearn.datasets import make_classificationfrom sklearn.cluster import AffinityPropagationfrom matplotlib import pyplot# 定义模型model = AffinityPropagation(damping=0.96)# 匹配模型X = data'data'cluster = model.fit(X)# 检索群集clusters = unique(cluster.labels_)print(clusters)# 散点图,按分类值着色df = DataFrame(dict(x=X:,0, y=X:,1, label=cluster.labels_))fig, ax = pyplot.subplots()grouped = df.groupby('label')for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colorskey)pyplot.show() |
|---|