基于python的k-means聚类分析算法,对文本、数据等进行聚类,有轮廓系数和手肘法检验

简介: 本文详细介绍了基于Python实现的k-means聚类分析算法,包括数据准备、预处理、标准化、聚类数目确定、聚类分析、降维可视化以及结果输出的完整流程,并应用该算法对文本数据进行聚类分析,展示了轮廓系数法和手肘法检验确定最佳聚类数目的方法。

K-means算法是一种常见的聚类算法,用于将数据点分成不同的组(簇),使同一组内的数据点彼此相似,不同组之间的数据点相对较远。以下是K-means算法的基本工作原理和步骤:

工作原理:

初始化:选择K个初始聚类中心点(质心)。
分配:将每个数据点分配到最接近的聚类中心,形成K个簇。
更新:根据每个簇中的数据点重新计算聚类中心。
迭代:重复步骤2和3,直到满足停止条件(如聚类中心不再改变或达到最大迭代次数)。

算法步骤:

初始化:随机选择K个数据点作为初始聚类中心。
分配:对于每个数据点,计算其与各个聚类中心的距离,将其分配给距离最近的聚类中心。
更新:重新计算每个簇的聚类中心,使用该簇内所有数据点的平均值。
迭代:重复步骤2和3,直到聚类中心稳定或达到最大迭代次数。

优点:

简单且高效,适用于大规模数据集。
对于球状簇具有很好的效果,易于解释。

缺点:

需要预先设定聚类数K。
对异常值和噪声敏感。
结果可能受初始聚类中心的选择影响。

应用领域:

图像分割、文本聚类、市场分析、推荐系统等。

实现聚类分析的基本步骤如下:

数据准备与预处理:

读取数据:从Excel文件中读取数据,对数据进行去重和缺失值处理。
特征选择:选择用于聚类分析的特征列,如'地区发展程度'、'时间间隔'、'评论回复数'、'评论点赞数'等。

df.drop\_duplicates(subset=\['评论'\], keep='first', inplace=True)
df.dropna(subset=\['评论'\],axis=0,inplace=True)
# 将评论时间列转换为时间格式
df\['评论时间'\] = pd.to\_datetime(df\['评论时间'\])
# 计算每个时间点距禖当前时间的时间间隔(单位:秒)
current\_time = datetime.now()
df\['时间间隔'\] = round((current\_time - df\['评论时间'\]).dt.total\_seconds().astype(int)/86400,1)
print(df.info())
# 创建一个字典,用于映射地区与发展水平的关系
region\_mapping = {
    '发达地区': \['北京省', '上海省', '天津省', '上海省'\],
    '普通地区': \['广东省', '江苏省', '浙江省', '福建省', '湖北省', '湖南省', '安徽省', '江西省', '山东省', '辽宁省', '吉林省', '黑龙江省'\],
    '发展地区': \['重庆省', '河南省', '四川省', '陕西省', '天津省', '山西省', '内蒙古省', '河北省', '广西省', '海南省', '河南省', '河北省', '山西省', '内蒙古省', '宁夏省', '青海省', '甘肃省',
             '陕西省', '新疆省'\],
    '未知': \['设置了隐私'\],
}

数据标准化:

使用StandardScaler对特征数据进行标准化,使数据具有零均值和单位方差。

scaler = StandardScaler()
X\_data = scaler.fit\_transform(X\_data)

确定聚类数目:

使用“肘部法”和“轮廓系数法”等方法确定合适的聚类数目。

\# 构造自定义函数,用于绘制不同k值和对应总的簇内离差平方和的折线图
def k\_SSE(X, clusters):
    # 选择连续的K种不同的值
    K = range(1, clusters + 1)
    # 构建空列表用于存储总的簇内离差平方和
    TSSE = \[\]
    for k in K:
        # 用于存储各个簇内离差平方和
        SSE = \[\]
        kmeans = KMeans(n\_clusters=k)
        kmeans.fit(X)
        # 返回簇标签
        labels = kmeans.labels\_
        # 返回簇中心
        centers = kmeans.cluster\_centers\_
        # 计算各簇样本的离差平方和,并保存到列表中
        for label in set(labels):
            SSE.append(np.sum((X\[labels == label, :\] - centers\[label, :\]) \*\* 2))
        # 计算总的簇内离差平方和
        TSSE.append(np.sum(SSE))

    # 中文和负号的正常显示
    plt.rcParams\['font.sans-serif'\] = \['Microsoft YaHei'\]
    plt.rcParams\['axes.unicode\_minus'\] = False
    # 设置绘图风格
    plt.style.use('ggplot')
    # 绘制K的个数与GSSE的关系
    plt.plot(K, TSSE, 'b\*-')
    plt.xlabel('簇的个数')
    plt.ylabel('簇内离差平方和之和')
    plt.title('手肘法')
    # 显示图形
    plt.show()

