matlab实现kmeans聚类算法

2023-10-27

kmeans聚类算法是一种简单实用的聚类算法,matlab自带函数kmeans可直接对数据进行kmeans聚类。为了方便更好地掌握kmeans聚类算法,今天我们自己来实现一个弱化的版本mykmeans。

mykmeans输入包含三项,分别为聚类所使用的数据data,data每一行代表一个样本,每一列代表一个特征;聚类中心数量numclass;第三项为所使用的距离的定义,默认情况下为欧式距离。

function [cluster,clusterhistory]=mykmeans(data,numclass,varargin)
% kmeans聚类。
% 聚类过程动画显示
% INPUTS:
% data:每一行代表一个样本,每一列代表一个特征
% numclass:聚类中心的数量
% varargin{1}: 距离定义。支持euclidean(默认)、hamming
% OUTPUT:
% cluster: numsample行的列向量,代表每个样本的分类归属
% clusterhistory{i}.cluster第i次迭代的聚类
% clusterhistory{i}.core第i次迭代的聚类中心
%
% 公众号【数学建模公会】,HCLO4,20190902

if nargin==2
    method='euclidean';
else
    method=varargin{1};
end
% 初始化聚类中心坐标,在数据点中随机选择numclass个点作为初始聚类中心。
numsample=size(data,1);
temp=randperm(numsample);
core=data(temp(1:numclass),:);
dis=caldis(data,core,method); %存储每个样本到当前聚类中心的距离


% 执行迭代过程
maxIter=20; % 最大迭代次数
numiter=1;
clusterhistory=cell(1,maxIter);
while 1
    
    newcore=zeros(size(core));
    % 迭代聚类中心
    [~,ind]=min(dis,[],2); %计算每个sample归属于哪个聚类中心,如果某个聚类中心没有一个点?
    for i=1:numclass
        newcore(i,:)=mean(dis(ind==i,:));
    end
    clusterhistory{numiter}.cluster=ind;
    clusterhistory{numiter}.core=core;
    
    if all(newcore(:)==core(:))||numiter>=maxIter  % 迭代终止条件,聚类中心不再改变
        cluster=ind;
        break
    end
    
    core=newcore;
    dis=caldis(data,core,method); 
    
    numiter=numiter+1;
    
end
    

clusterhistory=clusterhistory(1:numiter);


end % mykmeans



function dis=caldis(data,core,method)
%计算每个样本到当前聚类中心的距离
numsample=size(data,1);
numclass=size(core,1);
dis=zeros(numsample,numclass);
switch method
    case 'euclidean'
        for i=1:numclass
            dis(:,i)=sqrt(sum((data-repmat(core(i,:),numsample,1)).^2,2));
        end
    case 'hamming'
        for i=1:numclass
            dis(:,i)=mean(data~=repmat(core(i,:),numsample,1),2);
        end
end

下面一段代码用于测试mykmeans和kmeans的运行结果。生成两组服从二维高斯分布的数据,作为两个数据类别,分别使用mykmeans和matlab自带的kmeans函数进行聚类分析。

% 测试mykmeans函数
% 公众号【数学建模公会】,HCLO4,20190902

% 生成模拟数据,平面上的两组点,均服从二维高斯分布
mu1=[2,8];
sigma1=[2,2];
mu2=[8,2];
sigma2=[3,3];

numsample1=100;
numsample2=200;
data1=zeros(numsample1,2);
data1(:,1)=normrnd(mu1(1),sigma1(1),numsample1,1);
data1(:,2)=normrnd(mu1(2),sigma1(2),numsample1,1);

data2=zeros(numsample2,2);
data2(:,1)=normrnd(mu2(1),sigma2(1),numsample2,1);
data2(:,2)=normrnd(mu2(2),sigma2(2),numsample2,1);

data=[data1;data2];

tic,
[cluster1,clusterhistory]=mykmeans(data,2);
toc
M=getFrame_Kmeans(data,clusterhistory); % 生成聚类动图

tic,
cluster2=kmeans(data,2);
toc

下面的函数实现mykmeans聚类过程的可视化,仅针对二维数据和三维数据类型。

function M=getFrame_Kmeans(data,clusterhistory)
% kmeans聚类过程可视化程序。只能对二维和三维数据可视化!
%
% INPUTS: 
% data: 聚类用的数据,每行代表一个样本,每列代表一个特征
% clusterhistory: mykmeans函数输出的聚类过程数据
%
% OUTPUT:
% kmeans聚类过程的动画。

