news 2026/5/1 7:31:16

机器学习--K-means聚类DBSCANTF-IDF

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器学习--K-means聚类DBSCANTF-IDF

一、K-means聚类

1、基本概念

1)聚成多少个簇:需要知道K的值

2)距离的度量:一般采用欧式距离

3)质心:各向量的均值

4)优化目标:

2、常见的距离

3、步骤

4、聚类效果评价方式

1)轮廓系数

a(i):对于第i个元素xi,计算xi与其同一个簇内所有其他元素距离的平均值,表示簇内的凝聚程度

b(i):选取xi外的一个簇,计算xi与该簇内所有点距离的平均距离,遍历其他所有簇,取所有平均值中最小的一个,表示簇间的分离度

(1)轮廓系数范围在[-1,1]之间,该值越大,越合理

(2)si接近1,则说明样本i聚类合理;

(3)si接近-1,则说明样本i更应该分类到另外的簇

(4)若si近似为0,则说明样本i在两个簇的边界上

5、K-means的API参数

classsklearn.cluster.KMeans(n_clusters=8,init=’kmeans++’,n_init=10,max_iter=300,tol=0.0001,precompute_distances=’auto’,verbose=0,random_state=None,copy_x=True,n_jobs=None,algorithm=’auto’)[source]

【参数

n_clusters:类中心的个数,就是要聚成几类。【默认8个】

init初始化的方法,默认为'k-means++'

(1)'k-means++':用一种特殊的方法选定初始质心从而能加速迭代过程的收敛.

(2)‘random’:随机从训练数据中选取初始质心。

(3)如果传递的是一个ndarray,则应该形如 (n_clusters, n_features) 并给出初始质心。

n_init:整形,缺省值=10

用不同的质心初始化值运行算法的次数,最终解是在inertia意义下选出的最优结果。

max_iter:

执行一次k-means算法所进行的最大迭代数。

Tol:与inertia结合来确定收敛条件。

precompute_distances三个可选值,‘auto’,True 或者 False

预计算距离,计算速度更快但占用更多内存。

(1)‘auto’:如果 样本数乘以聚类数大于 12million 的话则不预计算距离。

(2)True:总是预先计算距离。

(3)False:永远不预先计算距离。

verbose:整形,默认值=0

random_state :随机状态

copy_x:布尔型,默认值=True

当我们precomputing distances时,将数据中心化会得到更准确的结果。如果把此参数值设为True,则原始数据不会被改变。如果是False,则会直接在原始数据 上做修改并在函数返回值时将其还原。但是在计算过程中由于有对数据均值的加减运算,所以数据返回后,原始数据和计算前可能会有细小差别。

algorithm:'auto','full' or 'elkan'.默认为'auto'
full:采用经典的EM算法
elkan:通过使用三角不等式从而更有效,但不支持稀疏数据
auto:数据稀疏选择full模式,数据稠密选择elkan模式

【属性】

cluster_centers_:一个n-clusters*n_features的矩阵,表示聚类中心的坐标

Labels_:

每个点的分类标签。

inertia_:float形

每个点到其簇的质心的距离之和。

n_iter_: int

迭代次数。

6、实际运用

通过网盘分享的文件:datingTestSet2.txt
链接: https://pan.baidu.com/s/1ppjHnaeHVBIydlJ7-4a9cw 提取码: y5qu

import pandas as pd import numpy as np from sklearn.cluster import KMeans from sklearn import metrics a = pd.read_csv('datingTestSet2.txt', sep='\t', header=None) a.columns = ['F1', 'F2', 'F3', 'Class'] x = a[['F1', 'F2', 'F3']] from sklearn.metrics import silhouette_score scores=[] for i in range(2,15): labels=KMeans(n_clusters=i,random_state=0,max_iter=1000).fit(x).labels_ score = silhouette_score(x, labels) scores.append(score) print(score) # 找到最佳k值 best= np.argmax(scores)+2 # +2因为range从2开始 print('最佳k值:',best) print("最高轮廓系数:", max(scores)) import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams['font.sans-serif']=['Microsoft YaHei'] mpl.rcParams['axes.unicode_minus']=False plt.plot(list(range(2,15)), scores) plt.xlabel("聚类数量") plt.ylabel("轮廓系数得分") plt.show() #聚类 km = KMeans(n_clusters=3).fit(x) a['cluster'] = km.labels_

