k-means聚类算法的MATLAB实现及可视化

K-means算法是一种无监督学习算法,主要用于数据聚类。其工作原理基于迭代优化,将数据点划分为K个集群,使得每个数据点都属于最近的集群,并且每个集群的中心(质心)是所有属于该集群的数据点的平均值。以下是K-means算法的基本工作步骤: 

  1. 初始化
    • 选择要将数据集分成的集群数量K。
    • 随机选择K个数据点作为初始质心(即集群中心)。这些质心可以是从样本中随机选取的,也可以根据先验知识或经验来选择。
  2. 分配数据点到集群
    • 对于数据集中的每个数据点,计算其与每个质心的距离(通常使用欧氏距离)。
    • 将每个数据点分配到距离其最近的质心所在的集群。
  3. 更新质心
    • 对于每个集群,计算属于该集群的所有数据点的平均值(坐标的均值)。
    • 将计算出的均值作为新的质心。
  4. 迭代
    • 重复步骤2和3,直到满足停止条件。停止条件可以包括质心不再显著变化(即新旧质心之间的差异很小),或者算法达到了预定的最大迭代次数。
  5. 输出
    • 输出最终的K个集群以及每个集群的质心。

K-means算法的目标是最小化每个数据点到其所属集群质心的平方距离之和,即最小化集群内的平方误差。由于初始质心是随机选择的,因此不同的初始质心可能会导致不同的聚类结果。为了获得更稳定和更好的聚类效果,有时会多次运行K-means算法,并选择最佳的聚类结果。

在K-means算法中,K值(即要形成的集群数量)的确定是一个重要但具有挑战性的问题,因为不同的K值可能会导致不同的聚类结果。没有一种通用的方法可以直接确定最佳的K值,但可以通过以下一些策略来帮助你选择和评估不同的K值:

  1. 肘部法则(Elbow Method)
    这种方法通过绘制不同K值对应的聚类内误差和(Sum of Squared Errors, SSE)或畸变(Distortion)的曲线来工作。随着K值的增加,SSE通常会减小,因为更多的集群意味着每个集群中的数据点更紧密。但是,当K值增加到一定程度时,SSE的减少会变得不那么显著,形成一个类似于“肘部”的转折点。这个转折点通常被认为是最佳的K值。

  2. 轮廓系数(Silhouette Analysis)
    轮廓系数是评估聚类效果的一种方法,它结合了凝聚度和分离度两种度量。对于每个数据点,轮廓系数计算其到同一集群内其他点的平均距离(凝聚度)与其到最近邻集群内点的平均距离(分离度)的比值。整个数据集的轮廓系数是所有数据点轮廓系数的平均值。较高的轮廓系数值通常表示较好的聚类效果。你可以通过绘制不同K值的轮廓系数来找到最佳的K值。

  3. 间隙统计量(Gap Statistic)
    间隙统计量是一种通过比较实际数据的聚类结果与随机数据(具有相同分布)的聚类结果来评估最佳K值的方法。当实际数据的聚类结果显著好于随机数据的聚类结果时,可以认为找到了一个合适的K值。

  4. 层次聚类(Hierarchical Clustering)
    你可以首先使用层次聚类来确定大致的集群数量,然后再使用K-means算法进行细化。层次聚类可以提供一个关于数据集中可能存在多少自然集群的直观感受。

  5. 基于业务或先验知识
    在某些情况下,你可能已经知道数据集中应该有多少个集群,这通常基于业务逻辑或先验知识。例如,你可能正在分析一个包含三个不同产品类别的数据集,因此自然会选择K=3。

  6. 稳定性方法
    通过多次运行K-means算法并评估结果的稳定性来确定K值。如果对于不同的初始条件,算法都能产生相似的聚类结果,那么可以认为这个K值是稳定的。

请注意,没有一种方法是绝对正确的,每种方法都有其优点和局限性。在实际应用中,你可能需要结合多种方法来确定最佳的K值。同时,还需要考虑算法的计算复杂度和数据的特性。

clear;clc;clf;
% 假设你有一个名为data的数据集,它是一个n×d的矩阵,其中n是数据点的数量,d是每个数据点的维度。  
% 你想将数据点划分为k个集群。  

rng(1314);%固定随机数种子
% 生成一些随机数据作为示例  
data = rand(100, 3);  % 100个2维数据点  

%绘图
figure(1);
scatter3(data(:,1),data(:,2),data(:,3),'filled');

% 定义要测试的K值范围  
K_values = 1:9; % 例如,测试从1到9的K值  
  
% 初始化一个用于存储SSE的数组  
SSE = zeros(size(K_values));  
  
% 对每个K值运行K-means算法并计算SSE  
for i = 1:length(K_values)  
    k = K_values(i);  
    [C,idx] = mykmeans(data, k);  
    % 计算SSE  
    SSE(i) = sum(sum((data - C(idx,:)).^2,2));  
end  
  
% 绘制肘部图  
figure(2);  
plot(K_values, SSE, 'bx-');  
xlabel('Number of clusters K');  
ylabel('Sum of squared errors (SSE)');  
title('Elbow Method For Optimal K');  
grid on;  
  
