用python实现聚类分析

文章目录

一、简介

这里较为详细介绍了聚类分析的各种算法和评价指标,本文将简单介绍如何用python里的库实现它们。

二、k-means算法

和其它机器学习算法一样,实现聚类分析也可以调用 sklearn中的接口。

from sklearn.cluster import KMeans

2.1 模型参数

KMeans(

    n_clusters=8,

    *,

    init='k-means++',

    n_init=10,

    max_iter=300,

    tol=0.0001,

    precompute_distances='deprecated',

    verbose=0,

    random_state=None,

    copy_x=True,

    n_jobs='deprecated',

    algorithm='auto',
)

2.2 常用模型方法

  • fit(X)——对数据X进行聚类
  • predict(X)——对新数据X进行类别的预测
  • cluster_centers_——获取聚类中心
  • labels_——获取训练数据所属的类别,比设置的聚类中心个数少1
  • inertia_——获取每个点到聚类中心的距离和
  • fit_predict(X)——先对X进行训练并预测X中每个实例的类,等于先调用fit(X)后调用predict(X),返回X的每个类
  • transform(X)——将X进行转换,转换为K列的矩阵,其中每行为一个实例,每个实例包含K个数值(K为传入的类数量),第i列为这个实例到第K个聚类中心的距离
  • fit_transform(X)——先进行fit之后进行transform
  • score(X)——输入样本(这里的样本不是训练样本,而是其他传入的测试样本)到他们的类中心距离和,然后取负数

2.3 实际例子


from sklearn.datasets import make_blobs

X, y = make_blobs(random_state=1)

Kmeans = KMeans(n_clusters=3)

Kmeans.fit(X)

2.3.1 获取聚类中心:

Kmeans.cluster_centers_

输出

array([[ -1.4710815 ,   4.33721882],
       [ -6.58196786,  -8.17239339],
       [-10.04935243,  -3.85954095]])

2.3.2 获取类别

Kmeans.labels_

输出:我们设置了3个聚类中心,所以输出3个类别。

array([0, 2, 2, 2, 1, 1, 1, 2, 0, 0, 2, 2, 1, 0, 1, 1, 1, 0, 2, 2, 1, 2,
       1, 0, 2, 1, 1, 0, 0, 1, 0, 0, 1, 0, 2, 1, 2, 2, 2, 1, 1, 2, 0, 2,
       2, 1, 0, 0, 0, 0, 2, 1, 1, 1, 0, 1, 2, 2, 0, 0, 2, 1, 1, 2, 2, 1,
       0, 1, 0, 2, 2, 2, 1, 0, 0, 2, 1, 1, 0, 2, 0, 2, 2, 1, 0, 0, 0, 0,
       2, 0, 1, 0, 0, 2, 2, 1, 1, 0, 1, 0], dtype=int32)

2.3.3 获取每个点到聚类中心的距离和

Kmeans.inertia_

输出

156.28289251170003

三、mini batch k-means算法

mini batch k-means的用法和k-means类似。

from sklearn.cluster import MiniBatchKMeans

3.1 模型参数

MiniBatchKMeans(
    n_clusters=8,
    *,
    init='k-means++',
    max_iter=100,

    batch_size=100,
    verbose=0,

    compute_labels=True,
    random_state=None,
    tol=0.0,

    max_no_improvement=10,

    init_size=None,

    n_init=3,

    reassignment_ratio=0.01,
)

四、层次聚类算法

同样使用sklearn接口

from sklearn.cluster import AgglomerativeClustering

4.1 模型参数

AgglomerativeClustering(

    n_clusters=2,
    *,

    affinity='euclidean',

    memory=None,
    connectivity=None,

    compute_full_tree='auto',

    linkage='ward',

    distance_threshold=None,

    compute_distances=False,
)

