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算法快速聚类数据,无需知道初始聚类数,而平均移到最终聚类分配。