k-均值(k-means)及Matlab动态实现

2023-10-26

k-均值(k-means)及Matlab实现

注:1.仅适合于数值属性的数据。
2.对正态分布(高斯分布)数据聚类效果最佳。。

1. 算法思想

k-means算法,也称k-均值算法,它把N个对象划分成k个簇,用簇中对象的均值表示每个簇的中心点(质心),通过迭代使每个簇内的对象不再发生变化为止,此时的平方误差准则函数达到最优,即簇内对象相似度高,簇间相似度低。其具体过程描述如下:

(1.)首先,随机选择k个对象,代表要分成的k个簇的初始均值或中心。
(2.)计算其余对象与各个均值的欧式距离,找到距离最短的对象,将其分配到距离中心最近的簇中。
(3.)计算每个簇中所有对象的平均值(均值),作为每个簇的新的中心。
(4.)再次计算所有对象与新的k个中心的欧式距离,根据**"距离中心最近原则”** ,重新划分所有对象到各个簇中。
(5.)重复(3.)(4.)步骤,直至所有簇中心不变为止。(即本轮生成的簇与上一轮生形成的簇相同)。聚类结束。

2. k-均值算法划分聚类的三个关键点

(1.)数据对象的划分

  • 距离度量的选择
    计算数据对象之间的距离时,要选择合适的相似性度量,较著名的距离度量是欧几里得距离和曼哈顿距离,常用的是欧氏距离,公式如下:
    这里写图片描述
    这里xi,xj表示两个d维数据对象,即对象有d个属性,xi=(xi1,xi2,…,xid),xj=(xj1,xj2,…,xjd)。d(xi,xj)表示对象xi和xj之间的距离,距离越小,二者越相似。
    根据欧几里得距离,计算出每一个数据对象与各个簇中心的距离。

  • 选择最小距离
    即如果d(p,mi)=min{d(p,m1),d(p,m2),…,d(p,mk)}
    那么,p∈ci;P表示给定的数据对象;m1,m2,…,mk分别表示簇c1,c2,…,ck的初始均值或中心。

(2.)准则函数的选择
k-均值算法采用平方误差准则函数来评估聚类的性能,即聚类结束后,对所有聚类簇用该公式评估。公式如下:
这里写图片描述
对于每个簇中的每个对象,求对象到其簇中心距离的平方,然后求和。
其中,E表示数据库中所有对象的平方误差和,P表示给定的数据对象,mi表示簇ci的均值。

(3.)簇中心的计算
用每个簇内所有对象的均值作为簇中心,公式如下:
这里写图片描述
这里假设簇c1,c2,…,ck中的数据对象个数分别为n1,n2,…,nk。

3. k-均值算法实现

输入:k,簇数目
     D,包含N个对象的数据集
输出:k个簇的集合
方法:
 1. 从D中N个对象任意选择k个对象作为初始簇中心;
 2. 根据欧氏距离,依次比较其余每个对象与各个簇中心的距离;选择距离最近的簇,依次把N个对象划分到k个簇中;
 3. 完成第一次划分后,重新计算新的簇中心即均值,然后重新划分数据对象,直到新的簇中心不再发生变化。

4. k-均值算法的优缺点
优点:

  • 解决聚类问题的一种经典算法,简单,快速;
  • 对处理大型数据集,该算法保持可收缩性,高效性;
  • 当簇接近正态分布时,效果最好;

缺点:

  • 在k-means算法中k是事先给定的,这个k值难以估计,很多时候并不知道数据集应该分成多少个类别最合适;
  • 当簇的均值可定义时才能使用,不适用于具有标称属性的数据,此时用k-众数方法研究;
  • 初始聚类中心的任意选择对聚类结果有很大影响,一旦初始值选择不好就无法得到有效的聚类结果;
  • 该算法需要不断进行样本分类调整,不断计算调整后的新的聚类中心,因此数据量大时,算法时间开销大;
  • 若簇中含有异常点,将导致均值偏离严重;(即对噪声、孤立点敏感);
  • 不适用于发现非凸形状的簇,或大小差别大的簇;

5. 给出两个Matlab聚类代码

代码一:静态实现
随机生成三组正态分布数据点,迭代生成K个聚类簇。具体通过计算欧式距离划分数据点并标记每个数据点到K个聚类簇中,直到K个簇中心达到稳定(收敛)为止。

