使用 SciPy 的聚类方法


聚类是机器学习和数据科学中的一种技术,它涉及将相似的数据点或对象分组到聚类或子集中。聚类的目标是在数据中找到可能不明显的模式和结构,并将相关数据点分组在一起,以便进行进一步分析。在本文中,我们将了解如何借助 SciPy 库来实现聚类。

SciPy 为我们提供了各种科学计算工具来执行数值积分、优化、线性代数、信号处理等任务。它被研究人员、科学家、工程师和数据分析师用来在他们的工作中执行复杂的计算和分析。它建立在 NumPy 之上,并包含一个用于聚类的子模块。

一些可以使用 SciPy 实现的聚类算法包括:

  • K-Means − 这里目标是将数据集划分为 k 个聚类,其中 k 是一个固定数字,每个数据点都属于其均值(或质心)最接近的聚类。

  • 层次聚类 − 这里我们创建一个聚类的层次结构,可以表示为树状图。它们进一步分为两种类型:凝聚聚类和分裂聚类。

每种方法都有其自身的优点和缺点,选择哪种方法取决于数据的特性和聚类的目标。scikit-learn 库也提供了聚类算法,具有更高级的功能,如高斯混合模型、贝叶斯高斯混合模型等。

使用 SciPy 的 K-Means 聚类

K-Means 算法的工作原理是首先将 k 个质心随机分配到数据集,然后迭代地将数据点重新分配到最近的质心,并根据新的聚类更新质心。重复此过程,直到聚类收敛或达到最大迭代次数。SciPy 库在 scipy.cluster.vq 模块中提供了 k-means 算法的实现。

使用的 dataset (kmeans_dataset.csv) 可以在此处获得。

示例

import pandas as pd
df = pd.read_csv("kmeans_dataset.csv")
X = df.values
from scipy.cluster.vq import kmeans,vq

# number of clusters
k = 4

# compute k-means clustering
centroids,_ = kmeans(X,k)

# a cluster for each data point
clusters,_ = vq(X,centroids)

# Plotting the data points in the clusters
import matplotlib.pyplot as plt
colors = ['r','g','b','y']
for i in range(k):
   # select only data observations with cluster label == i
   ds = X[np.where(clusters==i)]
   # plot the data observations
   plt.scatter(ds[:,0],ds[:,1],c=colors[i])
   # plot the centroids
   plt.scatter(centroids[i,0],centroids[i,1],marker='x',s=200, c='black')
plt.show()

输出

上述代码将数据点分组为 4 个聚类,并根据其聚类分配用不同的颜色绘制数据点。聚类质心用“x”标记表示。

可以调整聚类数量以适应您的数据和问题。

在本例中,我使用了上面给出的链接中的数据集,然后使用 k-means 算法进行聚类并可视化结果。

请记住,k-means 算法对初始条件敏感,因此如果使用不同的初始质心多次运行它,结果可能会有所不同。

使用 SciPy 的层次聚类

层次聚类是一种聚类方法,它创建聚类的层次结构,其中每个聚类都是前一个聚类的子集。层次结构表示为树状结构,称为树状图。这是一种强大的方法,用于探索和可视化大型数据集的结构。尽管如此,对于大型数据集来说,它在计算上可能代价高昂,并且对所使用的链接方法敏感。

示例

from scipy.cluster.hierarchy import linkage, dendrogram, cut_tree

# sample data points
data = [[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]]

# create linkage matrix
Z = linkage(data, method='ward')

# create dendrogram
dendrogram(Z)

# cut the dendrogram at a threshold to obtain clusters
clusters = cut_tree(Z, height=2)

import matplotlib.pyplot as plt
plt.figure()
dendrogram(Z, labels = ["data1","data2","data3","data4","data5","data6"])
plt.show()

输出

上述代码将使用链接方法“ward”将数据点分组到聚类中,该方法最大程度地减少了被链接的聚类之间距离的方差。dendrogram 函数用于绘制树状图,它是层次聚类解决方案的可视化。cut_tree 函数用于在给定阈值处从树状图中提取聚类。cut_tree 函数的输出是每个数据点的聚类标签列表。也可以使用 matplotlib 库可视化树状图并自定义外观,例如线条、标签等的颜色和大小。

结论

SciPy 并非适用于所有类型的聚类,但它可以高效地执行 k-means 和层次聚类。SciPy 的 k-means 算法是一种简单有效的方法,用于将数据集划分为固定数量的聚类。层次聚类是一种创建聚类层次结构的方法,其中每个聚类都是前一个聚类的子集。像 DBSCAN 这样广泛使用的算法无法使用 SciPy 实现。

因此,如果您正在寻找各种聚类算法,并内置支持预处理、评估和更多灵活性,那么 scikit-learn 是最佳选择。

更新于: 2023年10月4日

142 次查看

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告