基于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文件中。

相关文章
|
12天前
|
机器学习/深度学习 数据采集 算法
时间序列结构变化分析:Python实现时间序列变化点检测
在时间序列分析和预测中,准确检测结构变化至关重要。新出现的分布模式往往会导致历史数据失去代表性,进而影响基于这些数据训练的模型的有效性。
30 1
|
5天前
|
XML 数据格式 Python
Python技巧:将HTML实体代码转换为文本的方法
在选择方法时,考虑到实际的应用场景和需求是很重要的。通常,使用标准库的 `html`模块就足以满足大多数基本需求。对于复杂的HTML文档处理,则可能需要 `BeautifulSoup`。而在特殊场合,或者为了最大限度的控制和定制化,可以考虑正则表达式。
21 12
|
1天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
11 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
7天前
|
机器学习/深度学习 自然语言处理 算法
使用Python实现简单的文本情感分析
【9月更文挑战第13天】本文将介绍如何使用Python编程语言进行基础的文本情感分析。我们将通过一个简单的例子,展示如何利用自然语言处理库nltk和机器学习库sklearn来实现对文本数据的情感倾向性判断。文章旨在为初学者提供一个入门级的指导,帮助他们理解并实践文本情感分析的基本步骤和方法。
15 6
|
5天前
|
机器学习/深度学习 数据可视化 搜索推荐
使用Python实现深度学习模型:智能睡眠监测与分析
使用Python实现深度学习模型:智能睡眠监测与分析
27 2
|
7天前
|
机器学习/深度学习 搜索推荐 TensorFlow
使用Python实现深度学习模型:智能饮食建议与营养分析
使用Python实现深度学习模型:智能饮食建议与营养分析
30 3
|
9天前
|
存储 算法 测试技术
预见未来?Python线性回归算法:数据中的秘密预言家
【9月更文挑战第11天】在数据的海洋中,线性回归算法犹如智慧的预言家,助我们揭示未知。本案例通过收集房屋面积、距市中心距离等数据,利用Python的pandas和scikit-learn库构建房价预测模型。经过训练与测试,模型展现出较好的预测能力,均方根误差(RMSE)低,帮助房地产投资者做出更明智决策。尽管现实关系复杂多变,线性回归仍提供了有效工具,引领我们在数据世界中自信前行。
25 5
|
7天前
|
机器学习/深度学习 搜索推荐 算法框架/工具
使用Python实现深度学习模型:智能运动表现分析
使用Python实现深度学习模型:智能运动表现分析
31 1
|
16天前
|
Python
在Python中,文本查找和替换的常用操作
在Python中,文本查找和替换的常用操作,使用字符串方法进行查找和替换,使用正则表达式进行查找和替换,对所查找到的内容进行计数。
17 1
|
19天前
|
编解码 算法 图形学
同一路RTSP|RTMP流如何同时回调YUV和RGB数据实现渲染和算法分析
我们播放RTSP|RTMP流,如果需要同时做渲染和算法分析的话,特别是渲染在上层实现(比如Unity),算法是python这种情况,拉两路流,更耗费带宽和性能,拉一路流,同时回调YUV和RGB数据也可以,但是更灵活的是本文提到的按需转算法期望的RGB数据,然后做算法处理