当前位置: 首页 > news >正文

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

相关文章:

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

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

Excel文件转Asc文件

单个转换 import os import pandas as pdfilename (10)result01-1.xlsx df pd.read_excel(filename) # 读取Excel文件# 将数据保存为ASC格式 asc_filename os.path.splitext(filename)[0] .asc # 获取文件名并替换扩展名 with open(asc_filename, w) as file:# 写入文件…...

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题7

【题目】【信息安全管理与评估】2022年国赛高职组“信息安全管理与评估”赛项样题7 信息安全管理与评估 网络系统管理 网络搭建与应用 云计算 软件测试 移动应用开发 任务书&#xff0c;赛题&#xff0c;解析等资料&#xff0c;知识点培训服务 添加博主wx&#xff1a;liuliu548…...

Webrtc 信令服务器实现

webrtc建联流程图 由上图可知&#xff0c;所谓的信令服务器其实就是将peer的offer/candidate/answer传给对端而已。这样的话实现方式就有很多种了&#xff0c;目前普遍的方式HTTP/HTTPS&#xff0c;WS/WSS。像webrtc-demo-peerconnection就是实现HTTP这种方式。本文使用WS&…...

【Blockchain】连接智能合约与现实世界的桥梁Chainlink

去中心化预言机试图实现依赖因果关系而不是个人关系的去信任和确定性结果。它以与区块链网络相同的方式实现这些结果&#xff0c;即在许多网络参与者之间分配信任。通过利用许多不同的数据源并实施不受单个实体控制的预言机系统&#xff0c;去中心化的预言机网络有可能为智能合…...

解决EasyPoi导入Excel获取不到第一列的问题

文章目录 1. 复现错误2. 分析错误2.1 导入的代码2.2 DictExcel实体类2.2 表头和标题3. 解决问题1. 复现错误 使用EasyPoi导入数据时,Excel表格如下图: 但在导入时,出现如下错误: name为英文名称,在第一列,Excel表格有值,但导入的代码中为null,就很奇怪? 2. 分析错误 …...

Vue 阶段练习:记事本

将 Vue快速入门 和 Vue 指令的学习成果应用到实际场景中&#xff08;如该练习 记事本&#xff09;&#xff0c;我们能够解决实际问题并提升对 Vue 的技能掌握。 目录 功能展示 需求分析 我的代码 案例代码 知识点总结 功能展示 需求分析 列表渲染删除功能添加功能底部统计…...

JavaScript判断受访域名,调用不同的js文件

比如&#xff1a;我有三个域名&#xff1a; ① dengoo.net ② jfzm.cc ③ ceeha.com 如果当前访问的是 dengoo.net 域名及域名下页面&#xff0c;则调用 a.js 如果当前访问的是 jfzm.cc 域名及域名下页面&#xff0c;则调用 b.js 如果当前访问的是 ceeha.com 域名及域名下…...

下载软件时的Ubuntu x86_64-v2、skylake、aarch64版本分别代表什么?

Ubuntu-x86_64-v2、Ubuntu-x86_64-skylake和Ubuntu-aarch64都是Ubuntu的不同版本或变种&#xff0c;它们之间的主要区别在于所支持的硬件架构和针对特定硬件的优化。 Ubuntu-x86_64-v2&#xff1a; 这是基于x86_64&#xff08;也称为AMD64或Intel 64&#xff09;架构的Ubuntu版…...

数字化社交的引擎:解析Facebook的影响力

Facebook&#xff0c;作为全球最大的社交媒体平台&#xff0c;已经深深地融入了我们的日常生活和文化中。它不仅仅是一个简单的社交工具&#xff0c;更是一个复杂的数字生态系统&#xff0c;影响着我们的社交模式、文化认同以及信息获取方式。在这篇文章中&#xff0c;我们将深…...

淘宝API商品详情数据在数据分析行业中具有不可忽视的重要性

淘宝商品详情数据在数据分析行业中具有不可忽视的重要性。这些数据为商家、市场分析师以及数据科学家提供了丰富的信息&#xff0c;有助于他们更深入地理解市场动态、消费者行为以及商品竞争态势。以下是淘宝商品详情数据在数据分析行业中的重要性体现&#xff1a; 请求示例&a…...

【产品】ANET智能通信管理机 物联网网关 电力监控/能耗监测/能源管理系统

产品概述 本系列智能通信管理机是一款采用嵌入式硬件计算机平台&#xff0c;具有多个下行通信接口及一个或者多个上行网络接口&#xff0c;用于将一个目标区域内所有的智能监控/保护装置的通信数据整理汇总后&#xff0c;实时上传主站系统&#xff0c;完成遥信、遥测等能源数据…...