% 找出“肘部”点,这里简单地通过观察图形来确定  
% 在实际应用中,可以使用更复杂的策略,比如计算SSE变化的百分比等  
dsse = abs(diff(SSE));
bestK = find(dsse < 1 , 1, 'first'); 
fprintf('Suggested number of clusters: %d\n', bestK);  
hold on;  
plot(bestK, SSE(bestK), 'ro', 'MarkerSize', 10, 'LineWidth', 2); % 在图上标出建议的K值点  
legend('SSE for each K', 'Suggested K');  
hold off;

在下图可以观察到,k<4时曲线下降迅速,k>4时曲线下降出现明显放缓,因此K取4: 

K-means算法是一种非常常见的聚类算法,用于将数据点划分为K个集群。在上述数据和K取4的条件下,以下是一个简单的K-means算法的MATLAB实现示例:

% 选择要划分的集群数量  
k = bestK;  
  
% 运行k-means算法  
[centroids, idx] = mykmeans(data, k);  
  
% 绘制结果  
colors = {'r','b','g','y'}; % 生成k种不同的HSV颜色 
figure;  
for i = 1:k  
    % 提取属于当前组别的数据点  
    new_data = data(idx == i, :);  
    % 绘制当前组别的数据点,使用不同的颜色和标记  
    scatter3(new_data(:,1), new_data(:,2), new_data(:,3),colors{i},'filled');
    hold on; 
end 
% scatter3(data(:,1),data(:,2),data(:,3),idx);  
h2 = plot3(centroids(:,1), centroids(:,2),centroids(:,3), 'kx', 'MarkerSize', 15, 'LineWidth', 3);  
legend('类别1','类别2','类别3','类别4','中心点');
hold off;

function [centroids, idx] = mykmeans(data, k)  
    % 初始化  
    [n, ~] = size(data);  
    centroids = data(randperm(n, k), :);  % 随机选择k个数据点作为初始质心  
    prev_centroids = centroids;  
    max_iters = 100;  % 最大迭代次数  
      
    for iter = 1:max_iters  
        % 分配数据点到最近的质心  
        idx = zeros(n, 1);  
        for i = 1:n  
            distances = sum((data(i,:) - centroids).^2, 2);  
            [~, min_idx] = min(distances);  
            idx(i) = min_idx;  
        end  
          
        % 重新计算质心  
        for i = 1:k  
            points = data(idx == i, :);  
            if ~isempty(points)  
                centroids(i,:) = mean(points);  
            end  
        end  
          
        % 检查收敛  
        if all(centroids == prev_centroids)  
            break;  
        end  
        prev_centroids = centroids;  
    end  
end

初始三维散点图对比k-means聚类后的三维散点图如下: 

需要注意的是,K-means算法对于初始质心的选择非常敏感,并且可能陷入局部最小值。此外,它假设集群的形状是球形的,并且集群的大小和密度大致相同,这在处理复杂形状或大小差异较大的集群时可能不是最优的。因此,在实际应用中,可能需要根据数据的特性和需求来选择和调整算法参数,或者考虑使用其他更复杂的聚类算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/551174.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中文核心计算机视觉项目分享:多通道注意力机制得农业作物图像识别检测-完整代码+论文

创新点&#xff1a; 在苹果数据集中&#xff0c;存在遮挡、不同角度的拍摄、光照变化等问题&#xff0c;导致目标检测的性能下降。为了解决这些问题&#xff0c;提出智能感知优化网络和多路径特征融合网络。 智能感知优化网络&#xff1a;帮助模型更好地关注感兴趣的目标区域&…

电商技术揭秘二十七:跨境电商物流解决方案

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

C语言学习笔记之指针(二)

指针基础知识&#xff1a;C语言学习笔记之指针&#xff08;一&#xff09;-CSDN博客 目录 字符指针 代码分析 指针数组 数组指针 函数指针 代码分析&#xff08;出自《C陷阱和缺陷》&#xff09; 函数指针数组 指向函数指针数组的指针 回调函数 qsort() 字符指针 一…

试用模方时,系统一直提示“未找到有效配置文件” ,是需要安装3dsmax吗 ?

问题如图 把文件放在认证管理服务安装目录下即可。&#xff08;注&#xff1a;因平台限制&#xff0c;需要文件的直接后台私信即可哦&#xff09; 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件…

软考 - 系统架构设计师 - 数据架构真题

问题 1&#xff1a; (相当于根据题目中提到的 4 点&#xff0c;说一下关系型数据库的缺点) &#xff08;1&#xff09;.用户数量的剧增导致并发负载非常高&#xff0c;往往会达到每秒上万次读写请求。关系数据库应付每秒上万次的 SQL 查询还勉强可以&#xff0c;但是应付上万…

车载摄像头夜景增强技术解决方案,解锁高质量夜间视觉体验

随着汽车智能化的快速发展&#xff0c;车载摄像头已成为驾驶辅助系统的核心组件。尤其在夜间行驶时&#xff0c;摄像头所捕捉的画面质量直接关系到驾驶者的安全感知和行车决策。然而&#xff0c;传统的车载摄像头在夜间往往面临噪声多、画质差等挑战&#xff0c;难以满足用户对…

