K-means 聚类算法学习笔记

2023-09-18 22:01:26

K-means 聚类算法 是一种无监督学习算法,用来将 n n n 个样本点分成 k k k 类,使得整个数据集的误差平方和 S S E SSE SSE 最小。在本例中,样本点是指平面直角坐标系上的点,聚类中心也是平面直角坐标系上的点,而每个点的损失函数则是它到聚类中心的距离。即:找出 2 个点,使得所有点到这 2 个点的距离的更小者之和最小。

K-means 聚类算法流程如下:

  1. 随机指定 k k k 个样本点为聚类中心;
  2. 计算所有点对每个样本点的距离,选择最近的样本点;
  3. 计算同一类的所有点的重心,并将重心作为新的聚类中心;
  4. 重复2.3.,直到所有点选定的最近样本点均不再改变。

其中

S S E = ∑ i = 1 k ∑ x ∈ C i ∑ j = 1 m ( x j − S i j ) 2 SSE=\sum_{i=1}^{k}\sum_{x\in C_i}\sum_{j=1}^m(x_j-S_{ij})^2 SSE=i=1kxCij=1m(xjSij)2

理论上说, S S E SSE SSE 会随着 k k k 的变大而单调递减。

参考文献

function [ClusterID,Means] = KMeansClustering(S, K, plot_flag)
% 输入参数:
% S: 用于聚类的数据,每一行对应一个样本的特征向量,每一列对应一个特征
% K:需要聚成的簇的数量
% plot_flag: 是否需要可视化每一次迭代的更新结果

% 输出参数:
% ClusterID:聚类结果,表示每个样本被聚类至第几个簇
% Means:由簇中心向量组成的矩阵,每一行对应一个簇的中心

%% 初始参数设置
maxiter = 10000;            % 这里的maxiter为迭代算法设置了最大迭代次数,防止算法陷入死循环
iter = 0;                   % 用于表示当前算法已迭代的次数
n = size(S, 1)             % 样本数量

%% 随机初始化聚类均值
ClusterID = zeros(n,1);
rk = randperm(n);
k=rk(1:K);
Means= S(k,:);

%% 开始迭代优化
while iter<maxiter
    OldClusterID = ClusterID;
    %% 将样本分配到距离自己最近的簇中
    
    %%% ###### 需要你完成: ###### %%%
    % 1. 计算每个样本到聚类中心的距离Dist
    Dist = zeros(n,K);
    for i=1:n
        for j=1:K
            for l=1:size(S,2)
                Dist(i,j)=Dist(i,j)+(S(i,l)-Means(j,l))^2;
            end
        end
    end
    % 2. 根据每个样本到各个簇的距离,把每个样本指定到与自己最近的簇中,并生成簇结果ClusterID
     dis=size(n,1);
     [dis,ClusterID]=min(Dist,[],2);

%     Dist
%      ClusterID
%     k
%     pause(1)
% end
    %%% ######################### %%%
    %% 根据新分配的样本,重新计算簇中心
    % 按簇更新
    for i = 1:K
    
        %%% ###### 需要你完成: ###### %%%
        % 1. 首先找到属于该簇的样本
        id = zeros(n,1);
        cnt=0;
        for j=1:n
            if ClusterID(j)==i
                cnt=cnt+1;
                id(cnt)=j;
            end
        end
        % 2. 根据上一步得到的属于该簇的样本,计算这些样本的均值作为该簇的中心Means(i,:)
        Means(i,:) = zeros(size(S,2),1);
        for j=1:size(S,2)
            for l=1:cnt
                Means(i,j)=Means(i,j)+S(id(l),j);
            end
            Means(i,j)=Means(i,j)/cnt;
        end
        %%% ######################### %%%
    end
    
    %% 对每一次迭代的结果进行可视化
    if plot_flag == 1
        if iter==0
            figure
        end
    i1 = find(ClusterID==1);
    i2 = find(ClusterID==2);
    plot_cluster(S,i1,i2,Means);
    title(cat(2,'第',int2str(iter+1),'轮聚类结果'));
    set(gca,'fontsize',15)
    pause(1)
    end
    
    %% 判断迭代退出的条件
    if ClusterID == OldClusterID
        break;
    end
    iter = iter+1;
end
更多推荐

联合matlab和Arcgis进行netcdf格式的雪覆盖数据的重新投影栅格