R语言数据分析案例

在R语言中进行数据分析通常涉及数据的导入、清洗、探索、建模和可视化等步骤。以下是一个简化的案例&#xff0c;展示了如何使用R语言进行数据分析&#xff1a; 1. 数据导入 首先&#xff0c;你需要将数据导入R环境中。这可以通过多种方式完成&#xff0c;例如使用read.csv()…...

vscode debug 配置:launch.json

打开新项目左边的“运行和调试” 点击蓝色字体“创建 launch.json 文件” 选择上方“python” 选择“Python 文件 调试当前正在运行的Python文件” 配置launch.json文件内容&#xff1a; {// 使用 IntelliSense 了解相关属性// 悬停以查看现有属性的描述。// 欲了解更多信息&a…...

idea工具使用Tomcat创建jsp 部署servlet到服务器

使用tomcat创建jsp 在tomcat官网中下载对应windows版本的tomcat文件 Apache Tomcat - Welcome! 解压到系统目录中&#xff0c;记得不要有中文路径 新建一个java项目 点击右上角 点击加号 找到Tomcat Service的 Local 点击右下角的Fix一下&#xff0c;然后ok关闭 再重新打开一…...

MyBatisPlus自定义SQL

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:MyBatisPlus自定义SQL 📚个人知识库: Leo知识库,欢迎大家访问 目录 1.前言☕…...

使用formio和react实现在线表单设计

formiojs 是一个开源的在线表单设计工具&#xff0c;今天看看怎样在 react js 中使用 formiojs。 首先创建一个react工程 npx create-react-app my-react-formio-app安装依赖 cd my-react-formio-app npm install formio/react npm install formio/js另外&#xff0c;考虑样…...

MySQL 基础使用

文章目录 一、Navicat 工具链接 Mysql二、数据库的使用1.常用数据类型2. 建表 create3. 删表 drop4. insert 插入数据5. select 查询数据6. update 修改数据7. delete 删除记录truncate table 删除数据 三、字段约束字段1. 主键 自增delete和truncate自增长字段的影响 2. 非空…...

✌粤嵌—2024/4/3—合并K个升序链表✌