goland2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 Goland 是一款由 JetBrains 公司开发的集成开发环境&#xff08;IDE&#xff09;&#xff0c;专门用于 Go 语言的开发。它提供了丰富的功能和工具&#xff0c;帮助开发者更高效地编写、调试和管理 Go 语言项目。 功能特点&#x…

什么是Rust语言?探索安全系统编程的未来

&#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来 文章目录 &#x1f680; 什么是Rust语言&#xff1f;探索安全系统编程的未来摘要引言正文&#x1f4d8; Rust语言简介&#x1f31f; 发展历程&#x1f3af; Rust的技术意义和优势&#x1f4e6; Rust解决的问题…

基于逐笔数据合成高频订单簿:DolphinDB 订单簿引擎

订单簿是交易市场上买卖双方正在报价的不同价格的列表。订单簿快照反应了特定时刻市场上的交易意图&#xff0c;比如交易活跃的证券标的往往有着密集的订单簿。订单簿快照对量化金融的交易策略、风险管理和市场分析等方面都具有重要意义。 通常交易所可以提供实时和历史的行情…

无界系统实战课:全体系落地无界改版后选择、出价、高投产做付费引流-38节

课程内容&#xff1a; 001.01、如何快速学习无界推广(新学员先听).mp4 002.02、如何快速上手和适应无界(老学员先听).mp4 003.03、无界推广在运营中的作用(必听).mp4 004.04、无界多工具如何选择(必听).mp4 005.05、自定义出价、控成本、最大化底层逻辑和选择(必听).mp4 …

postgres插件部署+函数开发 - pl/java安装(centos7)

一、安装postgres sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm sudo yum install -y postgresql11-server sudo /usr/pgsql-11/bin/postgresql-11-setup initdb sudo systemctl enable postg…

stable diffusion--小白学习步骤

1.看一下Unet网络的讲解_哔哩哔哩_bilibili&#xff0c;了解Unet网络 2.看一下【生成式AI】Diffusion Model 原理剖析 (1/4)_哔哩哔哩_bilibili&#xff0c;起码要看前3/6个视频 3.看一下超详细的扩散模型&#xff08;Diffusion Models&#xff09;原理代码 - 知乎 (zhihu.co…

前端-vue项目debugger调试

一、前言 有的时候接受同事一个项目&#xff0c;用框架不一样&#xff0c;写的也不太规范&#xff0c;那么就需要打断点去学习改项目的流程了。 那么vue项目是如何debugger调试呢&#xff1f; 二、操作 大概理解一下&#xff0c;vue项目启动&#xff0c;大概是先启动框架&am…

nginx 卸载和安装超详细教程

一、前言 由于现在nginx有版本漏洞&#xff0c;所以很多安装过nginx的需要卸载重新安装&#xff0c;没安装过的&#xff0c;切记不要乱安装版本。 OK以上版本切记不能再用了&#xff01; 废话不多说&#xff0c;直接上干货。 二、卸载 1、停止Nginx进程 命令行停止&#xf…

【C++成长记】C++入门 | 类和对象(上) |面向过程和面向对象初步认识、类的引入、类的定义、类的访问限定符及封装

&#x1f40c;博主主页&#xff1a;&#x1f40c;​倔强的大蜗牛&#x1f40c;​ &#x1f4da;专栏分类&#xff1a;C❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 一、面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步…

【日常记录】【CSS】利用动画延迟实现复杂动画

文章目录 1、介绍2、原理3、代码4、参考链接 1、介绍 对于这个效果而言&#xff0c;最先想到的就是 监听滑块的input事件来做一些操作 ,但是会发现&#xff0c;对于某一个节点的时候&#xff0c;这个样式操作起来比较麻烦 只看这个代码的话&#xff0c;发现他用的是动画&#x…

第47期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

通过超分辨率像素引导的Scribble Walking和逐类对比正则化的弱监督医学图像分割(SC-Ne)论文速读

目录 Weakly Supervised Medical Image Segmentation via Superpixel-Guided Scribble Walking and Class-Wise Contrastive Regularization摘要方法实验结果 Weakly Supervised Medical Image Segmentation via Superpixel-Guided Scribble Walking and Class-Wise Contrastiv…

召唤新版「数据库 GitOps 」体验官,赢取新款 Bytebase 限量周边!

距上一次「产品体验官&#xff5c;基于 GitHub 的数据库 CI/CD」已有一年半了⌛️ Bytebase 于上周发布了 Bytebase 2.15.0 - GitOps 整体升级 &#x1f38a; 全新的 GitOps 体验&#xff0c;更易上手&#xff0c;更简洁&#xff01;&#x1f929; 不管你是否使用过 Byteb…

【SpringBoot实战篇】登录认证

&#x1f340;&#x1f338;明确需求--接口文档--思路分析--开发--测试&#x1f338;&#x1f340;&#x1f495; 1 明确需求 2 接口文档 登录 3 思路分析 UserServic、UserMapper在注册的时候已经实现 现在我们重点看UserController 控制器 4 开发&#xff08;实现&#xff0…