用Python模拟聚类/clustering

文章介绍了聚类作为无监督学习方法的基本概念,包括层次聚类和划分聚类两大类,以及K均值和DBSCAN等常见算法。通过Python的scikit-learn库展示了K均值聚类在iris数据集上的应用过程,包括数据获取、模型训练和结果可视化。
摘要由CSDN通过智能技术生成

聚类/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()

这样,我们就完成了一个简单的聚类模拟。

本程序是在python中完成,基于sklearn.cluster中的k-means聚类包来实现数据的聚类,对于里面使用的数据格式如下:(注意更改程序中的相关参数) 138 0 124 1 127 2 129 3 119 4 127 5 124 6 120 7 123 8 147 9 188 10 212 11 229 12 240 13 240 14 241 15 240 16 242 17 174 18 130 19 132 20 119 21 48 22 37 23 49 0 42 1 34 2 26 3 20 4 21 5 23 6 13 7 19 8 18 9 36 10 25 11 20 12 19 13 19 14 5 15 29 16 22 17 13 18 46 19 15 20 8 21 33 22 41 23 69 0 56 1 49 2 40 3 52 4 62 5 54 6 32 7 38 8 44 9 55 10 70 11 74 12 105 13 107 14 56 15 55 16 65 17 100 18 195 19 136 20 87 21 64 22 77 23 61 0 53 1 47 2 33 3 34 4 28 5 41 6 40 7 38 8 33 9 26 10 31 11 31 12 13 13 17 14 17 15 25 16 17 17 17 18 14 19 16 20 17 21 29 22 44 23 37 0 32 1 34 2 26 3 23 4 25 5 25 6 27 7 30 8 25 9 17 10 12 11 12 12 12 13 7 14 6 15 6 16 12 17 12 18 39 19 34 20 32 21 34 22 35 23 33 0 57 1 81 2 77 3 68 4 61 5 60 6 56 7 67 8 102 9 89 10 62 11 57 12 57 13 64 14 62 15 69 16 81 17 77 18 64 19 62 20 79 21 75 22 57 23 73 0 88 1 75 2 70 3 77 4 73 5 72 6 76 7 76 8 74 9 98 10 90 11 90 12 85 13 79 14 79 15 88 16 88 17 81 18 84 19 89 20 79 21 68 22 55 23 63 0 62 1 58 2 58 3 56 4 60 5 56 6 56 7 58 8 56 9 65 10 61 11 60 12 60 13 61 14 65 15 55 16 56 17 61 18 64 19 69 20 83 21 87 22 84 23 41 0 35 1 38 2 45 3 44 4 49 5 55 6 47 7 47 8 29 9 14 10 12 11 4 12 10 13 9 14 7 15 7 16 11 17 12 18 14 19 22 20 29 21 23 22 33 23 34 0 38 1 38 2 37 3 37 4 34 5 24 6 47 7 70 8 41 9 6 10 23 11 4 12 15 13 3 14 28 15 17 16 31 17 39 18 42 19 54 20 47 21 68 22
好的,让我们来实现 k-平均算法(k-means clustering)。 首先,我们需要导入必要的库: ```python import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs ``` 接下来,我们可以使用 `make_blobs` 函数生成一些模拟数据: ```python X, y = make_blobs(n_samples=200, centers=4, n_features=2, random_state=42) ``` 这会生成一个包含 200 个样本和 2 个特征的数据集,其中有 4 个不同的簇。现在,我们可以可视化这些数据: ```python plt.scatter(X[:, 0], X[:, 1]) plt.show() ``` 这会生成以下散点图: ![k-means-1.png](attachment:k-means-1.png) 现在我们来实现 k-平均算法。首先,我们需要初始化一些随机的簇中心。我们可以使用 `np.random.choice` 函数从数据集中选择一些随机的样本作为初始簇中心: ```python def initialize_centers(X, k): idx = np.random.choice(len(X), k, replace=False) centers = X[idx] return centers ``` 接下来,我们需要计算每个样本到每个簇中心的距离。这可以通过计算欧几里得距离来实现: ```python def compute_distances(X, centers): distances = np.zeros((len(X), len(centers))) for i, x in enumerate(X): for j, c in enumerate(centers): distances[i, j] = np.sqrt(np.sum((x - c) ** 2)) return distances ``` 现在,我们可以将每个样本分配到距离其最近的簇中心: ```python def assign_clusters(X, centers): distances = compute_distances(X, centers) clusters = np.argmin(distances, axis=1) return clusters ``` 接下来,我们需要更新每个簇的中心。这可以通过计算每个簇中所有样本的平均值来实现: ```python def update_centers(X, clusters, k): centers = np.zeros((k, X.shape[1])) for i in range(k): centers[i] = np.mean(X[clusters == i], axis=0) return centers ``` 最后,我们可以将所有这些步骤组合到一起,并迭代执行它们,直到簇中心不再变化或达到最大迭代次数为止: ```python def k_means(X, k, max_iter=100): centers = initialize_centers(X, k) for i in range(max_iter): old_centers = np.copy(centers) clusters = assign_clusters(X, centers) centers = update_centers(X, clusters, k) if np.allclose(centers, old_centers): break return clusters, centers ``` 现在,我们可以使用上面的 `k_means` 函数来对数据进行聚类,并可视化结果: ```python clusters, centers = k_means(X, k=4) plt.scatter(X[:, 0], X[:, 1], c=clusters) plt.scatter(centers[:, 0], centers[:, 1], marker='X', color='red', s=200) plt.show() ``` 这会生成以下散点图: ![k-means-2.png](attachment:k-means-2.png) 我们可以看到,k-平均算法成功地将数据分成了 4 个簇,并且簇中心位于每个簇的中心。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GeekyGuru

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值