KMeans、DBSCAN聚类与TF-IDF文本特征提取

在机器学习领域,聚类算法是无监督学习的核心应用,而文本特征提取则是自然语言处理的基础步骤。本文将结合实战代码,详细拆解KMeans、DBSCAN两种经典聚类算法及TF-IDF文本特征提取方法,帮你快速掌握核心原理与落地技巧。

一、KMeans聚类:基于距离的经典聚类算法

1.1 核心原理

KMeans是一种基于距离的聚类算法,核心思想是通过预设聚类数量K,将数据划分为K个簇,使得每个簇内样本的相似度最高(距离最近),簇间样本的相似度最低(距离最远)。算法流程可概括为:

  • 随机初始化K个聚类中心;

  • 计算每个样本到各聚类中心的距离,将样本归入最近的簇;

  • 重新计算每个簇的均值作为新的聚类中心;

  • 重复步骤2-3,直到聚类中心稳定或达到最大迭代次数。

聚类效果评价方式:

1.2 实战代码:聚类效果评估与可视化

下面以实际数据集为例,实现KMeans聚类,并通过轮廓系数评估聚类效果,绘制聚类数与轮廓系数的关系折线图,辅助选择最优K值。以之前寝室分配的数据集为例:

python 复制代码
data = np.loadtxt("datingTestSet2.txt")
x = data[:, :-1]
score = []
# 定义要测试的聚类数量列表
n_clusters_list = [2,3,4,5,6,7,8,9,10]

# 2. 遍历不同聚类数,计算轮廓系数(添加random_state保证结果可复现)
for i in n_clusters_list:
    # 固定random_state,避免每次运行结果不一致
    labels = KMeans(n_clusters=i, random_state=42).fit(x).labels_
    # 计算轮廓系数并添加到列表
    silhouette_score = metrics.silhouette_score(x, labels)
    score.append(silhouette_score)

# 3. 打印轮廓系数结果(方便查看数值)
print("各聚类数对应的轮廓系数:")
#zip([a,b,c], [1,2,3]) 会变成 (a,1)、(b,2)、(c,3),方便同时遍历多个列表
for cluster_num, s_score in zip(n_clusters_list, score):
    print(f"聚类数 {cluster_num}: {s_score:.4f}")

# 4. 绘制折线图
plt.rcParams['font.sans-serif'] = ['SimHei']  # 解决中文显示问题
plt.rcParams['axes.unicode_minus'] = False    # 解决负号显示问题

# 创建画布
plt.figure(figsize=(10, 6))
# 绘制折线图,添加标记点更易查看
plt.plot(n_clusters_list, score, marker='o', linestyle='-', color='b', linewidth=2, markersize=8)

# 添加图表标题和坐标轴标签
plt.title('K-Means聚类数与轮廓系数关系', fontsize=14)
plt.xlabel('聚类数(K值)', fontsize=12)
plt.ylabel('轮廓系数', fontsize=12)

# 添加网格线,方便读取数值
plt.grid(True, alpha=0.3)

# 标注最大值点(可选,直观看到最优K值)
max_score_idx = np.argmax(score)
max_k = n_clusters_list[max_score_idx]
max_s = score[max_score_idx]
plt.annotate(f'最优K值:{max_k}\n系数:{max_s:.4f}',
             xy=(max_k, max_s),
             xytext=(max_k+0.5, max_s-0.05),
             arrowprops=dict(arrowstyle='->', color='red'))

# 显示图表
plt.show()
复制代码
运行结果:

1.3 核心要点解读

  • labels_属性:KMeans模型训练后生成的核心属性,存储每个样本的聚类标签(整数),标签从0开始,对应不同的簇。

  • zip函数:用于将"聚类数列表"与"轮廓系数列表"配对遍历,实现聚类数与对应分数的一一对应输出,简化代码逻辑。

  • 最优K值选择:通过轮廓系数折线图及标注功能,可快速定位最优聚类数,避免盲目设置K值。

  • random_state参数:固定随机种子,确保每次运行模型的聚类结果一致,便于调试和复现。

二、DBSCAN聚类:基于密度的智能聚类算法

KMeans需预设聚类数,且对非球形簇效果较差,而DBSCAN(基于密度的带噪声应用空间聚类)可解决这些问题,无需预设簇数,能识别任意形状的簇和噪声点。

2.1 核心原理与关键概念

DBSCAN基于"密度"划分簇,核心思想是:将密度足够高的区域划分为簇,稀疏区域的点视为噪声。关键概念如下:

  • E邻域:以某个点为中心,半径为E的区域。

  • 核心对象:若一个点的E邻域内包含的样本数≥MinPts(最小点数阈值),则该点为核心对象。

  • 密度可达:通过一系列核心对象的E邻域传递,可到达的点称为密度可达。

  • 噪声点:无法被任何核心对象密度可达的点,标注为-1。

算法流程:遍历所有未处理的点,若为核心对象则扩展其密度可达的所有点形成簇,否则标记为噪声,直到所有点处理完毕。

可以理解为病毒扩散,只要接触的范围近就会被感染,一个群体被感染完之后开始下一轮,区别于kmeans在于聚类出特殊的形状,而不是仅仅通过距离的远近你你你来实现聚类,如实现笑脸表情的聚类两种算法的区别:

API:

三、TF-IDF:自然语言处理的核心文本特征提取方法

在自然语言处理中,需将文本转换为数值特征才能用于机器学习模型。TF-IDF(词频-逆文档频率)是常用的特征加权方法,用于评估一个词对某篇文档的重要程度,即寻找关键词的方法。

3.1 核心原理

TF-IDF由两部分组成,核心逻辑是:一个词在本文档中出现越频繁(TF高),且在所有文档中出现越稀少(IDF高),则该词对本文档的重要性越高(TF-IDF值越大)。

  • 词频(TF):某词在当前文档中的出现次数/当前文档总词数,衡量词在本文档的活跃度。

  • 逆文档频率(IDF):log(总文档数/(包含该词的文档数+1)),"+1"是为了避免分母为0,衡量词的稀缺性。

  • TF-IDF值:TF × IDF,最终的词权重,值越大越重要。

3.2 实战代码:按行提取文本关键词

将文本文件的每一行视为一个独立文档,通过TF-IDF计算并排序每个文档的关键词,过滤无意义的英文停用词(如the、is)。

python 复制代码
from sklearn.feature_extraction.text import TfidfVectorizer

# 步骤1:读取txt文件,每一行作为一个文本
with open("task2_1.txt", "r", encoding="utf-8") as f:
    # 读取所有行,去掉空行和换行符
    documents = [line.strip() for line in f if line.strip()]

# 步骤2:初始化TF-IDF转换器(自动过滤英文停用词)
tfidf = TfidfVectorizer(stop_words="english")  # stop_words="english"过滤常见无意义词

# 步骤3:计算所有文本的TF-IDF矩阵
tfidf_matrix = tfidf.fit_transform(documents)
# 获取所有词汇(特征名)
all_words = tfidf.get_feature_names_out()

# 步骤4:遍历每个文本,按TF-IDF权重降序排序关键词
print("=== 每个文本的关键词排序(按TF-IDF权重从高到低)===")
for idx, doc in enumerate(documents, start=1):
    # 获取当前文本的TF-IDF值(转换为数组格式)
    tfidf_values = tfidf_matrix[idx - 1].toarray()[0]

    # 将"词汇"和"对应的TF-IDF值"配对,过滤掉权重为0的词
    word_tfidf = [(word, value) for word, value in zip(all_words, tfidf_values) if value > 0]

    # 按TF-IDF值降序排序
    word_tfidf_sorted = sorted(word_tfidf, key=lambda x: x[1], reverse=True)

    # 输出结果
    print(f"\n文本{idx}:{doc}")
    print("关键词排序:", [word for word, _ in word_tfidf_sorted])

运行结果:

3.3 核心要点解读

  • 中文处理注意事项 :上述代码适用于已分词的文本(词之间用空格分隔)。若处理原始中文文本,需先使用jieba等分词库分词,示例:import jieba; seg_doc = " ".join(jieba.lcut("机器学习入门教程"))

  • 停用词过滤 :通过stop_words="english"过滤英文停用词,中文停用词可自行构建列表传入该参数。

  • 应用场景:搜索引擎排序、文本分类/聚类的特征输入、文档关键词提取等。

四、总结:核心知识点与应用场景对比

技术点 核心优势 局限性 典型应用场景
KMeans 原理简单、计算高效,适合大规模数据 需预设簇数,对非球形簇、噪声敏感 用户价值分群、图像分割、数据初步聚类
DBSCAN 无需预设簇数,识别任意形状簇和噪声 对参数敏感,高维数据表现较差 地理热点分析、网络攻击检测、异常数据过滤
TF-IDF 简单高效,能有效提取文本核心特征 依赖分词质量,无法捕捉语义关系 关键词提取、文本分类/聚类特征输入、搜索引擎

综上,KMeans和DBSCAN是两种互补的聚类算法,需根据数据分布和业务需求选择;TF-IDF是文本处理的基础,常与聚类、分类算法结合使用。掌握这些基础技术,能覆盖大部分无监督学习和文本处理的入门场景。

相关推荐
睡醒了叭1 天前
图像分割-传统算法-聚类算法
opencv·算法·计算机视觉·聚类
子夜江寒1 天前
SVM、K-means与DBSCAN 算法简介
算法·支持向量机·kmeans
上海乐备实生物2 天前
单细胞转录组数据的聚类分群:方法、挑战与进展
信息可视化·数据挖掘·聚类·生信·单细胞测序·乐备实·聚类分群
core5123 天前
K-Means (K-均值聚类):物以类聚的整理术
均值算法·kmeans·聚类
dundunmm3 天前
【论文阅读】Structure-guided deep multi-view clustering
论文阅读·聚类·深度聚类·图聚类·多视图聚类
dulu~dulu5 天前
机器学习题目总结(二)
人工智能·机器学习·支持向量机·聚类·集成学习·降维·贝叶斯分类器
Hcoco_me7 天前
机器学习核心概念与主流算法(通俗详细版)
人工智能·算法·机器学习·数据挖掘·聚类
Jerryhut7 天前
sklearn函数总结十二 —— 聚类分析算法K-Means
算法·kmeans·sklearn
Hcoco_me8 天前
LLM(Large Language Model)系统学习路线清单
人工智能·算法·自然语言处理·数据挖掘·聚类