代码实现&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* merge(struct ListNode *l1, struct ListNode *l2) {if (l1 NULL) {return l2;}if (l2 NULL) {return l1;}struct Lis…...

企业微信主体的修改方法

企业微信变更主体有什么作用&#xff1f;当我们的企业因为各种原因需要注销或已经注销&#xff0c;或者运营变更等情况&#xff0c;企业微信无法继续使用原主体继续使用时&#xff0c;可以申请企业主体变更&#xff0c;变更为新的主体。企业微信变更主体的条件有哪些&#xff1…...

C++的封装(十):数据和代码分离

封装的好处当然是非常多的。就不一一例举了。但封装也制造了访问壁垒。如果你是初学者&#xff0c;当你面对一堆封装好的C类一筹莫展&#xff0c;不知道从哪里下手时… 可以试试这个方法&#xff0c;数据和代码分离。 就是说&#xff0c;class只写方法&#xff0c;数据都放到…...

第十五届蓝桥杯大赛软件赛省赛 C/C++ 大学 B 组(基础题)

试题 C: 好数 时间限制 : 1.0s 内存限制: 256.0MB 本题总分&#xff1a;10 分 【问题描述】 一个整数如果按从低位到高位的顺序&#xff0c;奇数位&#xff08;个位、百位、万位 &#xff09;上 的数字是奇数&#xff0c;偶数位&#xff08;十位、千位、十万位 &…...

模板的进阶

目录 非类型模板参数 C11的静态数组容器-array 按需实例化 模板的特化 函数模板特化 类模板特化 全特化与偏特化 模板的分离编译 总结 非类型模板参数 基本概念&#xff1a;模板参数类型分为类类型模板参数和非类类型模板参数 类类型模板参数&#xff1a;跟在class…...

微服务中Dubbo通俗易懂讲解及代码实现

当你在微服务架构中需要不同服务之间进行远程通信时&#xff0c;Dubbo是一个优秀的选择。Dubbo是一个高性能的Java RPC框架&#xff0c;它提供了服务注册、发现、调用、负载均衡等功能&#xff0c;使得微服务之间的通信变得简单而高效。 让我们来看一下Dubbo的通俗易懂的解释和…...

Unity HDRP Release-Notes

&#x1f308;HDRP Release-Notes 收集的最近几年 Unity各个版本中 HDRP的更新内容 信息收集来自自动搜集工具&#x1f448; &#x1f4a1;HDRP Release-Notes 2023 &#x1f4a1;HDRP Release-Notes 2022 &#x1f4a1;HDRP Release-Notes 2021...

Chrome将网页保存为PDF的实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…...

zotero7+Chat GPT实现ai自动阅读论文

关于这一部分的内容我在哔哩哔哩上发布了视频教程 视频链接见&#xff1a; zotero7GPT AI快速阅读文献_哔哩哔哩_bilibili 相关下载的官方链接如下&#xff1a; 1、zotero7 测试版官方下载链接&#xff1a; https://www.zotero.org/support/beta_builds 2、 InfiniCLOUD 云…...

STM32外设配置以及一些小bug总结

USART RX的DMA配置 这里以UART串口1为例&#xff0c;首先点ADD添加RX和TX配置DMA&#xff0c;然后模式一般会选择是normal&#xff0c;这个模式是当DMA的计数器减到0的时候就不做任何动作了&#xff0c;还有一种循环模式&#xff0c;是计数器减到0之后&#xff0c;计数器自动重…...

【数据结构与算法】:10道链表经典OJ

目录 1. 移除链表元素2. 反转链表2.1反转指针法2.2 头插法 3. 合并两个有序链表4. 分隔链表5. 环形链表6. 链表的中间节点7. 链表中倒数第K个节点8. 相交链表9. 环形链表的约瑟夫问题10. 链表的回文结构 1. 移除链表元素 思路1&#xff1a;遍历原链表&#xff0c;将 val 所在的…...

Python SQL解析和转换库之sqlglot使用详解

概要 Python SQLGlot是一个基于Python的SQL解析和转换库,可以帮助开发者更加灵活地处理和操作SQL语句。本文将介绍SQLGlot库的安装、特性、基本功能、高级功能、实际应用场景等方面。 安装 安装SQLGlot库非常简单,可以使用pip命令进行安装: pip install sqlglot安装完成后…...

建设工程业绩查询网站/百度收录技术

<?php //建立连接对象 try {$pdo new PDO(mysql:hostlocalhost;dbnametest,testuser,pass);$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); //setAttribute PDO对象的方法&#xff0c;PDO&#xff1a;&#xff1a;表示这些变量是我们所使用的PDO的一…...

钟落潭有没有做网站的/360搜索引擎下载

计算机网络就在我们身边 1.基本概念、基本原理和基本方法 RTT&#xff1a;往返传播时延 &#xff0c;时间越长&#xff0c;网络越卡 2.体系结构、网络协议和网络设备 微信聊天&#xff1a;发送出去的 图片、文字等在网络链路层是如何传输&#xff0c;转化成机器语言&#xff…...

云南文山疫情/seo教程之关键词是什么

这道阶乘计算的题是算法里的经典题吧&#xff0c;记得刚上大一时&#xff0c;隔壁班布置了50的阶乘&#xff0c;当时用的C语言&#xff0c;用普通的方法是会越界的。但是后来也从来没有重新思考过该题。直到今日&#xff0c;参考了好多CSDN&#xff0c;发现除了运用Java的BigIn…...

WordPress好像微博一样插件/seo在线推广

本文为joshua317原创文章,转载请注明&#xff1a;转载自joshua317博客 Java中创建String对象的两种方式 - joshua317的博客 Java中创建String对象的两种方式 一、Java中创建String对象的两种方式 //方式一&#xff1a;通过字符串常量的方式 String str1 "joshua317&qu…...

wordpress百度不收录文章/百度seo优化排名软件

前天一个同事十万火急找我Alan&#xff0c;我的照片放到电脑打不开呀​仔细一看原来他是苹果11pro把照片导入到非苹果电脑之后打不开&#xff0c;也无法查看更加无法上传到微信公众号平台后面&#xff0c;我查看了一下图片的格式heic这不就是苹果独有的照片格式吗&#xff1f;小…...

wordpress公司展示网站/南宁seo网络优化公司

硬盘分区 fdisk /dev/sdb : 新建分区 fdisk -l /dev/sdb &#xff1a;查看磁盘信息 df &#xff08;-h&#xff09;:查看分区信息 新建主分区新建扩展分区partprobe :新建完分区后用来更新分区列表 格式化 mkfs.ext4 /dev/sda1 : ext4为文件系统类型 注意&#xff1a;拓展分区不…...