目录
使用 Python 和 scikit-learn 进行聚类分析
机器学习中的无监督学习包括:聚类分析、关联规则、序列模式。
一、聚类分析
1、什么是聚类分析?
聚类分析是一种无监督学习技术,它旨在将数据点划分成一组具有相似特征的簇。换句话说,聚类分析可以帮助我们识别数据中的潜在群组,而不需要预先知道这些群组的标签或类别。聚类的目标是最大化同一簇内的相似性,并最小化不同簇之间的相似性。
聚类模型的核心是选择合适的距离度量和聚类算法。
模型及算法 | 作用 | 基本思想 | 优点 | 缺点 |
聚类算法 | 用于无监督学习 | 通过将数据集分成多个组别,使得组内的数据点相似度最高,组间的数据点相似度最低 | 能够发现数据集中的隐藏结构和模式,适用于大多数数据集 | 对初始聚类中心的选择和聚类算法的选择较为敏感,对异常值和噪声敏感 |
2、K-means算法
(1)基本思想
将数据集中的点分为 k 个簇(cluster),使得每个簇内的点尽可能相似,而不同簇之间的点尽可能不同。
(2)K-means算法的步骤
为了实现这个目标,k-MEANS 算法会反复执行以下步骤:
1、随机选择k个中心点。
2、计算每个数据点与每个中心点的距离,并将数据归类到距离它最近的中心点所属的簇。
3、更新每个簇的中心点,即将该簇内所有数据点的坐标取平均值。
4、重复步骤2和3,直到收敛(即中心点不在发生变化)。
(3)K-means算法包含的函数公式
计算两个数据点之间的距离:
,其中x1
和x2
分别是两个数据点的坐标。
计算一个数据点与簇中心之间的距离:
,其中x
是数据点,c
是簇中心。
计算簇中心:
,其中cp就是cluster_points
是簇内所有数据点的坐标列表。
该方法的优点是计算速度快,可用于样本量较大的数据,缺点是需要人为设定聚类的数量 K,且对极值敏感。另外,K-Means 不是一个最佳化的方法,因为起始的中心点是随机选择的,而起始中心点的选择不同,导致的结果也会不同。
3、DBSCAN
(1)基本思想
在空间中寻找密度较高且互相连通的区域,将这些区域划分为簇,并将其他密度较低的区域划分为噪声,DBSCAN 算法的主要特点是能够识别噪声并自动调整簇的大小。
(2)DBSCAN 算法的主要参数
eps: 指定邻域搜索的半径,即以该半径为半径的球形邻域内的点被认为是相邻点。
较小的 eps
值会使得算法更关注局部密度,可能导致更多的噪声被划分为簇;
较大的 eps
值会使得算法关注全局密度,可能导致较小的簇被忽略。
min_samples
:指定一个簇至少需要包含的点数。
较小的 min_samples
值会使得算法更倾向于识别较小的簇,但可能导致噪声被误判为簇; 较大的 min_samples
值会使得算法更倾向于识别较大的簇,但可能导致较小的簇被忽略。
(3)注意事项
1、选择合适的 eps
和 min_samples
参数;可以使用交叉验证等方法来选择最佳参数组合。
2、数据集中的点分布应尽量均匀,避免密集和稀疏区域的相邻。
3、对于高维数据,可以考虑使用多维数据降维方法(如主成分分析(PCA))来减少计算复杂度。
(4)需要满足条件
DBSCAN 算法生成的簇满足以下两个条件:
密度条件:一个点是否属于某个簇,取决于该点邻域内点的密度。如果邻域内点的密度大于或等于某个阈值(即 min_samples
/eps
),则该点属于一个簇;否则,该点被视为噪声。
连通性条件:一个簇内的所有点都相互连通,即它们之间的距离小于等于 eps
。
4、代码部分
使用 Python 和 scikit-learn 进行聚类分析
现在让我们来看一个聚类分析的示例,使用 Python 和 scikit-learn 库来实施。我们将使用 K-Means 聚类算法来对示例数据进行聚类。
安装依赖库
首先,确保你已经安装了必要的库。你可以使用以下命令来安装 scikit-learn:
pip install scikit-learn
示例代码
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# 创建模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=1.0, random_state=42)
# 使用 K-Means 聚类算法
kmeans = KMeans(n_clusters=4, random_state=42)
kmeans.fit(X)
# 获取簇中心点和簇标签
cluster_centers = kmeans.cluster_centers_
cluster_labels = kmeans.labels_
# 绘制数据点和簇中心点
plt.scatter(X[:, 0], X[:, 1], c=cluster_labels, cmap='viridis')
plt.scatter(cluster_centers[:, 0], cluster_centers[:, 1], c='red', marker='x', s=300)
plt.title("K-Means Clustering")
plt.show()
这段代码的关键步骤包括:
-
导入必要的库,包括 NumPy、Matplotlib、scikit-learn 的数据生成函数和 K-Means 聚类算法。
-
使用
make_blobs
函数创建一个模拟数据集,其中包含 300 个数据点,分为 4 个簇。 -
创建 K-Means 聚类模型,指定要分成 4 个簇,并使用
fit
方法将模型拟合到数据上。 -
获取簇中心点和簇标签。
-
绘制数据点以及簇中心点,以可视化聚类结果。
代码演示了如何使用 K-Means 聚类算法对数据进行聚类,并将聚类结果可视化出来。聚类分析是一个有用的工具,可以帮助我们理解和探索未标记数据中的潜在结构。