7、优缺点

1)优点

简单,快速,适合常规的数据集

2)缺点

(1)K值难以确定

(2)很难发现任意形状的簇

二、DBSCAN

1、概念

基于密度的带噪声的空间聚类应用算法,它是将簇定义为密度相连的点的最大集合,能够把具有高密度的区域划分为簇,并在噪声的空间数据集中发现任意形状的聚类

2、要点

1)核心对象:A点

2)E邻域:给定对象半径为E内的区域

3)直接密度可达:

4)密度可达:

5)边界点:B点、C点

6)离群点:N点

3、实现过程

1)输入数据集

2)指定半径

3)指定密度阈值

4、DBSCAN的API参数

classsklearn.cluster.DBSCAN(eps=0.5,min_samples=5,metric=’euclidean’,algorithm=’auto’,leaf_size=30,p=None,n_jobs=None)

epsDBSCAN算法参数,即我们的ϵϵ-邻域的距离阈值,和样本距离超过ϵϵ的样本点不在ϵϵ-邻域内。默认值是0.5.一般需要通过在多组值里面选择一个合适的阈值。eps过大,则更多的点会落在核心对象的ϵϵ-邻域,此时我们的类别数可能会减少, 本来不应该是一类的样本也会被划为一类。反之则类别数可能会增大,本来是一类的样本却被划分开。

min_samples:DBSCAN算法参数,即样本点要成为核心对象所需要的ϵϵ-邻域的样本数阈值。默认值是5. 一般需要通过在多组值里面选择一个合适的阈值。通常和eps一起调参。在eps一定的情况下,min_samples过大,则核心对象会过少,此时簇内部分本来是一类的样本可能会被标为噪音点,类别数也会变多。反之min_samples过小的话,则会产生大量的核心对象,可能会导致类别数过少。

metric:最近邻距离度量参数。可以使用的距离度量较多,一般来说DBSCAN使用默认的欧式距离(即p=2的闵可夫斯基距离)就可以满足我们的需求。可以使用的距离度量参数有:

a) 欧式距离 “euclidean”:

b) 曼哈顿距离 “manhattan”

c) 切比雪夫距离“chebyshev”

还有一些其他不是实数的距离度量,一般在DBSCAN算法用不上,这里也就不列了。

algorithm:最近邻搜索算法参数,算法一共有三种,第一种是蛮力实现,第二种是KD树实现,第三种是球树实现。对于这个参数,一共有4种可选输入,‘brute’对应第一种蛮力实现,‘kd_tree’对应第二种KD树实现,‘ball_tree’对应第三种的球树实现, ‘auto’则会在上面三种算法中做权衡,选择一个拟合最好的最优算法。需要注意的是,如果输入样本特征是稀疏的时候,无论我们选择哪种算法,最后scikit-learn都会去用蛮力实现‘brute’。个人的经验,一般情况使用默认的 ‘auto’就够了。 如果数据量很大或者特征也很多,用"auto"建树时间可能会很长,效率不高,建议选择KD树实现‘kd_tree’,此时如果发现‘kd_tree’速度比较慢或者已经知道样本分布不是很均匀时,可以尝试用‘ball_tree’。而如果输入样本是稀疏的,无论你选择哪个算法最后实际运行的都是‘brute’。

p:最近邻距离度量参数。只用于闵可夫斯基距离和带权重闵可夫斯基距离中p值的选择,p=1为曼哈顿距离, p=2为欧式距离。如果使用默认的欧式距离不需要管这个参数。

【属性】

Labels_:

每个点的分类标签。

三、TF-IDF

1、文本分析之关键字提取

任务:给定任意一篇文本,然后提取该文本的关键词

如何进行关键词提取?

步骤

2、语料库的创建

1)什么是语料库?

(1)语料库中存放的是在语言的实际使用中真实出现过的语言材料

(2)语料库是以电子计算机为载体承载语言知识的基础资源

(3)真实语料需要经过加工(分析和处理),才能成为有用的资源

2)如何构建语料库?

将所需要被分析的文档读入计算机内存,利用python构建语料库

3、进行中文分词

1)导入分词库

固定词组,jieba并没有内置的词组

2)导入停用词库

没有意义的词,如:的,了,呀等

3)使用jieba库分词

将原文章完全分词即可

4、词云图绘制

