当前位置: 首页 > news >正文

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

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

文章目录

  • 🍋聚类算法基础
  • 🍋K均值聚类算法
  • 🍋DBSCAN及其派生算法
  • 🍋AGNES(自底向上聚类)算法
  • 🍋聚类评估指标
  • 🍋示例完整代码(CoNLL-2003数据集)
  • 🍋总结

🍋聚类算法基础

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

🍋K均值聚类算法

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

  • 工作原理:

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

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敏感。

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连接。

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均值聚类,衡量簇内方差的总和。
from sklearn.metrics import silhouette_score# 计算轮廓系数
score = silhouette_score(X, labels)
print(f'Silhouette Score: {score}')

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

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识别图像中的物体轮廓。
  • 文本聚类:通过层次聚类对新闻或文档进行分组,形成主题集群。

请添加图片描述

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


http://www.mrgr.cn/news/67417.html

相关文章:

  • 华为HD集群重启NAMENODE实例操作步骤
  • Rust 构建 TCP/UDP 网络服务
  • 卫星授时服务器,单北斗授时服务器,北斗卫星时钟服务器
  • Unity网络开发基础(part5.网络协议)
  • python安装selenium,geckodriver,chromedriver
  • 总结 Java 线上问题的一般排查思路
  • 1.6K+ Star!Ichigo:一个开源的实时语音AI项目
  • 边缘计算的基本概念与实践
  • 探讨Mysql和Redis的数据实时同步方案
  • Java之随机点名器(4)
  • LeetCode题练习与总结:O(1) 时间插入、删除和获取随机元素--380
  • IO模块赋能污水处理
  • 【Git】Liunx环境下Git的使用:“克隆,提交,推送“
  • 基于Jeecgboot3.6.3vue3的flowable流程增加online表单的审批支持(一)整体思路
  • linux arm板启动时间同步服务
  • ATom:来自中央大学高分辨率气溶胶质谱仪(HR-AMS)的 L2 测量数据
  • 青少年编程与数学 02-003 Go语言网络编程 14课题、Go语言Udp编程
  • qt QMovie详解
  • 【Windows】轻松搞定网络问题!掌握`ipconfig`与`ping`命令的奥秘
  • 解锁炎症和肿瘤免疫治疗新靶点:TREM1&TREM2
  • 前端UniApp面试题及参考答案(100道题)
  • Java八股文
  • Python数据分析NumPy和pandas(二十五、数据整理--连接、合并和重塑 之二:数据连接合并操作)
  • 云数据中心基础环境-详细设计方案(364页WORD)
  • 什么是方法区(线程共享)?
  • 数据分析:16s扩增子网络分析之SparCC