在机器学习领域,聚类算法是无监督学习的核心应用,而文本特征提取则是自然语言处理的基础步骤。本文将结合实战代码,详细拆解KMeans、DBSCAN两种经典聚类算法及TF-IDF文本特征提取方法,帮你快速掌握核心原理与落地技巧。
一、KMeans聚类:基于距离的经典聚类算法
1.1 核心原理
KMeans是一种基于距离的聚类算法,核心思想是通过预设聚类数量K,将数据划分为K个簇,使得每个簇内样本的相似度最高(距离最近),簇间样本的相似度最低(距离最远)。算法流程可概括为:
随机初始化K个聚类中心;
计算每个样本到各聚类中心的距离,将样本归入最近的簇;
重新计算每个簇的均值作为新的聚类中心;
重复步骤2-3,直到聚类中心稳定或达到最大迭代次数。
聚类效果评价方式:
1.2 实战代码:聚类效果评估与可视化
下面以实际数据集为例,实现KMeans聚类,并通过轮廓系数评估聚类效果,绘制聚类数与轮廓系数的关系折线图,辅助选择最优K值。以之前寝室分配的数据集为例:
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)。
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是文本处理的基础,常与聚类、分类算法结合使用。掌握这些基础技术,能覆盖大部分无监督学习和文本处理的入门场景。