聚类分析:

使用自定义的KMeans类或Sklearn中的KMeans进行聚类分析,传入特征数据和确定的聚类数目。
获取聚类标签并将其与特征数据关联。

n\_clusters = 5
km = KMeans(n\_clusters=n\_clusters).fit(X\_data)

#% 降维后画图显示聚类结果
#将原始数据中的索引设置成得到的数据类别
X\_rsl = pd.DataFrame(X\_data,index=km.labels\_)
X\_rsl\_center = pd.DataFrame(km.cluster\_centers\_) #找出聚类中心

降维可视化:

使用TSNE对聚类结果进行降维处理,将高维数据降至二维或三维。
利用降维后的数据和聚类中心绘制散点图,根据聚类结果进行着色展示。

tsne = TSNE()
tsne.fit\_transform(X\_rslwithcenter) #进行数据降维,并返回结果

结果输出:

将聚类标签与原始数据关联,将聚类结果输出到Excel文件中。

相关文章
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
143 4
|
2月前
|
Python
SciPy 教程 之 Scipy 显著性检验 9
SciPy 教程之 Scipy 显著性检验第9部分,介绍了显著性检验的基本概念、作用及原理,通过样本信息判断假设是否成立。着重讲解了使用scipy.stats模块进行显著性检验的方法,包括正态性检验中的偏度和峰度计算,以及如何利用normaltest()函数评估数据是否符合正态分布。示例代码展示了如何计算一组随机数的偏度和峰度。
34 1
|
2月前
|
BI Python
SciPy 教程 之 Scipy 显著性检验 8
本教程介绍SciPy中显著性检验的应用,包括如何利用scipy.stats模块进行显著性检验,以判断样本与总体假设间的差异是否显著。通过示例代码展示了如何使用describe()函数获取数组的统计描述信息,如观测次数、最小最大值、均值、方差等。
34 1
|
2月前
|
Python
SciPy 教程 之 Scipy 显著性检验 7
SciPy 教程之 Scipy 显著性检验第7部分,介绍显著性检验的基本概念及其在 SciPy 中的应用。显著性检验用于评估样本数据与假设之间的差异是否由随机因素引起。SciPy 的 `scipy.stats` 模块提供了执行显著性检验的功能,包括 KS 检验等方法,用于检测数据是否符合特定分布。示例代码展示了如何使用 KS 检验验证一组数据是否符合正态分布。
30 2
|
2月前
|
Python
SciPy 教程 之 Scipy 显著性检验 3
本教程介绍Scipy显著性检验,包括其基本概念、原理及应用。显著性检验用于判断样本与总体假设间的差异是否显著,是统计学中的重要工具。Scipy通过`scipy.stats`模块提供了相关功能,支持双边检验等方法。
43 1
|
2月前
|
机器学习/深度学习 自然语言处理 API
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程
如何使用阿里云的语音合成服务(TTS)将文本转换为语音?本文详细介绍了从注册账号、获取密钥到编写Python代码调用TTS服务的全过程。通过简单的代码示例,展示如何将文本转换为自然流畅的语音,适用于有声阅读、智能客服等场景。
400 3
|
2月前
|
Python
SciPy 教程 之 Scipy 显著性检验 1
本教程介绍Scipy显著性检验,包括统计假设、零假设和备择假设等概念,以及如何使用scipy.stats模块进行显著性检验,以判断样本与总体假设间是否存在显著差异。
36 0
|
3月前
|
自然语言处理 算法 数据挖掘
探讨如何利用Python中的NLP工具,从被动收集到主动分析文本数据的过程
【10月更文挑战第11天】本文介绍了自然语言处理(NLP)在文本分析中的应用,从被动收集到主动分析的过程。通过Python代码示例,详细展示了文本预处理、特征提取、情感分析和主题建模等关键技术,帮助读者理解如何有效利用NLP工具进行文本数据分析。
66 2
|
3月前
|
机器学习/深度学习 自然语言处理 大数据
使用Python进行文本情感分析
【10月更文挑战第2天】使用Python进行文本情感分析
69 3
|
4月前
|
Linux 开发者 iOS开发
Python中使用Colorama库输出彩色文本
Python中使用Colorama库输出彩色文本