词云图又叫文字云,是对文字数据中出现频率较高的关键词予以视觉上的突出,形成“关键的渲染”,就类似云一样的彩色图片,从而过滤掉大量的文本信息,使人一眼就可以领略文本数据的主要表达意思

5、TF-IDF分析

1)TF

指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(一般是词频除以文章总次数),以防止它偏向长的文件

2)IDF

逆向文档频率。IDF的主要思想是:如果包含词条t的文档越少,IDF越大,则说明词条具有很好的类别区分能力

逆文档频率(IDF) = log(语料库的文档总数 / 包含该词的文档数)

3)TF-IDF

因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语

4)举例

5)总结

TF-IDF相当于加权

6、实际运用

task2_1.txt中内容
This is the first document This document is the second document And this is the third one Is this the first document This line has several words This is the final document
from sklearn.feature_extraction.text import TfidfVectorizer#补充内容:TF-IDF的方式计算 import pandas as pd a=open(r".\task2_1.txt", 'r') corpus = a.readlines() vectorizer = TfidfVectorizer() #类,转为TF-IDF的向量转换对象 tfidf = vectorizer.fit_transform(corpus) #传入数据,返回包含TF-IDF的向量值 print(tfidf) wordlist = vectorizer.get_feature_names() #获取特征名称,所有的词 print(wordlist) df = pd.DataFrame(tfidf.T.todense(), index=wordlist)#tfidf.T.todense()恢复为稀疏矩阵 print(df) featurelist = df.iloc[:,5].to_list() #通过索引号获取第2列的内容并转换为列表 resdict = {} #排序以及看输出结果对不对 for i in range(0, len(wordlist)): resdict[wordlist[i]] = featurelist[i] resdict = sorted(resdict.items(), key=lambda x: x[1], reverse=True) print(resdict[2])

运行结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/27 4:09:11

Jupyter Lab集成PyTorch:基于Miniconda-Python3.11的一键启动方案

Jupyter Lab集成PyTorch:基于Miniconda-Python3.11的一键启动方案 在人工智能项目开发中,最令人头疼的往往不是模型设计本身,而是“环境配置”这个前置门槛。你是否经历过这样的场景:一篇论文复现代码下载下来后,跑不通…

作者头像 李华
网站建设 2026/5/1 7:28:20

大厂数据结构面试题合集

一、数组与矩阵 1、把数组中的 0 移到末尾 283. Move Zeroes (Easy) Leetcode / 力扣 For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].public void moveZeroes(int[] nums) {int idx = 0;for (int num : nums…

作者头像 李华
网站建设 2026/4/25 23:19:08

清华源HTTPS证书过期?临时禁用SSL验证以更新Miniconda-Python3.11

清华源HTTPS证书过期?临时禁用SSL验证以更新Miniconda-Python3.11 在人工智能和数据科学项目中,环境配置往往是第一步,也是最容易“卡住”的一步。你是否曾遇到这样的场景:刚搭好开发机,兴致勃勃地准备安装 Miniconda …

作者头像 李华
网站建设 2026/4/19 20:11:26

SSH端口映射实战:将Miniconda-Python3.11的Jupyter服务暴露到本地

SSH端口映射实战:将Miniconda-Python3.11的Jupyter服务暴露到本地 在数据科学和AI开发中,一个常见的场景是:你手握一台配置强大的远程GPU服务器,上面跑着你的模型训练任务。你想用熟悉的 Jupyter Notebook 写代码、调参、看可视化…

作者头像 李华
网站建设 2026/4/23 17:21:32

Pyenv管理Python3.11?不如直接使用内置Miniconda-Python3.11环境

Pyenv管理Python3.11?不如直接使用内置Miniconda-Python3.11环境 在人工智能和数据科学项目日益复杂的今天,一个稳定、可复现的开发环境早已不再是“锦上添花”,而是保障实验成功与团队协作的基础。你是否也经历过这样的场景:本地…

作者头像 李华
网站建设 2026/4/23 15:14:26

逐梦编程路——从学生到实习生的技术沉淀

🌈 个人主页:Zfox_ 🔥 从“我能行吗?”开始 说实话,2024 年初我开 CSDN 博客的时候,压根没想着能坚持下来。那时候刚学 C 没多久,写个链表都能把自己绕晕,连指针和引用都分不太清。…

作者头像 李华