4.2 模型常用方法

  • fit(X)——对数据X进行聚类
  • labels_——获取训练数据所属的类别,比设置的聚类中心个数少1
  • n_leaves_——层次树中的叶子数
  • children_——一个大小为[n_samples-1,2]的数组,给出了每个非叶结点中的子节点数量
  • fit_predict(X)——先对X进行训练并预测X中每个实例的类,等于先调用fit(X)后调用predict(X),返回X的每个类,该模型不能对新的数据点进行预测
  • n_components_——一个整数,给出了连接图中的连通分量的估计

4.3 实际例子

from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs

X, y = make_blobs(random_state=1)
agg = AgglomerativeClustering(n_clusters=3)
agg.fit_predict(X)

输出:对数据训练并预测

array([0, 2, 2, 2, 1, 1, 1, 2, 0, 0, 2, 2, 1, 0, 1, 1, 1, 0, 2, 2, 1, 2,
       1, 0, 2, 1, 1, 0, 0, 1, 0, 0, 1, 0, 2, 1, 2, 2, 2, 1, 1, 2, 0, 2,
       2, 1, 0, 0, 0, 0, 2, 1, 1, 1, 0, 1, 2, 2, 0, 0, 2, 1, 1, 2, 2, 1,
       0, 1, 0, 2, 2, 2, 1, 0, 0, 2, 1, 1, 0, 2, 0, 2, 2, 1, 0, 0, 0, 0,
       2, 0, 1, 0, 0, 2, 2, 1, 1, 0, 1, 0])

4.3.1 获取层次树中的叶子数

agg.n_leaves_

输出

100

4.3.2 获取每个非叶结点中的子节点数量

agg.children_

输出

array([[ 33,  68],
       [ 35,  39],
       [ 18,  21],
       [ 30,  92],
       [ 54,  58],
       [ 49, 100],
       [ 26,  55],
       [ 23,  27],
       [ 20,  45],
       [  3,  82],
       [  1,  71],
       [ 16,  52],
       [ 24,  38],
       [ 22,  77],
       [  9,  59],
       [ 44,  69],
       [ 40, 106],
       [ 15,  90],
       [ 36,  94],
       [ 53,  61],
       [ 72, 108],
       [ 37,  43],
       [ 17,  78],
       [ 60,  70],
       [ 50, 102],
       [ 76,  98],
       [107, 114],
       [ 56,  93],
       [  7, 110],
       [ 63, 112],
       [  8,  66],
       [ 11, 109],
       [ 42,  84],
       [  5,   6],
       [ 19, 121],
       [ 97, 104],
       [ 91, 105],
       [ 79,  88],
       [ 46,  73],
       [113, 116],
       [ 89, 132],
       [ 85,  87],
       [ 10,  41],
       [ 29,  51],
       [ 12,  96],
       [ 34, 118],
       [ 32, 144],
       [115, 123],
       [ 31,  48],
       [ 62, 125],
       [ 13, 130],
       [ 81, 134],
       [103, 135],
       [  0,  28],
       [ 75, 142],
       [120, 133],
       [ 65, 117],
       [ 47,  99],
       [127, 137],
       [101, 139],
       [122, 136],
       [ 74, 138],
       [140, 148],
       [ 80, 161],
       [111, 119],
       [155, 156],
       [124, 129],
       [131, 147],
       [ 64, 151],
       [141, 157],
       [ 83,  95],
       [143, 146],
       [  2, 168],
       [ 67, 164],
       [149, 170],
       [ 86, 150],
       [  4,  14],
       [128, 154],
       [158, 167],
       [ 25, 171],
       [159, 165],
       [160, 162],
       [153, 169],
       [ 57, 145],
       [126, 152],
       [163, 184],
       [166, 177],
       [173, 180],
       [178, 183],
       [175, 185],
       [174, 187],
       [176, 179],
       [172, 188],
       [181, 189],
       [186, 192],
       [190, 191],
       [182, 193],
       [194, 195],
       [196, 197]])

4.3.3 可视化