clear all;
close all;
clc;
% 第一组数据
mu1=[0 0 ];  %均值(是需要生成的数据的均值)
S1=[.1 0 ;0 .1];  %协方差(需要生成的数据的自相关矩阵(相关系数矩阵))
data1=mvnrnd(mu1,S1,100);   %产生高斯分布数据
%第二组数据
mu2=[1.25 1.25 ];
S2=[.1 0 ;0 .1];
data2=mvnrnd(mu2,S2,100);
% 第三组数据
mu3=[-1.25 1.25 ];
S3=[.1 0 ;0 .1];
data3=mvnrnd(mu3,S3,100);
% 显示数据
plot(data1(:,1),data1(:,2),'b+');
hold on;%不覆盖原图,要关闭则使用hold off;
plot(data2(:,1),data2(:,2),'r+');
plot(data3(:,1),data3(:,2),'g+');
grid on;%显示表格
%  三类数据合成一个不带标号的数据类
data=[data1;data2;data3];
N=3;%设置聚类数目
[m,n]=size(data);%表示矩阵data大小,m行n列
pattern=zeros(m,n+1);%生成0矩阵
center=zeros(N,n);%初始化聚类中心
pattern(:,1:n)=data(:,:);
for x=1:N
    center(x,:)=data( randi(300,1),:);%第一次随机产生聚类中心
end
while 1 %循环迭代每次的聚类簇;
    distence=zeros(1,N);%最小距离矩阵
    num=zeros(1,N);%聚类簇数矩阵
    new_center=zeros(N,n);%聚类中心矩阵
    
    for x=1:m
        for y=1:N
            distence(y)=norm(data(x,:)-center(y,:));%计算到每个类的距离
        end
        [~, temp]=min(distence);%求最小的距离
        pattern(x,n+1)=temp;%划分所有对象点到最近的聚类中心;标记为1,2,3;
    end
    k=0;
    for y=1:N
        for x=1:m
            if pattern(x,n+1)==y
                new_center(y,:)=new_center(y,:)+pattern(x,1:n);
                num(y)=num(y)+1;
            end
        end
        new_center(y,:)=new_center(y,:)/num(y);%求均值,即新的聚类中心;
        if norm(new_center(y,:)-center(y,:))<0.1%检查集群中心是否已收敛。如果是则终止。
            k=k+1;
        end
    end
    if k==N
        break;
    else
        center=new_center;
    end
end
[m, n]=size(pattern);

%最后显示聚类后的数据
figure;
hold on;
for i=1:m
    if pattern(i,n)==1
        plot(pattern(i,1),pattern(i,2),'r*');
        plot(center(1,1),center(1,2),'ko');%用小圆圈标记中心点;
    elseif pattern(i,n)==2
        plot(pattern(i,1),pattern(i,2),'g*');
        plot(center(2,1),center(2,2),'ko');
    elseif pattern(i,n)==3
        plot(pattern(i,1),pattern(i,2),'b*');
        plot(center(3,1),center(3,2),'ko');
    elseif pattern(i,n)==4
        plot(pattern(i,1),pattern(i,2),'y*');
        plot(center(4,1),center(4,2),'ko');
    else
        plot(pattern(i,1),pattern(i,2),'m*');
        plot(center(4,1),center(4,2),'ko');
    end
end
grid on;

随着N值的自定义设置,聚类结果如下:
N=2时
这里写图片描述
N=3时
这里写图片描述
N=4时
这里写图片描述

代码二:动态演示聚类过程
数据存储于scaledfaithful.txt文本文件,通过自定义多个函数实现聚类。
效果如下:
这里写图片描述
代码:
runKMeans.m文件(自定义runKMeans函数,进行聚类算法实现。)

function runKMeans(K,fileString)
%加载由fileStringfrom Bishop book指定的数据文件
%[filename,filepath]=uigetfile('*.txt','Select Input file');

X=load(fileString);%load函数加载当前文件夹中的数据;

%读入数据,X为N×D维的矩阵
N=size(X,1);
D=size(X,2);

%初始化中心点Kmus 为K×D维度的矩阵
Kmus=zeros(K,D);

%通过从数据中随机选取点来初始化集群中心
rndinds=randperm(N);
Kmus=X(rndinds(1:K),:);

%指定允许的最大迭代次数
maxiters=1000;

for iter=1:maxiters
    
    %sqDmat将是一个n×k矩阵
    %调用自定义函数calcSqDistances() 计算数据与各中心点之间的距离
    sqDmat=calcSqDistances(X,Kmus);
    
    %给定距离的平方矩阵,确定最近的簇
    
    %R将是一个n×k的二进制值矩阵,
    %是否属于第k个中心点的类,属于就是1,不属于就是0
    %调用自定义函数determineRnk()根据距离决定数据属于哪一类
    Rnk=determineRnk(sqDmat);
    
    KmusOld=Kmus;
    
    plotCurrent(X,Rnk,Kmus);
    pause(1) %函数pause(1) 会在循环过程中产生动态效果
    
    %recalcMus()根据确定好的数据的类重新计算出新的中心点,最后重复循环直到收敛。
    Kmus=recalcMus(X,Rnk);
    
    
    %检查集群中心是否已收敛。如果是则终止。
    if sum(abs(KmusOld(:)-Kmus(:)))<1e-6
        disp(iter);
        break
    end
