【机器学习】聚类算法分类与探讨

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互相学习和建立一个积极的社区。谢谢你的光临,让我们一起踏上这个知识之旅!

文章目录

🍋聚类算法基础

  • 定义及重要性:聚类是一种无监督的机器学习方法,旨在将数据集划分为若干簇,使得同一簇内的数据点相似度高,不同簇之间的数据点差异大。聚类在客户分群、图像分割、文本分类和生物信息学等领域有广泛应用。
  • 聚类算法的种类
    • 划分式算法(如K均值):基于数据点之间的距离,直接将数据划分为若干簇。
    • 密度式算法(如DBSCAN):根据数据密度分布,将密度较高的区域识别为簇。
    • 层次式算法(如AGNES):通过层次结构进行聚类,可以生成树状的层次结构。
    • 网格式算法:将空间划分为网格,以网格为单位进行聚类(如CLIQUE算法)。

🍋K均值聚类算法

  • 概述:K均值是一种基于划分的方法。首先选择K个初始质心,然后通过迭代优化,将每个数据点分配到距离最近的质心,更新质心位置,直到收敛。其目标是最小化簇内的方差。

  • 工作原理:

    • 选择K个初始质心。
    • 计算每个数据点与质心的距离,将数据点分配到最近的质心所在的簇中。
    • 更新每个簇的质心,重新计算每个簇的平均值。
    • 重复步骤2和3,直到质心位置不再变化或达到最大迭代次数。
  • 优缺点:K均值在处理大规模数据时效率高,但其对初始质心的选择敏感,可能陷入局部最优;另外,K的值需要提前确定。

python 复制代码
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np

# 生成一些示例数据
X = np.random.rand(100, 2)

# 初始化K均值模型
kmeans = KMeans(n_clusters=3, random_state=42)
kmeans.fit(X)

# 获取聚类结果
labels = kmeans.labels_

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red', marker='X')
plt.title("K-Means Clustering")
plt.show()

扩展:可进一步介绍K均值++初始化方法(K-means++),通过优化初始质心选择来提高收敛性和结果质量。

🍋DBSCAN及其派生算法

  • 概述:DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一种基于密度的聚类算法,通过定义邻域半径(eps)和最小样本数(min_samples)来识别簇。密度足够高的区域被识别为簇,而密度不足的点则被视为噪声。

  • 工作原理

    • 对于每个点,如果在其邻域半径内的点数超过min_samples,则将其标记为核心点。
    • 将核心点的邻域扩展为一个簇,将所有能够通过密度连接的点归入此簇。
    • 重复此过程,直到所有点都被分配到某个簇或标记为噪声。
  • 优缺点:DBSCAN能够识别任意形状的簇,适合含有噪声的数据集,但对参数eps和min_samples敏感。

python 复制代码
from sklearn.cluster import DBSCAN
import matplotlib.pyplot as plt
import numpy as np

# 生成一些示例数据
X = np.random.rand(100, 2)

# 初始化DBSCAN模型
dbscan = DBSCAN(eps=0.1, min_samples=5)
dbscan.fit(X)

# 获取聚类结果
labels = dbscan.labels_

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels)
plt.title("DBSCAN Clustering")
plt.show()

派生算法:可介绍HDBSCAN(基于密度的层次聚类算法),它能在不同密度下自动调节,适用于密度变化较大的数据集。

🍋AGNES(自底向上聚类)算法

  • 概述:AGNES(Agglomerative Nesting)是一种层次聚类算法,通过自底向上合并每个样本或簇,构建树状的层次结构。它不需要提前设定簇的数量。

  • 工作原理

    • 将每个数据点视为一个独立的簇。
    • 计算每对簇之间的距离,合并最近的两个簇。
    • 重复步骤2,直到只剩下一个簇,或者达到预设的簇数。
  • 连接方法:可以采用不同的连接方法,包括单连接(Single Linkage)、全连接(Complete Linkage)、平均连接(Average Linkage)和Ward连接。

python 复制代码
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
import numpy as np

# 生成一些示例数据
X = np.random.rand(10, 2)

# 使用AGNES(层次聚类)
Z = linkage(X, method='ward')

# 可视化层次聚类的树状图
plt.figure(figsize=(10, 5))
dendrogram(Z)
plt.title("AGNES Hierarchical Clustering Dendrogram")
plt.show()

扩展:还可以介绍如何确定层次聚类的最佳分割点,比如通过树状图的"拐点"或使用轮廓系数评估分割效果。

🍋聚类评估指标

常用指标:

  • 轮廓系数(Silhouette Score):衡量簇内一致性和簇间分离度的指标,范围为-1到1,值越大越好。
  • DBI指数(Davies-Bouldin Index):计算每个簇的离散性和簇间的相似性,值越小聚类效果越好。
  • SSE(Sum of Squared Errors):用于K均值聚类,衡量簇内方差的总和。
