详解 Scikit-learn 的 cluster.AffinityPropagation函数:亲和传播聚类算法

  • Post category:Python

Scikit-learn是一个流行的Python机器学习库。其中sklearn.cluster.AffinityPropagation函数可以用来进行聚类分析,它可以自动选择要聚类的集群数量,并且能根据输入数据自动调整聚类中心点。本文将详细介绍该函数的作用和使用方法,以及提供两个实例说明。

AffinityPropagation的作用

sklearn.cluster.AffinityPropagation函数是一种传递算法,用于非监督聚类分析。它可以根据输入数据自动选择要聚类的集群数量,并且能根据输入数据自动调整聚类中心点。它的工作原理是通过消息传递来聚类数据点。具体而言,它通过在数据点之间传递“相似性”信息来寻找聚类中心。例如,如果两个数据点很相似,则它们会相互吸引,使它们成为同一个集群的成员。如果两个数据点之间的相似性非常弱,则它们会相互排斥,从而使它们成为不同集群的成员。

AffinityPropagation的使用方法

首先,我们需要导入必要的库和数据。以iris数据集为例:

from sklearn.cluster import AffinityPropagation
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data

接下来,我们需要创建聚类模型:

model = AffinityPropagation()

如果需要设置模型参数,可以在创建模型时进行设置,例如:

model = AffinityPropagation(damping=0.8, preference=-50)

其中,damping参数用于控制消息传递的衰减速率(默认为0.5),preference参数用于控制吸引度的程度,即偏好(默认为np.median(X))。

然后,我们可以使用fit()函数对数据进行聚类:

model.fit(X)

聚类结果存储在labels_和cluster_centers_indices_属性中:

labels = model.labels_
centers = model.cluster_centers_indices_

最后,我们可以输出聚类结果:

for i in range(len(X)):
    print("Sample", i, "belongs to cluster", labels[i])

以下是一个完整的代码示例:

from sklearn.cluster import AffinityPropagation
from sklearn.datasets import load_iris

iris = load_iris()
X = iris.data
model = AffinityPropagation()
model.fit(X)
labels = model.labels_
centers = model.cluster_centers_indices_
for i in range(len(X)):
    print("Sample", i, "belongs to cluster", labels[i])

AffinityPropagation的实例1

假设我们有一些图像数据,希望按照它们的特征进行聚类。以下是一个简单的示例,演示了如何使用AffinityPropagation来聚类图像数据:

from sklearn.cluster import AffinityPropagation
from sklearn.datasets import fetch_olivetti_faces
import matplotlib.pyplot as plt

data = fetch_olivetti_faces().data
model = AffinityPropagation()
model.fit(data)
labels = model.labels_
n_clusters = len(set(labels))
print("Number of clusters:", n_clusters)
fig, axarr = plt.subplots(n_clusters, int(len(data) / n_clusters), figsize=(10, 10))
for cluster in range(n_clusters):
    counter = 0
    for i in range(len(data)):
        if labels[i] == cluster:
            axarr[cluster, counter].imshow(data[i].reshape(64, 64), cmap='gray')
            axarr[cluster, counter].axis('off')
            counter += 1
plt.show()

通过这个代码,我们可以按照图像中的特征将图像进行聚类,并通过可视化展示聚类的结果。

AffinityPropagation的实例2

假设我们有一些文本数据,希望按照它们的内容进行聚类。以下是一个简单的示例,演示了如何使用AffinityPropagation来聚类文本数据:

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import AffinityPropagation

documents = ["a bird in a cage is a sad thing",
             "a cat on a bed is a happy thing",
             "a dog in a yard is a happy thing",
             "a fish in a bowl is a sad thing"]

vectorizer = CountVectorizer()
counts = vectorizer.fit_transform(documents)
model = AffinityPropagation()
model.fit(counts.toarray())
labels = model.labels_
for i in range(len(documents)):
    print("Document", i, "belongs to cluster", labels[i])

在这个例子中,我们将文本数据转换为向量数据,并根据其内容进行聚类。通过这个代码,我们可以按照文本类型将文本数据进行聚类,并通过输出结果展示聚类结果。

总结:

本文介绍了Sklearn聚类算法之一的 AffinityPropagation函数的作用和用法,并提供了两个示例来说明其用途。 AffinityPropagation算法快速聚类数据,无需知道初始聚类数,而平均移到最终聚类分配。