end

end

计算数据与各中心点之间的距离函数:calcSqDistances
这里写图片描述

划分数据点的类别的函数:determineRnk
这里写图片描述

绘图函数:plotCurrent
这里写图片描述

主程序:KMeans_script(KMeans运行脚本)

% KMeans_script(KMeans运行脚本)

K = 4; %自定义聚类数
filename = 'scaledfaithful.txt'; %数据文本
runKMeans(K,filename)

运行结果如下:
当K=2时
这里写图片描述
当K=3时
这里写图片描述
当K=4时
这里写图片描述

总结
本文介绍了k-均值(k-means)聚类算法的思想及算法步骤和关键知识点。给出了两个Matlab的实现代码。
代码一,通过Matlab函数随机生成三组高斯分布数点,并迭代生成聚类簇。
代码二,将数据点存放于.txt文件,通过读取数据文件获取数据,并通过自定义多个函数方法并调用实现聚类。代码主要通过在迭代循环体中添加pause()函数,实现数据对象动态聚类的过程。

参考文献

https://blog.csdn.net/liu1194397014/article/details/52844997

通过本文对k-均值算法的深入学习,给出了两种流行的Matlab代码实现,具体源码可点击下方进行积分下载,没有积分的小伙伴可扫码联系本人获取。
CSDN积分下载地址:

