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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW变速箱自动测试系统

LabVIEW变速箱自动测试系统 在农业生产中&#xff0c;采棉机作为重要的农用机械&#xff0c;其高效稳定的运行对提高采棉效率具有重要意义。然而&#xff0c;传统的采棉机变速箱测试方法存在测试效率低、成本高、对设备可能产生损害等问题。为了解决这些问题&#xff0c;开发了…

深度学习 Lecture 8 决策树

一、决策树模型&#xff08;Decision Tree Model) 椭圆形代表决策节点&#xff08;decison nodes)&#xff0c;矩形节点代表叶节点&#xff08;leaf nodes)&#xff0c;方向上的值代表属性的值&#xff0c; 构建决策树的学习过程&#xff1a; 第一步&#xff1a;决定在根节点…

windows关闭Windows Search功能

我发现windows最恶心的功能就是自动更新和搜索。自动更新就是个毒瘤&#xff0c;得到了全世界的人讨厌。 而搜索功能难用、慢和造成卡死&#xff0c;根本没有存在的必要。并且他的windows search filter服务会在每次移动大量文件后建立索引&#xff0c;持续的占用cpu和硬盘的资…

基于Springboot的影城管理系统

基于SpringbootVue的影城管理系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页展示 电影信息 电影资讯 后台登录页 后台首页 用户管理 电影类型管理 放映…

【Redis 神秘大陆】003 数据类型使用场景

三、Redis 数据类型和使用场景 Hash&#xff1a;对象类型的数据&#xff0c;购物车List&#xff1a;队列/栈Set&#xff1a;String类型的无序集合&#xff0c;intset&#xff0c;抽奖、签到、打卡&#xff0c;商品评价标签Sorted Set&#xff1a;存储有序的元素&#xff0c;zip…

跨境物流系统解决方案:构建全球化供应链的关键步骤

随着全球化的发展&#xff0c;跨境物流已成为国际贸易中不可或缺的重要环节。然而&#xff0c;由于各国之间的政治、法律、文化和语言差异&#xff0c;跨境物流常常面临诸多挑战&#xff0c;如货物清关、运输安全、物流跟踪等问题。因此&#xff0c;构建一个高效、可靠的跨境物…

什么是结构分析法

全面深刻认识经济社会现象&#xff0c;仅仅考察总量及其变化是不够的&#xff0c;还要考察经济社会系统中各构成部分及其对比关系的变动。 一、基本概念 结构分析法是在统计分组的基础上&#xff0c;计算各组成部分所占比重&#xff0c;进而分析某一总体现象的内部结构特征依时…

MongoDB的CURD(增删改查操作)

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 ✈️如果喜欢这篇文章的话 &#x1f64f;大大们可以动动发财的小手&#x1f449;&#…

顺序表(快速上手数据结构)

在介绍ArrayList之前, 我们需要先了解List. List是一个接口,它继承于Collection接口(Collection又继承于最顶层的接口Iterable). 从数据结构的角度来看,List就是一个线性表(Linear List),即n个具有相同类型元素的有限序列, 在该序列上可以执行增删查改等操作. 注意: List是一…

安装指定版本的ant-design-vue和指定版本的@ant-design/icons-vue 图标组件包

前言&#xff1a; 最近在完成公司的项目时&#xff0c;为了兼容其他的版本&#xff0c;需要安装指定版本的ant-design-vue和ant-design/icons-vue 图标组件包&#xff0c;安装成功之后&#xff0c;分享如下&#xff1a; 安装命令&#xff1a; ant-design-vue&#xff1a; 不…

uni-app中页面生命周期与vue生命周期的执行顺序对比

应用生命周期 uni-app 支持如下应用生命周期函数&#xff1a; 函数名说明平台兼容onLaunch当uni-app 初始化完成时触发&#xff08;全局只触发一次&#xff09;&#xff0c;参数为应用启动参数&#xff0c;同 uni.getLaunchOptionsSync 的返回值onShow当 uni-app 启动&#x…

vue-treeselect 的基本使用

vue-treeselect 的基本使用 1. 效果展示2. 安装 插件3. 引入组件4. 代码 1. 效果展示 2. 安装 插件 vue-treeselect是一个树形的下拉菜单&#xff0c;至于到底有多少节点那就要看你的数据源有多少层了&#xff0c;挺方便的。下面这个这个不用多说吧&#xff0c;下载依赖 npm in…

根据ELK官网指引部署ELK- ECK-Elastic-​ Kibana​-Learn-ELK-(一)

**Attention: 1、You need open the ELK official website and step by step to deploy . 2、If you copy my command ,you must check them if it not match your environment . 一、official website Elastic documentation | Elastic Check there. 二、 ECK简介…

leetcode-合并两个有序链表

目录 题目 图解 方法一 方法二 代码(解析在注释中) 方法一 ​编辑方法二 题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1…

元象发布首个MoE大模型XVERSE-MoE-A4.2B:仅4.2B激活量,性能堪比13B级别

前言 近日,深圳元象科技正式发布了其首个基于混合专家(Mixture of Experts,MoE)架构的大型语言模型 - XVERSE-MoE-A4.2B。这款模型总参数量高达258亿,但在推理过程中仅需激活4.2亿参数,却展现出了媲美130亿参数大模型的性能表现,可谓是当前MoE架构领域的一大突破。 作为元象公…

Python | Leetcode Python题解之第31题下一个排列

题目&#xff1a; 题解&#xff1a; class Solution:def nextPermutation(self, nums: List[int]) -> None:i len(nums) - 2while i > 0 and nums[i] > nums[i 1]:i - 1if i > 0:j len(nums) - 1while j > 0 and nums[i] > nums[j]:j - 1nums[i], nums[j…

【数据结构(七)】二叉树

❣博主主页: 33的博客❣ ▶文章专栏分类: Java从入门到精通◀ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你学更多数据结构的知识 目录 1.前言2.树形结构2.1树的概念2.2常见概念2.3树的表示形式 3.二叉树3.1概念3…

图片转表格怎么显示两位小数字?

图片转表格的核心机制在于利用OCR技术&#xff0c;将图片上的表格文字精准转化为计算机能够理解的表格数据。然而&#xff0c;在进行这一转换过程中&#xff0c;为了防止出现科学计数法等复杂显示方式&#xff0c;程序默认会将所有单元格设置为字符串格式。这虽然保证了转换的准…

音频---数字mic

一、常见的数字mic pdm麦通过codec芯片将数字麦转换为i2s信号输入到SOC 纯pdm麦就是直接进入SOC的pdm接口&#xff0c;走的是PDM信号&#xff0c;PDM信号就是两个线&#xff0c;一根数据线一根时钟线&#xff08;如顺芯ES7201/7202把MIC信号转换成PDM&#xff09;。 二、DMIC…