
如何高效爬取全球新闻网站 – 整合Scrapy、Selenium与Mediastack API实现自动化新闻采集
首先,层次聚类是一种常用的聚类方法,用于将数据分成不同的组或簇。
这个方法的核心思想是:根据数据之间的相似度来构建一个“层次结构”,逐步将数据进行合并或拆分,直到得到最终的聚类结果。
下面,看看基本的步骤:
层次聚类主要分为两种类型:
层次聚类是一种无监督学习方法,其目的是根据数据点之间的相似性将数据划分成层次结构的簇。
距离度量:计算数据点之间的相似性,常用的度量有欧几里得距离、曼哈顿距离等。
对于两个数据点 和 ,欧几里得距离为:
其中, 是数据的维度。
簇之间的距离:常用的簇间距离度量方法有单链法、全链法、平均链法和中心点法等。
全链法(最大距离):
平均链法(平均距离):
中心点法(簇中心距离):
其中, 和 分别是簇 和 的中心点。
层次聚类的过程可以分为自底向上(凝聚层次聚类)和自顶向下(分裂层次聚类)两种。
下面,咱们主要介绍凝聚层次聚类的算法流程。
数学推理
为了保证层次聚类算法能够有效地进行,需要证明以下几点:
因此,新簇的距离不会比原来的最小距离更小。
通过以上数学推理和算法流程,层次聚类算法能够有效地将数据点分成层次结构的簇,可以帮助大家理解数据的内在结构和分布。
下面的案例,咱们使用一个真实的数据集,大家可以直接使用api获取。
使用来自 UCI 机器学习库的“葡萄酒数据集”(Wine Dataset),该数据集包含了 178 种葡萄酒的 13 个化学特征,目标是通过层次聚类来分析这些葡萄酒的分组情况。
我们将包括以下步骤:
1. 数据集导入和预处理
首先,我们需要导入数据集并做一定的预处理。
import pandas as pd
from sklearn.datasets import load_wine
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
import seaborn as sns
# 加载数据集
data = load_wine()
df = pd.DataFrame(data.data, columns=data.feature_names)
# 数据标准化
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)
2. 使用层次聚类进行聚类分析
我们使用 scipy
库中的 linkage
和 dendrogram
函数进行层次聚类分析,并绘制树状图。
from scipy.cluster.hierarchy import linkage, dendrogram
# 使用欧几里得距离和沃德方法进行层次聚类
Z = linkage(df_scaled, method='ward')
# 绘制树状图
plt.figure(figsize=(12, 8))
dendrogram(Z, labels=data.target, leaf_rotation=90, leaf_font_size=10)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.show()
3. 聚类结果的可视化
为了更好地理解聚类结果,我们可以将数据降维至二维,并用不同的颜色表示不同的簇。
from sklearn.decomposition import PCA
from scipy.cluster.hierarchy import fcluster
# 使用PCA将数据降维到二维
pca = PCA(n_components=2)
df_pca = pca.fit_transform(df_scaled)
# 从树状图中选择一个合适的阈值,划分簇
max_d = 7.0 # 这个阈值需要根据树状图手动调整
clusters = fcluster(Z, max_d, criterion='distance')
# 绘制二维降维后的聚类结果
plt.figure(figsize=(10, 8))
plt.scatter(df_pca[:, 0], df_pca[:, 1], c=clusters, cmap='rainbow', alpha=0.7)
plt.title('Hierarchical Clustering of Wine Dataset (2D PCA)')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.show()
4. 算法优化
我们可以通过调整距离度量方法、合并策略等来优化算法。这里我们展示如何使用不同的合并策略进行层次聚类。
# 使用不同的合并策略进行层次聚类
methods = ['single', 'complete', 'average', 'ward']
plt.figure(figsize=(20, 15))
for i, method in enumerate(methods, 1):
Z = linkage(df_scaled, method=method)
plt.subplot(2, 2, i)
dendrogram(Z, labels=data.target, leaf_rotation=90, leaf_font_size=10)
plt.title(f'Linkage Method: {method.capitalize()}')
plt.xlabel('Sample index')
plt.ylabel('Distance')
plt.tight_layout()
plt.show()
通过比较不同的合并策略的树状图,我们可以选择最适合当前数据集的策略。
总结如下:
整个的这些步骤展示了如何使用层次聚类进行数据分析,大家可以通过可视化和算法优化提升结果的理解和效果。
层次聚类模型的优缺点
优点
缺点
K均值聚类(K-means Clustering)
DBSCAN(Density-Based Spatial Clustering of Applications with Noise)
层次聚类的优选场景
层次聚类在处理中小规模且具有层次结构的数据集时非常有效,特别是当不确定簇的数量时。然而,在大规模数据集或具有复杂形状簇的情况下,其他算法如K均值聚类或DBSCAN可能更为适用。通过根据数据集的特性和具体需求选择合适的聚类算法,可以更好地实现数据聚类和分析目标。
本文章转载微信公众号@深夜努力写Python