python如何写层次聚类

python如何写层次聚类

Python如何写层次聚类?

使用Python进行层次聚类的步骤包括:导入必要的库、加载和标准化数据、计算距离矩阵、执行聚类、并可视化结果。 其中,计算距离矩阵是一个关键步骤,它决定了聚类的方式和效果。下面将详细描述如何使用Python进行层次聚类。

一、导入必要的库

在进行层次聚类之前,首先需要导入必要的Python库。这些库包括用于数据处理的Pandas、用于数值计算的NumPy、用于标准化数据的scikit-learn,以及用于聚类和可视化的SciPy和Matplotlib。

import pandas as pd

import numpy as np

from sklearn.preprocessing import StandardScaler

from scipy.cluster.hierarchy import dendrogram, linkage

import matplotlib.pyplot as plt

这些库提供了数据处理、计算和可视化所需的各种功能。

二、加载和标准化数据

层次聚类的下一步是加载数据并进行标准化。标准化可以确保每个特征在计算距离时具有相同的权重。

# 示例数据集

data = pd.DataFrame({

'Feature1': [1, 2, 3, 4, 5],

'Feature2': [5, 4, 3, 2, 1]

})

标准化数据

scaler = StandardScaler()

scaled_data = scaler.fit_transform(data)

在这个例子中,我们创建了一个简单的数据集,并使用StandardScaler对数据进行了标准化。

三、计算距离矩阵

接下来,计算数据点之间的距离矩阵。SciPy库中的linkage函数可以用于这一目的。

# 计算距离矩阵

Z = linkage(scaled_data, method='ward')

在这个例子中,我们使用了ward方法来计算距离矩阵。ward方法是层次聚类中常用的一种方法,它通过最小化每个簇内的方差来进行聚类。

四、执行聚类

有了距离矩阵之后,就可以执行层次聚类了。层次聚类的结果通常用树状图(dendrogram)来表示。

# 绘制树状图

plt.figure(figsize=(10, 7))

dendrogram(Z)

plt.show()

这段代码将绘制一个树状图,从中可以直观地看到数据点的聚类过程和结果。

五、分析聚类结果

通过树状图,可以确定数据点的聚类情况,并根据需要选择适当的聚类数目。例如,可以通过截断树状图来获得指定数量的簇。

from scipy.cluster.hierarchy import fcluster

获取簇标签

max_d = 7.08 # 截断距离

clusters = fcluster(Z, max_d, criterion='distance')

print(clusters)

在这个例子中,我们设置了一个截断距离max_d,并使用fcluster函数来获取每个数据点的簇标签。

六、应用层次聚类的实际案例

1、客户细分

层次聚类在客户细分中有广泛应用。通过将客户分成不同的群体,可以更有针对性地进行市场营销和客户服务。

# 示例数据集

data = pd.DataFrame({

'Age': [25, 34, 45, 52, 23, 35, 46, 51],

'Income': [50000, 60000, 80000, 110000, 48000, 59000, 81000, 104000]

})

标准化数据

scaler = StandardScaler()

scaled_data = scaler.fit_transform(data)

计算距离矩阵

Z = linkage(scaled_data, method='ward')

获取簇标签

max_d = 3

clusters = fcluster(Z, max_d, criterion='distance')

添加簇标签到原数据

data['Cluster'] = clusters

print(data)

在这个例子中,我们使用客户的年龄和收入数据进行了层次聚类,并将客户分成了不同的簇。

2、图像分割

层次聚类还可以用于图像分割,通过将像素分成不同的簇,可以实现图像的分割和识别。

from skimage import io

from sklearn.cluster import AgglomerativeClustering

读取图像

image = io.imread('path_to_image.jpg')

image_2d = image.reshape(-1, 3)

标准化数据

scaler = StandardScaler()

scaled_image_2d = scaler.fit_transform(image_2d)

进行层次聚类

clustering = AgglomerativeClustering(n_clusters=5)

clustering.fit(scaled_image_2d)

获取簇标签并重构图像

labels = clustering.labels_

segmented_image = labels.reshape(image.shape[0], image.shape[1])

plt.imshow(segmented_image, cmap='gray')

plt.show()

在这个例子中,我们使用了层次聚类对图像进行了分割,并将结果可视化。

七、层次聚类的优缺点

1、优点

  • 直观性强:通过树状图可以直观地观察聚类过程和结果。
  • 不需要预定义簇的数量:不同于K-means聚类,层次聚类不需要预先定义簇的数量。
  • 适用于小规模数据集:对于小规模数据集,层次聚类可以提供非常详细的聚类信息。

2、缺点

  • 计算复杂度高:层次聚类的计算复杂度较高,不适合大规模数据集。
  • 对噪声和离群点敏感:层次聚类对数据中的噪声和离群点比较敏感,可能会影响聚类结果。
  • 聚类结果不可逆:一旦两个簇合并,就无法再拆分,可能会影响最终的聚类结果。

八、代码优化和性能提升

在处理大规模数据集时,可以通过以下方法优化代码和提升性能:

1、使用稀疏矩阵

对于大规模稀疏数据集,可以使用稀疏矩阵来减少内存消耗和计算时间。

from scipy.sparse import csr_matrix

示例稀疏数据集

data = csr_matrix([

[1, 0, 0, 1],

[0, 1, 1, 0],

[1, 1, 0, 0],

[0, 0, 1, 1]

])

计算距离矩阵

Z = linkage(data.toarray(), method='ward')

2、并行计算

对于计算密集型任务,可以使用并行计算来提升性能。例如,可以使用Joblib库来并行计算距离矩阵。

from joblib import Parallel, delayed

from scipy.spatial.distance import pdist, squareform

计算距离矩阵(并行计算)

distance_matrix = squareform(Parallel(n_jobs=-1)(delayed(pdist)(data) for _ in range(data.shape[0])))

Z = linkage(distance_matrix, method='ward')

九、总结

使用Python进行层次聚类涉及多个步骤:导入必要的库、加载和标准化数据、计算距离矩阵、执行聚类和可视化结果。通过具体的实际案例,如客户细分和图像分割,可以看到层次聚类在不同领域的应用。此外,了解层次聚类的优缺点和代码优化方法,可以帮助我们更好地使用这一技术。

无论是使用研发项目管理系统PingCode,还是通用项目管理软件Worktile,都可以帮助团队更高效地管理和执行数据分析项目,提高项目的成功率和效率。

相关问答FAQs:

Q: 我该如何使用Python编写层次聚类算法?

Q: Python中有哪些库可以帮助我实现层次聚类算法?

Q: 层次聚类算法的原理是什么?如何在Python中应用它?

原创文章,作者:Edit1,如若转载,请注明出处:https://docs.pingcode.com/baike/886758

(0)
Edit1Edit1
上一篇 2024年8月26日 下午1:44
下一篇 2024年8月26日 下午1:44
免费注册
电话联系

4008001024

微信咨询
微信咨询
返回顶部