python 复制代码
from sklearn.metrics import silhouette_score

# 计算轮廓系数
score = silhouette_score(X, labels)
print(f'Silhouette Score: {score}')

🍋示例完整代码(CoNLL-2003数据集)

python 复制代码
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans, DBSCAN, AgglomerativeClustering
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import silhouette_score
from nltk.corpus import conll2003
from nltk import download

# 下载 CoNLL-2003 数据集
download('conll2003')

# 提取 CoNLL-2003 数据集
def load_conll_data():
    sentences = []
    for sentence in conll2003.iob_sents():
        words = [word for word, _, _ in sentence]
        sentences.append(" ".join(words))
    return sentences

# 特征提取
def extract_features(texts):
    vectorizer = TfidfVectorizer(stop_words='english')
    return vectorizer.fit_transform(texts)

# 聚类评估
def evaluate_clustering(model, X):
    labels = model.labels_ if hasattr(model, 'labels_') else model.predict(X)
    return silhouette_score(X, labels)

# 加载数据
texts = load_conll_data()

# 提取特征
X = extract_features(texts)

# 初始化不同的聚类算法
kmeans = KMeans(n_clusters=5, random_state=42)
dbscan = DBSCAN(eps=0.5, min_samples=5)
agg_clustering = AgglomerativeClustering(n_clusters=5)

# 聚类模型训练
kmeans.fit(X)
dbscan.fit(X)
agg_clustering.fit(X)

# 聚类评估
kmeans_score = evaluate_clustering(kmeans, X)
dbscan_score = evaluate_clustering(dbscan, X)
agg_score = evaluate_clustering(agg_clustering, X)

# 输出评估结果
print(f"K-means Silhouette Score: {kmeans_score:.4f}")
print(f"DBSCAN Silhouette Score: {dbscan_score:.4f}")
print(f"Agglomerative Clustering Silhouette Score: {agg_score:.4f}")
  • CoNLL-2003 数据集:我们通过 nltk.corpus.conll2003 来加载 CoNLL-2003 数据集。每个句子的词语通过 iob_sents() 提取并合并成文本形式。
  • 特征提取:我们使用 TfidfVectorizer 将文本转换为 TF-IDF 特征表示,移除英文停用词。
  • 聚类算法:我们使用三种不同的聚类算法:
    • K-means:我们指定 n_clusters=5(你可以根据需要调整)。
    • DBSCAN:这里我们指定了 eps=0.5 和 min_samples=5,这两个参数可以调节以优化聚类效果。
    • 层次聚类:使用 AgglomerativeClustering 进行层次聚类,并设置 n_clusters=5。
  • 评估:使用 轮廓系数(Silhouette Score)来评估聚类效果。轮廓系数越接近 1 表示聚类效果越好,接近 -1 表示聚类效果差。

🍋总结

如何选择合适的聚类算法:

  • 对于大规模、结构简单的数据集,K均值可能更合适。
  • 含有噪声或非凸形状的数据集,DBSCAN表现较好。
  • 层次结构明显或需要层次划分的数据,可以选择AGNES。

实际应用场景:

  • 客户分群:使用K均值或层次聚类对客户数据进行分类,提供个性化服务。
  • 图像分割:利用DBSCAN识别图像中的物体轮廓。
  • 文本聚类:通过层次聚类对新闻或文档进行分组,形成主题集群。

挑战与创造都是很痛苦的,但是很充实。

相关推荐
guoji77888 分钟前
安全与对齐的深层博弈:Gemini 3.1 Pro 安全护栏与对抗测试深度拆解
人工智能·安全
实在智能RPA16 分钟前
实在 Agent 和通用大模型有什么不一样?深度拆解 AI Agent 的感知、决策与执行逻辑
人工智能·ai
独隅21 分钟前
PyTorch 模型部署的 Docker 配置与性能调优深入指南
人工智能·pytorch·docker
lihuayong28 分钟前
OpenClaw 系统提示词
人工智能·prompt·提示词·openclaw
Wilber的技术分享32 分钟前
【LeetCode高频手撕题 2】面试中常见的手撕算法题(小红书)
笔记·算法·leetcode·面试
邪神与厨二病35 分钟前
Problem L. ZZUPC
c++·数学·算法·前缀和
黑客说42 分钟前
AI驱动剧情,解锁无限可能——AI游戏发展解析
人工智能·游戏
踩着两条虫1 小时前
AI驱动的Vue3应用开发平台深入探究(十):物料系统之内置组件库
android·前端·vue.js·人工智能·低代码·系统架构·rxjava
小仙女的小稀罕1 小时前
听不清重要会议录音急疯?这款常见AI工具听脑AI精准转译
开发语言·人工智能·python