• 【聚类算法】带你轻松搞懂K-means聚类(含代码以及详细解释)


    一:K-means聚类算法

    聚类是一个将数据集中在某些方面相似的数据成员进行分类组织的过程,聚类就是一种发现这种内在结构的技术,聚类技术经常被称为无监督学习
    k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。

    二:实例分析

    现有50个二维数据点如下图,使用K-Means算法将以下数据实现聚类。
    在这里插入图片描述
    结果展示:
    在这里插入图片描述

    三:原理与步骤

    K-means算法是典型的基于距离(欧式距离、曼哈顿距离)的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。
    K-mean算法步骤如下:

    1. 先定义总共有多少个簇类,随机选取K个样本为簇中⼼。
    2. 分别计算所有样本到随机选取的K个簇中⼼的距离。
    3. 样本离哪个中⼼近就被分到哪个簇中⼼。
    4. 计算各个中⼼样本的均值(最简单的⽅法就是求样本每个点的平均值)作为新的簇心。
    5. 重复2、3、4直到新的中⼼和原来的中⼼基本不变化的时候,算法结束。

    算法结束条件:

    1. 当每个簇的质心,不再改变时就可以停止k-menas。
    2. 当循环次数达到事先规定的次数时,停止k-means

    原理示意图:
    在这里插入图片描述
    简单小实例:
    有以下6个点,初始随机选取两个点作为两个簇的簇中心(这里假设选取的是A3,A4),求最后的簇所属情况。
    在这里插入图片描述
    1️⃣:计算每个点到簇心的距离,将距离近的归为一类。
    在这里插入图片描述
    2️⃣:将红色对应的点和绿色对应的每个点分别求X,Y平均值,最为新的簇心。
    在这里插入图片描述
    3️⃣:计算每个点到新簇心的距离,继续将对应距离近的点归为一类。
    在这里插入图片描述
    4️⃣:由于关联点没有发生变化,所以之后的结果不会发生变化。停止计算
    5️⃣:得结果红色簇:A1,A3,A5,紫色簇:A2,A4,A6。

    四:Matlab代码以及详解

    clc;clear;close all;
    data(:,1)=[90,35,52,83,64,24,49,92,99,45,19,38,1,71,56,97,63,...
        32,3,34,33,55,75,84,53,15,88,66,41,51,39,78,67,65,25,40,77,...
        13,69,29,14,54,87,47,44,58,8,68,81,31];
    data(:,2)=[33,71,62,34,49,48,46,69,56,59,28,14,55,41,39,...
        78,23,99,68,30,87,85,43,88,2,47,50,77,22,76,94,11,80,...
        51,6,7,72,36,90,96,44,61,70,60,75,74,63,40,81,4];
    %50 * 1
    figure(1)
    
    scatter(data(:,1),data(:,2),'MarkerEdgeColor','r','LineWidth',2)
    %% 原理推导K均值
    [m,n]=size(data);%m = 50,n = 1;
    cluster_num=4;%4个初始中心
    cluster=data(randperm(m,cluster_num),:);%randperm(m,cluster_num)在前m中随机选取cluster_num个  %随机选取中心
    %data函数  取数据用
    epoch_max=1000;%最大次数
    therad_lim=0.001;%中心变化阈值
    epoch_num=0;
    while(epoch_num<epoch_max)
        epoch_num=epoch_num+1;
        for i=1:cluster_num
        distance=(data-repmat(cluster(i,:),m,1)).^2;% 50 * 2  repmat扩展矩阵
        %.^2是矩阵中的每个元素都求平方,^2是求矩阵的平方或两个相同的矩阵相乘,因此要求矩阵为方阵
        distance1(:,i)=sqrt(sum((distance),2));%求行和
        %distance1(:,i)=sqrt(sum(distance'));% 默认求列和  1表示每一列进行求和,2表示每一行进行求和;
        %sqrt(sum(distance')) == 1 * 50
        %distance1 50 * 4 表示每个点距离第i个点的距离
        end
        [~,index_cluster]=min(distance1');%distance1' = 4 * 50,min 求列最值  index_cluster = 最小值所在行号  index_cluster = 1 * 50
        for j=1:cluster_num
        cluster_new(j,:)=mean(data(find(index_cluster==j),:));% 4 * 2  找到距离对应中心最近的点 横纵坐标各取平均值
        end
        if (sqrt(sum((cluster_new-cluster).^2))>therad_lim)
            cluster=cluster_new;
        else
            break;
        end
    end
    %% 画出聚类效果
    figure(2)
    %subplot(2,1,1)
    a=unique(index_cluster); %找出分类出的个数
    C=cell(1,length(a));%1 * 4的元胞
    for i=1:length(a)
       C(1,i)={find(index_cluster==a(i))};
    end
    for j=1:cluster_num
        data_get=data(C{1,j},:);%从data中取每个类的点
        scatter(data_get(:,1),data_get(:,2),80,'filled','MarkerFaceAlpha',.6,'MarkerEdgeAlpha',.9);
        hold on
    end
    plot(cluster(:,1),cluster(:,2),'kp','LineWidth',2);%画出4个聚类中心
    hold on
    sc_t=mean(silhouette(data,index_cluster'));
    title_str=['原理推导K均值聚类','  聚类数为:',num2str(cluster_num),'  SC轮廓系数:',num2str(sc_t)];
    title(title_str)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
  • 相关阅读:
    企业薪资系统
    NEON优化3:矩阵转置的指令优化案例
    【K8S】secret来配置K8S应用(环境变量)--20220916
    怎么归纳递归数列的通项表达式?
    nodeJs--querystring模块
    【阅读SpringMVC源码】手把手带你debug验证SpringMVC执行流程
    ifconfig与ip命令的比较
    如何在宝塔上面新建虚拟主机
    Opencv与python实现多目标跟踪 (一) - PaddleDetection目标检测
    SpringBoot中Bean的条件装配
  • 原文地址:https://blog.csdn.net/qq_43727529/article/details/126813321