聚类/clustering
聚类是一种无监督学习的方法,它将相似的数据集合成一组,而不同的数据则分组到不同的组中。聚类的目标是同一个类别中的数据点相互之间的相似性要高于不同类别中的数据点,不同类别之间的差异性要高于类内差异性。聚类一般分为两种:层次聚类和划分聚类。
层次聚类可以递归地构建出一个数据树,每个节点代表一个聚集,可以是单个数据点或者是一个包括其他聚集的聚集。当数据点被加入到聚集中时,聚集的“高度”会增加,最终形成聚类树。常见的层次聚类算法有:分层聚类法、平均连结法、单连接法、完全连接法等。
划分聚类则是将数据点划分到不同的类别中,不同的类别之间是互斥的,也就是说每个数据点只能属于一个类别。常见的划分聚类算法有:K 均值聚类、DBSCAN聚类、层次聚类等。
聚类的应用场景非常广泛,在数据挖掘、图像分析、生物信息学等领域都有着广泛的应用。
在Python中有许多用于聚类分析的库,比如scikit-learn、numpy等。下面以scikit-learn库为例,介绍如何用Python模拟聚类。
首先,我们需要获取数据。这里我们用sklearn自带的数据集iris,它包含了150个样本和4个特征。
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data # 特征
y = iris.target # 标签
接下来我们可以选择一种聚类算法,比如K均值聚类。在scikit-learn中,它通过KMeans
类实现。
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
这里我们设定聚类中心数为3,然后把数据X
输入到算法中进行聚类。得到的聚类结果可以通过labels_
属性获取。
print(kmeans.labels_)
输出结果为:
[1 2 2 2 1 1 2 1 2 2 1 1 2 2 1 1 1 1 1 1 1 1 1 2 1 1 1 1 1 2 2 1 1 2 1 1 1
1 2 1 1 2 2 1 1 1 1 2 1 2 1 2 1 1 1 2 2 2 1 1 1 1 2 1 1 1 1 1 0 0 0 2 0 0
0 2 0 2 0 0 2 0 2 2 0 2 0 2 0 0 2 0 0 2 2 0 0 2 2 2 0 2 2 2 0 2 2 0 2 2 2
2 0 0 2 0 2 0 0 0 2 2 0 0 0 2 2 0 0 0 2 0 0 0 2 2 0 0 0 2 0 0 0 2 0 0 0 2
2]
最后,我们可以通过可视化工具,比如matplotlib,将结果可视化。
import matplotlib.pyplot as plt
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.show()
这样,我们就完成了一个简单的聚类模拟。