图片摘要本专栏目的是将netcdf格式的雪覆盖数据进行重新投影,需要使用的工具包括matlab和Arcgis,下面进入正题。1.数据的下载与读取---matlab最近我需要读取北半球的冰雪覆盖数据,下载的是MODIS/TerraSnowCoverMonthlyL3Global0.05DegCMG,Version61,文

使用 Pandas 在 Python 中读写 JSON 文件

介绍Pandas是最常用的数据处理和可视化Python库之一。Pandas库提供了可用于高效读取、操作和可视化以各种文件格式存储的数据的类和功能。在本文中,我们将使用Python和Pandas读取和写入JSON文件。什么是JSON文件?JavaScript对象表示法(JSON)是一种以人类可读形式存储数据的数据格式。虽

Git:利用Git模拟企业级项目管理

文章目录基础知识Git分支设计规范master分支release分支develop分支feature分支hotfix分支模拟进行企业级项目管理本篇主要总结的是企业级开发模型以及利用Git模拟企业级别的项目管理方式基础知识前面已经进行了全部的关于Git的各项操作,那么Git是作用于企业项目管理的,因此了解企业是如何进行项

【离网逆变器】离网逆变器型号由一个高频DC-DC升压转换器与全桥PI控制电压源逆变器级联组成、逆变器使用带LC滤波器的SPWM调制(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Simulink实现💥1概述本文离网逆变器型号具备令人印象深刻的功能和性能。它

基于SSM的出租车管理系统的设计与实现

末尾获取源码开发语言:JavaJava开发工具:JDK1.8后端框架:SSM前端:采用JSP技术开发数据库:MySQL5.7和Navicat管理工具结合服务器:Tomcat8.5开发软件:IDEA/Eclipse是否Maven项目:是目录一、项目简介二、系统功能三、系统项目截图管理员功能实现员工功能实现​编辑驾驶员功能

如何摆脱产品同质化现象?请你做好反向行动

01:被违反的经济学原理经济学的基本原理之一是价格与需求之间存在反比关系。然而,大家见过两款功能几乎相同的垃圾袋却出现了价格与需求不成反比的情况。一款垃圾袋售价39元却能卖到20万的销量额而另一款垃圾袋售价几块却只有几千的销量你知道为什么吗?02:卖点过多会导致用户困惑有一句话说:“过犹不及”,这也适用于产品的卖点。如

基于矩阵分解算法的智能Steam游戏AI推荐系统——深度学习算法应用(含python、ipynb工程源码)+数据集(四)

目录前言总体设计系统整体结构图系统流程图运行环境模块实现1.数据预处理2.模型构建1)定义模型结构2)优化损失函数3.模型训练及保存1)模型训练2)模型保存4.模型应用1)制作页面2)模型导入及调用3)模型应用代码系统测试1.训练准确率2.测试效果3.模型应用1)程序使用说明2)测试结果相关其它博客工程源代码下载其它资

动态规划 Ⅱ

62.不同路径一个机器人位于一个mxn网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?思路:dp[i][j]=dp[i-1]dp[j]+dp[i]+dp[j-1],dp[i][j]=0when

数据结构与算法(C语言版)P1---算法效率

算法的效率:算法的时间复杂度和空间复杂度【本节目标】1.算法效率2.时间复杂度3.空间复杂度4.常见时间复杂度以及复杂oj练习1、算法效率1.1、如何衡量一个算法是的好坏如何衡量一个算法的好坏呢?比如斐波那契数列:longlongFib(intN){if(N<3)return1;returnFib(N-1)+Fib(N

MFC网络编程2——异步套接字

从上一节(MFC网络编程1——网络基础及套接字)中,我们了解了网络的部分基础知识以及套接字的使用,这一节,我们学习异步套接字的使用。Windows套接字在两种模式下执行I/O操作,阻塞模式和非阻塞模式。在阻塞模式下,在I/O操作完成前,执行操作的Winsock函数会一直等待下去,不会立即返回,例如,程序中调用了recv

分布式事务

1.分布式事务问题1.1.本地事务本地事务,也就是传统的单机事务。在传统数据库事务中,必须要满足四个原则:1.2.分布式事务分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如:跨数据源的分布式事务跨服务的分布式事务综合情况在数据库水平拆分、服务垂直拆分之后,一个业务操作通常要跨多个数据库、服务才能完成

热文推荐