目前 scikit-learn 没有绘制树状图的功能,但可以利用 SciPy轻松生成树状图。 SciPy的聚类算法接口与 scikit-learn 的聚类算法稍有不同。 SciPy提供了一个函数,接受数据数组 X并计算出一个链接数组(linkage array),它对层次聚类的相似度进行编码。然后我们可以将这个链接数组提供给 scipydendrogram 函数来绘制树状图。


from scipy.cluster.hierarchy import dendrogram, ward
X, y = make_blobs(random_state=0, n_samples=12)

linkage_array = ward(X)

dendrogram(linkage_array)

ax = plt.gca()
bounds = ax.get_xbound()
ax.plot(bounds, [7.25, 7.25], '--', c='k')
ax.plot(bounds, [4, 4], '--', c='k')

ax.text(bounds[1], 7.25, ' two clusters', va='center', fontdict={'size': 15})
ax.text(bounds[1], 4, ' three clusters', va='center', fontdict={'size': 15})
plt.xlabel("Sample index")
plt.ylabel("Cluster distance")

输出

用python实现聚类分析

五、DBSCN算法

from sklearn.cluster import DBSCAN

5.1 模型参数

DBSCAN(

    eps=0.5,
    *,

    min_samples=5,

    metric='euclidean',
    metric_params=None,

    algorithm='auto',

    leaf_size=30,
    p=None,
    n_jobs=None,
)

5.2 模型常用方法

  • fit(X)——对数据X进行聚类
  • labels_——获取训练数据所属的类别,噪声点为-1
  • fit_predict(X)——先对X进行训练并预测X中每个实例的类,等于先调用fit(X)后调用predict(X),返回X的每个类,该模型不能对新的数据点进行预测

六、聚类指标

6.1 RI 与 ARI


from sklearn.metrics.cluster import rand_score

from sklearn.metrics.cluster import adjusted_rand_score

6.1.1 模型参数

rand_score(labels_true, labels_pred)
adjusted_rand_score(labels_true, labels_pred)

6.1.2 示例

rand_score([0, 0, 1, 1], [1, 1, 0, 0])
adjusted_rand_score([0, 0, 1, 1], [1, 1, 0, 0])

输出

1.0
1.0

6.2 NMI

from sklearn.metrics.cluster import normalized_mutual_info_score

6.2.1 模型参数

normalized_mutual_info_score(
    labels_true,
    labels_pred,
    *,
    average_method='arithmetic',
)

6.2.2 示例

normalized_mutual_info_score([0, 0, 1, 1], [1, 1, 0, 0])

输出

1.0

6.3 Jaccard系数

from sklearn.metrics import jaccard_score

6.3.1 模型参数

jaccard_score(
    y_true,
    y_pred,
    *,
    labels=None,
    pos_label=1,
    average='binary',
    sample_weight=None,
    zero_division='warn',
)

6.3.2 示例

jaccard_score([0, 0, 1, 1], [0, 0, 1, 1])
jaccard_score([0, 0, 1, 1], [1, 1, 0, 0])

输出:在使用前,需要转化为相同的类别标识

1.0
0.0

6.4 轮廓系数

from sklearn.metrics.cluster import silhouette_score

6.4.1 模型参数

silhouette_score(
    X,
    labels,
    *,
    metric='euclidean',

    sample_size=None,
    random_state=None,
    **kwds,
)

6.4.2 示例

silhouette_score(X, agg.labels_)

输出agg.labels_为用 AgglomerativeClustering算法对数据集 X进行的聚类

0.5811444237627902

6.5 CH指标

from sklearn.metrics.cluster import calinski_harabasz_score

6.5.1 模型参数

calinski_harabasz_score(X, labels)

6.5.2 示例

calinski_harabasz_score(X, agg.labels_)

输出

26.268277404270318

Original: https://blog.csdn.net/TSzero/article/details/116265151
Author: 诡秘愚者
Title: 用python实现聚类分析

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/549404/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球