静态实现: https://download.csdn.net/download/qiu1440528444/10486647
动态实现:https://download.csdn.net/download/qiu1440528444/10486631

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k-均值(k-means)及Matlab动态实现 的相关文章

  • Python机器学习之k-means聚类算法

    1 引言 所谓聚类 就是按照某个特定的标准将一个数据集划分成不同的多个类或者簇 使得同一个簇内的数据对象的相似性尽可能大 同时不再一个簇内的数据对象的差异性也尽可能大 聚类算法属于无监督学习算法的一种 k 均值聚类的目的是 把 n个点 可以
  • Matlab实现Kmeans算法(每行代码标注详细注解)

    本文主要为了完成平日作业 并进一步加深对算法的理解 也希望对来访的读者有所帮助 该算法的优化Kmean 算法的代码详解已在其他文章给出 Matlab实现Kmeans 算法 每行代码标注详细注解 高垚淼的博客 CSDN博客 Matlab实现B
  • Kmeans K均值聚类,OpenCV实现

    Clustering 聚类 kmeans k均值聚类 Finds centers of clusters and groups input samples around the clusters 寻找clusters的中心 并且将输入的样本
  • 如何将 Row 类型转换为 Vector 以馈送到 KMeans

    当我尝试将 df2 提供给 kmeans 时 出现以下错误 clusters KMeans train df2 10 maxIterations 30 runs 10 initializationMode random 我得到的错误 Can
  • 具有非常大矩阵的 K 均值

    我必须在一个非常大的矩阵 大约 300 000x100 000 个值 超过 100Gb 上执行 k 均值聚类 我想知道我是否可以使用 R 软件或 weka 来执行此操作 我的计算机是一台多处理器 具有 8GB 内存和数百 GB 可用空间 我
  • 有哪些实现半监督(约束)聚类的软件包?

    我想对半监督 约束 聚类进行一些实验 特别是作为实例级成对约束 必须链接或无法链接约束 提供的背景知识 我想知道有没有好的开源包实现半监督聚类 我尝试查看 PyBrain mlpy scikit 和 Orange 但找不到任何约束聚类算法
  • 具有相同簇大小的 K 均值算法变体

    我正在寻找最快的算法 用于按距离将地图上的点分组为大小相等的组 这k 均值聚类算法看起来简单且有前途 但不能产生同等规模的群体 该算法是否有一种变体 或者是否有一种不同的算法可以允许所有集群的成员数量相等 也可以看看 将 n 个点分组到 k
  • 内存错误 Numpy/Python 欧几里得距离

    我正在尝试使用 numpy 和 python 运行 K 均值聚类算法 但如果我使用较大的 K 值 任何大于 10 的值似乎都会导致错误 就会不断遇到内存错误 我有两个大小为 42000 784 数据集 和 K 784 质心 的 numpy
  • 如何使用存储为 CSV 的矢量数据在 mahout 中执行 k 均值聚类?

    我有一个包含数据向量的文件 其中每行包含一个以逗号分隔的值列表 我想知道如何使用 mahout 对这些数据执行 k 均值聚类 wiki 中提供的示例提到了创建sequenceFiles 但除此之外 我不确定是否需要进行某种类型的转换才能获取
  • K表示当肘部图是平滑曲线时寻找肘部

    我正在尝试使用以下代码绘制 k 的肘部 load CSDmat mydata for k 2 20 opts statset MaxIter 500 Display off IDX1 C1 sumd1 D1 kmeans CSDmat k
  • kmean 需要三角不等式吗?

    我想知道对于 kmeans 中使用的距离度量是否需要三角不等式 k 均值是designed for 欧几里得距离 正好满足三角不等式 使用其他距离函数是有风险的 因为它可能会停止收敛 然而原因是not三角不等式 但是平均值可能不会最小化距离
  • R - 二进制博客数据的聚类分析

    我有一个与下面的示例类似的网络数据 它仅具有用户和二进制值 用于表明该用户是否点击了网站内的特定链接 我想对这些数据进行一些聚类 我的主要目标是根据用户的在线行为找到相似的用户 对此有什么好的聚类算法 我尝试过 k means 它不适用于二
  • k-means 的时间复杂度是多少?

    我正在经历k means 维基百科页面 http en wikipedia org wiki K means clustering 根据算法 我认为复杂度是O n k i n 总元素 k 簇迭代次数 那么有人可以向我解释一下维基百科上的这个
  • 最相距的 k 个元素(聚类?)

    我有一个简单的机器学习问题 我有 n 110 个元素 以及所有成对距离的矩阵 我想选择相距最远的 10 个元素 也就是说 我想要 Maximize Choose 10 different elements Return min distan
  • Scikit-learn、KMeans:如何使用 max_iter

    我想了解类中的参数 max itersklearn cluster KMeans http scikit learn org stable modules generated sklearn cluster KMeans html 根据文档
  • Python scikit-learn KMeans 在计算轮廓分数时被杀死 (9)

    我目前正在研究一个图像数据集 250 000 张图像 因此与特征向量一样多 每个图像都由 132 个特征组成 并尝试使用 sklearn 提供的 KMeans 函数 我在 Mac OS X 10 10 Python 2 7 和 sklear
  • Sklearn.KMeans:如何避免内存或值错误?

    我正在研究图像分类问题 并且正在创建一个词袋模型 为此 我提取了所有图像的 SIFT 描述符 并且必须使用 KMeans 算法来找到用作我的词袋的中心 这是我拥有的数据 图片数量 1584 SIFT 描述符的数量 32 个元素的向量 571
  • 使用杰卡德距离矩阵进行 Kmeans 聚类

    我正在尝试创建 Jaccard 距离矩阵并对其执行 K 均值以给出簇 id 和簇中元素的 id 它的输入是 Twitter 推文 以下是代码 我无法理解如何使用 kmeans 文件中的初始种子 install packages rjson
  • Apache Spark MLLib - 使用 IDF-TF 向量运行 KMeans - Java 堆空间

    我正在尝试从 大 文本文档集合 TF IDF 向量 在 MLLib 上运行 KMeans 文档通过 Lucene 英语分析器发送 稀疏向量由 HashingTF transform 函数创建 无论我使用的并行程度如何 通过合并函数 KMea
  • 如何在 k 均值中使用欧氏距离以外的不同距离公式

    我正在处理纬度经度数据 我必须根据两点之间的距离进行聚类 现在两个不同点之间的距离是 ACOS SIN lat1 SIN lat2 COS lat1 COS lat2 COS lon2 lon1 6371 我想在 R 中使用 k 均值 有什