dimension=size(data,2);
if dimension>3 % 若三维以上,只能通过pca降维处理
    error('无法实现高于三维的数据的聚类可视化')
end

colorset=cell(1,1000);
colorset(1:8)={'r','g','b','k','c','m','y','k'};
for i=9:1000 %如果聚类中心数量大于8,就使用随机的颜色。
    colorset{i}=rand(1,3);
end

numcore=length(unique(clusterhistory{1}.cluster));
numiter=length(clusterhistory);

for k=1:numiter
    figure
    hold on
    switch dimension
        case 2
            for i=1:numcore
                ind=clusterhistory{k}.cluster==i;
                scatter(data(ind,1),data(ind,2),6,colorset{i})
                core=clusterhistory{k}.core;
                plot(core(i,1),core(i,2),[colorset{i},'.'],'MarkerSize',20)
            end
        case 3
            for i=1:numcore
                ind=clusterhistory{k}.cluster==i;
                scatter3(data(ind,1),data(ind,2),data(ind,3),6,colorset{i})
                core=clusterhistory{k}.core;
                plot3(core(i,1),core(i,2),core(i,3),colorset{i},'MarkerSize',6)
            end
    end
    
    M(k)=getframe(gcf);
    frame = getframe(gcf); 
    im = frame2im(frame);     %将影片动画转换为编址图像,因为图像必须是index索引图像
    imshow(im);
    [I,map] = rgb2ind(im,20); %将真彩色图像转化为索引图像
    if k==1
        imwrite(I,map,'kmeans.gif','gif','Loopcount',inf,'DelayTime',0.3);     %Loopcount只是在i==1的时候才有用
    else
        imwrite(I,map,'kmeans.gif','gif','WriteMode','append','DelayTime',1);%DelayTime:帧与帧之间的时间间隔
    end
    
    
    close(gcf);
    
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab实现kmeans聚类算法 的相关文章

  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • FFT 的功率谱密度

    我有一段代码可以获取部分信号的 FFT 现在我正在尝试获取 PSD Fs 44100 cj sqrt 1 T 6 dt 1 Fs left test 1 right test 2 time 45 interval 636 w range t
  • matlab mex 文件和 C++ dll (Windows)

    我有一个带有 Test 类的 DLL 标题 class MY EXPORT Test public int doit const string str 和来源 int Test doit const string str return in
  • 计算数组中接下来的 n 个元素的乘积

    我想计算下一个的乘积n矩阵的相邻元素 号码n要相乘的元素数应在函数的输入中给出 例如 对于此输入 我应该从第一个开始计算每 3 个连续元素的乘积 p ind max product 1 2 2 1 3 1 3 这给出了 1 2 2 2 2
  • 检查Matlab中脚本需要使用的函数

    我有一个别人写的代码包 我正在运行一个脚本 它调用一些函数 这些函数又调用更多函数 等等 我想获取不是 MATLAB 内置函数但属于包的一部分的函数列表 我尝试使用matlab codetools requiredFilesAndProdu
  • 两个 y 轴与相同的 x 轴[重复]

    这个问题在这里已经有答案了 可能的重复 在单个图中绘制 4 条曲线 具有 3 个 y 轴 https stackoverflow com questions 1719048 plotting 4 curves in a single plo
  • MATLAB 滚动图

    我有一个脑电图数据库 我想绘制它 数据库是一个19 1000 134的矩阵 其中 19 是通道数 在第一种方法中 我只使用一个渠道 1000 个样本大小 采样率为 500 Hz 时为 1000 个点 即 2 秒数据 134 epochs的数
  • MATLAB 中最有效的矩阵求逆

    在 MATLAB 中计算某个方阵 A 的逆矩阵时 使用 Ai inv A should be the same as Ai A 1 MATLAB 通常会通知我这不是最有效的求逆方法 那么什么是更有效率的呢 如果我有一个方程系统 可能会使用
  • MATLAB 中的多个捕获组

    我有一个包含数字或字母的字符串a 可能紧随其后的是r or l 在 MATLAB 中 以下正则表达式返回为 gt gt regexp 10r 0 9 a l r match ans 10r 我希望10 and r分开 因为我有两个捕获组 有
  • Matlab:保存后翻转图例顺序和图例重叠图

    我正在尝试根据以下内容反转我的图例条目顺序matlab条形图中图例颜色的逆序 https stackoverflow com questions 31178005 reverse ordering of legend colors in m
  • 在 MATLAB 中重命名文件

    我正在尝试以编程方式重命名工作目录中的文件a temp txt to b hello txt 您建议如何这样做 MATLAB中有一个简单的文件重命名函数吗 我认为您正在寻找 MOVEFILE
  • 什么是 ANN 中的纪元以及它如何转换为 MATLAB 中的代码?

    我试图理解 并可视化 训练人工神经网络的时代到底是什么 我们有一个包含约 7000 个产品的训练集 其中有 10 个特征 输入 这些产品必须根据这 10 个输入分为 7 个类别 我们的 ANN 有 10 个输入 这些输入进入由 10 个神经
  • MATLAB 教程中的 SIFT 实现

    我正在寻找 MATLAB 中的一些基本 SIFT 实现 我需要从第一原则来写它 另外 我正在寻找一些可以解释程序中发生的事情的内容 Vedali 的代码和 David Lowe 的代码超出了我的理解范围 如果您是 Matlab 用户 您一定
  • 如何将二进制值列表转换为int32类型?

    我在 MATLAB 工作区中有一个小端格式的二进制数列表 我想将它们转换为 int32 a是由 0 和 1 组成的双向量 如下所示 a 0 0 0 1 1 0 0 1 1 1 1 0 1 0 1 0 0 0 0 1 1 0 0 0 1 1
  • Matlab:如何更改矩阵的存储方式?从 1x1x3 到 1x3?

    我目前有 val 1 0 7216 val 2 0 7216 val 3 0 7216 但我想要 0 7216 0 716 0 721 我可以做什么样的操作来做到这一点 The reshape函数将在这里解决问题 Arrange the e
  • 如何告诉 mex 链接到 /usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的 libstdc++.so.6?

    现在 MATLAB 2012a 中的 mex 仅正式支持 gcc 4 4 6 但我想使用 gcc 4 7 风险自负 现在如果我直接用 mex 编译一些东西 它会抱怨 usr lib gcc i686 linux gnu 4 7 cc1plu
  • 括号中的波形符字符

    在 MATLAB 中 以下代码执行什么操作 m func returning matrix 波浪号运算符 的作用是什么 在 Matlab 中 这意味着不要将函数中相应的输出参数分配到赋值的右侧 因此 如果func returning mat
  • 如何在放置颜色条后保持子图大小不变

    假设我们有一个 1 2 子图 我们在其中绘制了一些图形 如下所示 subplot 1 2 1 surf peaks 20 subplot 1 2 2 surf peaks 20 然后我们要添加一个颜色条 colorbar 我不希望结果中的正
  • 访问图像的 Windows“标签”元数据字段

    我正在尝试进行一些图像处理 所以现在我正在尝试读取图像 exif 数据 有 2 个内置函数可用于读取图像的 exif 数据 问题是我想读取图像标签 exifread and imfinfo这两个函数都不显示图像标签 Is there any
  • 了解 fminunc 参数和匿名函数、函数处理程序

    请多多包涵 问题在最后 我试图找出 fminunc 调用方式的差异 这个问题源于 Andrew Ng 在他的 Coursera 机器学习课程中的第 3 周材料 我正在回答这个问题 Matlab Andrew Ng 机器学习课程中 t cos

