首页 > 编程语言 >《机器学习》—— K-means 聚类算法

《机器学习》—— K-means 聚类算法

时间:2024-08-28 15:24:37浏览次数:8  
标签:系数 means 样本 算法 plt 聚类 轮廓

文章目录

一、什么是K-means 聚类算法?

  • K-Means 是 Python 中非常流行的一个聚类算法,它属于无监督学习算法的一种。在 scikit-learn(一个广泛使用的机器学习库)中,KMeans 类用于执行 K-均值聚类。K-均值聚类是一种将数据点分成 K 个簇的算法,其中每个簇由簇内数据点的均值(即“质心”)定义。
  • 基本原理
    • 初始化:首先,算法随机选择 K 个点作为初始的簇质心(如动图中的X点)。
    • 分配:然后,算法将每个数据点分配到最近的簇质心,形成 K 个簇。
      • 满足条件:所有的数据点到质心的距离(使用欧氏距离)之和是最小的
    • 更新:接着,算法重新计算每个簇的质心,即计算簇内所有点的均值
    • 迭代:重复分配和更新步骤,直到簇质心的位置不再发生显著变化,或者达到预设的迭代次数。
  • 动图解释
    在这里插入图片描述

二、聚类效果评价方式——轮廓系数

  • metrics.silhouette_score 是 Scikit-learn(一个流行的 Python 机器学习库)中用于评估聚类效果好坏的一个指标。它衡量了聚类内样本的相似度与聚类间样本的不相似度,其值范围从 -1 到 1。
  • 原理:
    • Silhouette Score(轮廓系数)结合了凝聚度分离度两种因素。对于单个样本,其轮廓系数定义为:
      在这里插入图片描述
      • a 是样本与同一聚类中其他样本的平均距离(即样本的凝聚度或内聚度)
      • b 是样本与最近聚类中所有样本的平均距离(即样本的分离度
  • 整个数据集的轮廓系数是所有样本轮廓系数的平均值
  • 如何判断聚类效果好坏:
    • 值接近 1 :表示样本远离其他聚类,且聚类内部紧密。这是聚类效果好的标志。
    • 值接近 0 :表示样本位于两个聚类之间
    • 值为负 :表示样本被分配到了错误的聚类中,因为该样本与其聚类内的平均距离大于它与最近聚类中样本的平均距离。

三、示例:代码实现

  • python中的 class sklearn.cluster.KMeans 方法用于实现K-means 聚类算法

  • 它有以下一些参数:

    class sklearn.cluster.KMeans(
    	n_clusters=8, init=’k-means++’, 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’)
    
  • 其中最重要的便是 n_clusters :

    • n_clusters: 类中心的个数,就是要聚成几类。(默认是8个)
  • 数据集介绍

    • 下面是一份含有20个不同的酒,且每瓶酒都有四个相同属性的数据
    • 通过对四个属性的模型训练,将这些酒进行聚类
    • 数据的第一行为列名,第一列为酒的名字
      在这里插入图片描述
  • 1、读取数据并获取训练数据

    import pandas as pd
    # 注意这里读取文本数据时,需要指定,数据之间是以什么进行分隔的
    data = pd.read_table('data.txt', sep=' ', encoding='utf8', engine='python')
    # 通过传入变量(列名)获取训练数据
    x = data[['calories', 'sodium', 'alcohol', 'cost']]
    
  • 2、循环找到合适的K值(簇数)

    • 循环不同的K值,通过比较轮廓系数的大小确定出最优K值
    from sklearn.cluster import KMeans
    from sklearn import metrics
    
    scores = []
    for k in range(2, 10):  # 寻找合适的k值(簇数)
        labels = KMeans(n_clusters=k).fit(x).labels_  # .labels_ 获取训练后各样本对应的分类标签
        score = metrics.silhouette_score(x, labels)  # 轮廓系数
        scores.append(score)  # 将每次循环得到的轮廓系数存放在scores列表中
    print(scores)
    
    import numpy as np
    
    best_k = range(2, 10)[np.argmax(scores)]  # 找到scores中最大的值对应的K值
    print("最优k值为:{}".format(best_k))
    
    • 结果:
      在这里插入图片描述
  • 3、可视化不同K值下,轮廓系数的大小

    import matplotlib.pyplot as plt
    
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
    # 为了坐标轴负号正常显示。matplotlib默认不支持中文,设置中文字体后,负号会显示异常。需要手动将坐标轴负号设为False才能正常显示负号。
    plt.rcParams['axes.unicode_minus'] = False
    
    plt.plot(list(range(2, 10)), scores)
    plt.xlabel('K值(簇数)')
    plt.ylabel('轮廓系数')
    plt.show()
    
    • 结果:在这里插入图片描述
  • 4、在最优K值下训练模型,并计算出轮廓系数

    from sklearn.cluster import KMeans
    from sklearn import metrics
    
    km = KMeans(n_clusters=2).fit(x)
    data['cluster'] = km.labels_   # 为原数据增加一个新列用于存放训练得出的每个样本的类标签
    score = metrics.silhouette_score(x, data.cluster) # 计算轮廓系数
    print(score)
    
    • 结果:
      在这里插入图片描述
    • 可以看出K-means 聚类算法的效果并不是太好,存在各种因素的影响,有待我们进一步的学习与思考

四、聚类算法的优缺点

  • 优点
    • 无监督学习,不需要事先标记的数据。
    • 能够发现数据中的隐藏模式和结构。
    • 适用于多种数据类型和领域。
  • 缺点
    • 需要选择合适的聚类算法和参数,这往往依赖于数据的特性和问题的需求。
    • 聚类结果可能受到初始条件(如K-means的初始质心选择)的影响。
    • 对于复杂形状和密度的簇,可能需要更复杂的聚类算法或参数调整。

标签:系数,means,样本,算法,plt,聚类,轮廓
From: https://blog.csdn.net/weixin_73504499/article/details/141633675

相关文章

  • 亦菲喊你来学机器学习(14) --贝叶斯算法
    文章目录贝叶斯一、贝叶斯定理二、贝叶斯算法的核心概念三、贝叶斯算法的优点与局限优点:局限:四、构建模型训练模型测试模型总结贝叶斯贝叶斯算法(Bayesianalgorithm)是一种基于贝叶斯定理的机器学习方法,主要用于估计模型参数和进行概率推断。以下是对贝叶斯算法的......
  • 图论:配对问题与匈牙利算法
    文章目录引言配对问题一:网约车司机与乘客配对问题图模型配对模拟配对问题二:婚恋网站配对图模型配对模拟匈牙利(Hopcroft-Karp)算法模拟过程推演模拟编码实现核心概念优缺点应用场景结语引言配对问题是图论中的一个经典问题,通常涉及将一组对象(如人员、资源等)进行有......
  • c++算法3-广度优先搜索算法dfs
    搜索算法众所周知,搜索算法分为常见的两种深度优先搜索算法(dfs)广度优先搜索算法(bfs)深度优先搜索算法深度优先搜索算法就是一条道走到黑,如迷宫问题,重复不断地向前探索如果碰到死胡同就说明前面已经没有路了,这时候就可以想其他方向搜索,最终走到终点。回溯回溯是一种搜索算法......
  • 零成本、无编程,GLM-4-Flash免费API发布,算法工程师嗨翻了!!!
    作为一名资深NLP算法工程师,大模型在日常工作中扮演了非常重要的角色,辅助处理很多工作。但是,大模型的使用非常麻烦:主流大模型通过网页对话方式交互,手工输入Promt,通过对话的方式获取结果,长度有限且非常不方便。资源有限,市面上很少大模型API资源可供使用,并且都是收费的。今......
  • CSEC:香港城市大学提出SOTA曝光矫正算法 | CVPR 2024
    CSEC:香港城市大学提出SOTA曝光矫正算法|CVPR2024 在光照条件不佳下捕获的图像可能同时包含过曝和欠曝。目前的方法主要集中在调整图像亮度上,这可能会加剧欠曝区域的色调失真,并且无法恢复过曝区域的准确颜色。论文提出通过学习估计和校正这种色调偏移,来增强既有过曝又有欠......
  • 代码随想录算法day24 | 贪心算法part02 | 122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳
    122.买卖股票的最佳时机II本题解法很巧妙,本题大家可以先自己思考一下然后再看题解,会有惊喜!力扣题目链接(opensnewwindow)给定一个数组,它的第 i个元素是一支给定股票第i天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次......
  • C++学习随笔——算法题:全排列问题
    算法题:输入一个不存在重复字符的字符串,打印出字符串中字符的全部排列组合。代码实现:#include<iostream>#include<string>#include<vector>#include<algorithm>//std::swapvoidpermute(std::stringstr,intleft,intright){if(left==right){st......
  • CSEC:香港城市大学提出SOTA曝光矫正算法 | CVPR 2024
    在光照条件不佳下捕获的图像可能同时包含过曝和欠曝。目前的方法主要集中在调整图像亮度上,这可能会加剧欠曝区域的色调失真,并且无法恢复过曝区域的准确颜色。论文提出通过学习估计和校正这种色调偏移,来增强既有过曝又有欠曝的图像。先通过基于UNet的网络推导输入图像的增亮和变暗......
  • STL所有常用算法(全网最详细,一文全掌握,建议收藏)
    目录1.分类和介绍2.遍历算法2.1for_each算法(遍历执行)2.2transform算法(搬运)3.查找算法3.1find算法(具体查找)3.2find_if算法(条件查找)3.3 adjacent_find(查找相邻重复元素)3.4 binary_search(二分查找有序序列中元素是否存在)3.5 count(统计元素出现次数)3.6 coun......
  • 主成分分析结合遗传算法优化的随机森林通用代码
    importpandasaspdfromsklearn.preprocessingimportStandardScalerfromsklearn.decompositionimportPCAfromsklearn.ensembleimportRandomForestClassifier,RandomForestRegressorfromsklearn.metricsimportaccuracy_score,mean_squared_error,mean_abso......