随机推荐

  • IDEA项目及字体样式和初始化等习惯配置

    前言 内容较多 按需检索 0 IDEA常用快捷键 1 主题设置 黑白 2 字体大小设置 3 全局编码 字符集改为utf 8 3 1 文件编码设置 3 2 新建项目字符集设置 3 3 单个文件编码设置 idea面板右下角 4 Maven配置
  • 如何设置环境变量

    首先强烈推荐一款免费的c 的IDE code block 免费的且自带了MinGW编译器 自己可以设置字体及大小 一般设置成12号比较合适 直接在界面上的Setting gt Editor 在右上角上有一个choose 然后就可以选择字体
  • 书城管理系统(前端)

    OK 兄弟们 测试上传图片的后端接口 测试分页条件查询后端接口 测试根据id查询后端接口 测试新增一本书的后端接口 测试修改一本书的后端接口 之前写好的后端接口 用postman测试一下 没有问题的话我们就试试开发前端 准备工作 用vue创
  • MYSQL 时间处理

    1 MySQL 获得当前时间戳函数 current timestamp current timestamp mysql gt select current timestamp current timestamp current timest
  • BERT使用过程中的碰到的那些报错

    BERT是谷歌2018年提出的语言模型 在十几个任务上达到了state of art 在这里本人在使用过程中总结了一下遇到的错误 BERT推荐在TPU上运行 但是资源有限在GPU上跑也行 不行也能在cpu上跑 ps就是有些慢 官方BERT的
  • RPA机器人成为金融银行业转型的重要推手

    当前 金融科技迅猛发展 金融业监管和合规要求不断提升 为了应对挑战 抓住机遇 银行业作为国民经济体系重要的组成部分和核心产业 早已开始探索科技赋能金融之路 当前银行业面临的难题 成熟的银行都会在其内部部署多个业务平台 管理系统 以实现业务流
  • arduino控制步进电机

    一 实物连接 二 代码实现 const int IN1 11 const int IN2 10 const int IN3 9 const int IN4 8 正转顺序 const char tab1 0x01 0x03 0x02 0x06
  • 【spring源码探索】一分钟搞懂RefreshScope的作用及实现原理

    前文 下述文章完全为个人阅读源码的随笔记录 如有错误 欢迎大家指出 过程 过程很坎坷 而且大家应该都不想看了吧 简而言之就是先写个测试DEMO 然后各种DEBUG 结论 这次先直接上结论 然后再通过测试DEMO给出验证 最后再去跟代码 Re
  • 怎样在Android访问php取回json数据

    1 代码 php代码 1 array array 2 username gt 杨铸 3 password gt 123456 4 user id gt 1 5 6 echojson encode array 2 代码 java代码 01 p
  • C语言算平均数,让用户输入一系列的正整数,输入-1表示输入结束,算出这些数字的平均数

    include
  • JAVA怎么替换html标签呢???

    之前遇见个需求 让我在下载文件时 把content里面的富文本存储的内容下载下来 但是又不能有html标签 那个我们怎们处理呢 废话不多说 上代码 StringBuffer stringBuffer new StringBuffer Str
  • Android10.0 Binder通信原理(七)-Framework binder示例

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • 幸有一事,生死可许

    已然到了岁末 2014就要结束 迎来崭新的2015 颇多感慨 颇多难忘 与其说是2014年是我职业生涯中至关重要的一年 倒不如说是我人生道路上极为重要的一步来的更为贴切 这一年忙忙碌碌 一刻不得清闲 却是极为充实 没有迷茫 没有挣扎 有的只
  • httpclient发送Get请求和Post请求

    创建HttpClient发送请求 接收响应 Get请求简介 get无参数 get有参数 Post请求简介 post携带JSON参数 post携带表单参数 postman自动生成OKhttp代码 Get请求简介 1 创建HttpClient对
  • 华为交换机日常用巡检命令

    display version 查看设备允许版本 display startup 检查软件包 display licence 检查Licence信息 display patch information 检查补丁信息 display cloc
  • nrm安装后报错的解决办法(windows环境)

    安装 nrm npm install g nrm 运行nrm ls报错 配置系统环境变量 查询npm所在的路径 执行以下命令 其中prefix就是所需路径 npm config ls 新建系统环境变量 变量名 自己可定 只要与下一步添加时一
  • git解决冲突方法

    多人协作代码 若修改区域不是同一块很容易解决 场景描述 初始master上代码版本号为A 他人在本地修改后提交到master 版本号变为B 但此时我本地版本号仍是A 本地修改之后变为B 无法进行推送 解决方案 1 查看并创建分支 git b
  • Scala如何使用元组?用法代码实例

    Tuple是元素的集合 元组是异构的数据结构 也就是说 它们可以存储不同数据类型的元素 元组是不可变的 不像scala中的数组是可变的 存储整数 字符串和布尔值的元组的示例 val name 15 Chandan true 元组的类型由其所
  • pytorch函数详解

    pytorch函数详解 在typora这里写之后复制到简书上 1 torchvision 1 1 transforms Compose transforms 把几个转换组合 example from PIL import Image t t
  • k-均值(k-means)及Matlab动态实现

    k 均值 k means 及Matlab实现 注 1 仅适合于数值属性的数据 2 对正态分布 高斯分布 数据聚类效果最佳 1 算法思想 k means算法 也称k 均值算法 它把N个对象划分成k个簇 用簇中对象的均值表示每个簇的中心点 质心