随机推荐

  • 嵩天老师的零基础Python笔记:https://www.bilibili.com/video/av13570243/?from=search&seid=15873837810484552531 中的...

    coding gbk 嵩天老师的零基础Python笔记 https www bilibili com video av13570243 from search seid 15873837810484552531 中的15 22讲 数字类型的
  • python批量发送带附件的邮件时,收到的附件名异常且后缀为bin,解决办法

    1 问题描述 在使用 Python 内置的模块 smtplib 发送带中文名的附件邮件时 数据可以正常传输 但是但收件人收到的附件格式是bin 附件名也不是发送时的名称 附注 smtp Simple Mail Transfer Protoc
  • 进一步理解angular

    在上一篇文章中我介绍了安装和结构 以及运行过程 https blog csdn net weixin 42603009 article details 94382945 我们进一步理解其中的数据单向 双向 组建传值 Modules等的理解
  • C语言编译过程、VIM常用命令

    一 编译过程 1 预处理 gcc E 源文件 c o 源文件 i 预处理宏以及注释 2 编译 gcc S 源文件 i o 源文件 s 通过编译转换为汇编文件 3 汇编 gcc c 源文件 s o 源文件 o 经汇编转换为二进制文件 4 链接
  • linux创建链接文件

    链接文件的创建 1 概念 链接文件就类似我们windows的快捷方式 只保留目标文件的地址 不占用存储空间 使用链接文件与使用目标文件的效果是一样的 2 为什么要使用链接文件 在windows都会把文件放在一个比较大的磁盘中 我们每次需要使
  • ChatGPT 速通手册——GPT 训练数据集介绍

    GPT 训练数据集介绍 所有人工智能算法都会分为训练和推理两步 算法的效果好坏 很大程度上取决于训练数据本身的质量 ChatGPT 所用的训练数据 openai 公司没有单独公布过细节 不过考虑到 ChatGPT 是在前序 GPT 算法基础
  • linux使用记录(一)

    1 tar 解压tar xvf file tar 解压 tar包 tar xzvf file tar gz 解压tar gz tar xjvf file tar bz2 解压 tar bz2 tar xZvf file tar Z 解压ta
  • 使用ADO.NET访问数据库

    一 ADO NET 数据库访问的方法和技术 二 ADO NEt的重要组件 1 DataSet 独立于数据源的数据访问 2 Net framework数据提供程序 用于连接到数据库执行命令和检索结果 三 NET数据提供程序的四个核心对象 1
  • 无向图——邻接表和邻接矩阵的实现

    邻接矩阵 include
  • 封装七牛云存储工具类

    文章目录 封装七牛云存储工具类 为啥选择七牛云 当然是因为它能免费使用喽 白嫖怪哈哈哈 图片存储方案 Java SDK操作七牛云 封装工具类 封装七牛云存储工具类 为啥选择七牛云 当然是因为它能免费使用喽 白嫖怪哈哈哈 图片存储方案 在实际
  • UnityShader——Compute Shader

    Compute Shader是基于DX11 SM4 5 的在GPU上运行的程序 通过Compute Shader我们可以将大量可以并行的计算放到GPU中计算从而节省CPU资源 Unity 5 6版本提供的 Graphics DrawMesh
  • U盘数据丢失是什么原因?轻松让U盘数据恢复的教程

    在数字化时代 我们不可避免地使用各种便携式存储设备 如U盘 来传输和存储重要数据 然而 有时我们可能不小心删除了U盘中的文件 或者格式化了U盘等等而导致数据丢失 这种情况下 你可能会困惑地想知道 是否有简单的方式可以快速而轻松地恢复U盘中丢
  • 解决报错:You don‘t have enough free space in /var/cache/apt/archives/.

    apt安装package时遇到问题 You don t have enough free space in var cache apt archives 问题 var 目录下空间不足 apt下载时没有地方存放缓存文件 解决方法 删除部分日志
  • Java中解决CAS机制出现的ABA问题

    Java中解决CAS机制出现的ABA问题 学习目标 Java中解决CAS机制出现的ABA问题 1 先了解一下什么是CAS 2 CAS的底层原理 3 CAS的问题 4 怎么解决ABA问题 1 先了解一下什么是CAS 一句话总结就是 比较并交换
  • 分库分表需要考虑的问题及方案

    转自 http www jianshu com p 32b3e91aa22c from timeline 分库分表需要考虑的问题及方案 作者 jackcooper 2017 02 08 16 08 字数 5042 阅读 5240 评论 3
  • 【手写一个RPC框架】simpleRPC-06

    目录 前言 实现 zookeeper安装与使用 项目创建 依赖配置 register client service server common codec 文件结构 运行 本项目所有代码可见 https github com weiyu z
  • Lock锁和Condition条件

    Lock的特性 Lock不是Java语言内置的 synchronized是在JVM层面上实现的 如果代码执行出现异常 JVM会自动释放锁 但是Lock不行 要保证锁一定会被释放 就必须将unLock放到finally 中 手动释放 在资源竞
  • OSPF协议

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 HCIA第四天 前言 一 OSPF协议 二 LAS优化 特殊区域 1 解决OSPF的不规则区域 三 扩展配置 前言 一 OSPF协议 OSPF 开放式最短路径优先协议 无类别
  • spring boot 将对象转换为json返回

    Spring Boot默认使用Jackson将对象转换为json 需要配置以下依赖 compile group com fasterxml jackson core name jackson core version 2 9 4 compi
  • matlab实现kmeans聚类算法

    kmeans聚类算法是一种简单实用的聚类算法 matlab自带函数kmeans可直接对数据进行kmeans聚类 为了方便更好地掌握kmeans聚类算法 今天我们自己来实现一个弱化的版本mykmeans mykmeans输入包含三项 分别为聚