龙空技术网

基于MATLAB的kmeans求最佳聚类数k的GUI计算界面

云龙派 908

前言:

如今你们对“kmeans聚类的算法步骤”大概比较关切,朋友们都想要学习一些“kmeans聚类的算法步骤”的相关知识。那么小编同时在网摘上搜集了一些有关“kmeans聚类的算法步骤””的相关文章,希望小伙伴们能喜欢,姐妹们快快来学习一下吧!

K-means算法是一种迭代求解的聚类分析算法,是在聚类算法中运用最为广泛的算法。它将数据分为了K组,随机选取K个对象。同时计算出对象和子对象之间的距离,把每个对象分配都距离最近的数据中心。通过数据,对于对象进行分类,从而进行针对不同对象的处理方案。在目前的分类应用中,K-means聚类算法应用广泛。但是K-means算法的缺点是要事先确定聚类的数目K,但是无法自动寻找最佳的聚类数。目前经常用于求最佳的聚类数K的方法有手肘法和轮廓系数法。

基于MATLAB的Kmeans算法使用手肘法自动寻找最佳聚类数k计算,并制作成GUI计算界面。

GUI界面如下:

点击加载要聚类的数据——点击手肘法计算k值按键——根据生成的不同K值聚类偏差图,获得最佳聚类数k,并在输入参数里设置最佳聚类数k——点击设置Kmeans聚类的重复聚类的次数k1——点击kmeans聚类按键——即可获得聚类的结果图和每个类别包含的excel结果文件,并生成jpg、bmp、fig、pdf格式的分类结果图和 不同K值聚类偏差图。需要完整GUI程序,可以进行打赏后截图(60元及以上),,进行联系,或者公众号“联系掌门”进行联系,或者在公众号内回复截图,几小时内会回复。界面编程不易,还请见谅!

1.计算实例

对3000组二维的数据进行自动寻找最佳聚类数k的GUI计算,部分数据内容如下图所示:

1.准备数据文件

2.点击加载数据按键,加载数据

3.点击确定,加载数据完毕

4.点击手肘法计算k值按键,根据原理获得最佳分类数k

5.输入最佳分类数k、kmenas算法重复聚类次数k1、分类图的x轴名称和y轴名称。

6.点击Kmeans聚类按键,即可获得分类结果并生成相应的图形文件和分类结果excel文件。

7.点击清除按键,即可清除输入和图形结果

GUI主要程序如下

function varargout = KmeansGUI(varargin)% Last Modified by GUIDE v2.5 01-Mar-2023 23:10:07gui_Singleton = 1;gui_State = struct('gui_Name',       mfilename, ...    'gui_Singleton',  gui_Singleton, ...    'gui_OpeningFcn', @KmeansGUI_OpeningFcn, ...    'gui_OutputFcn',  @KmeansGUI_OutputFcn, ...    'gui_LayoutFcn',  [] , ...    'gui_Callback',   []);if nargin && ischar(varargin{1})    gui_State.gui_Callback = str2func(varargin{1});endif nargout    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});else    gui_mainfcn(gui_State, varargin{:});endfunction KmeansGUI_OpeningFcn(hObject, eventdata, handles, varargin)handles.output = hObject;movegui(gcf,'center');set(gcf,'NumberTitle','off','Name','Kmeans自动寻找聚类中心的聚类计算GUI系统 ');guidata(hObject, handles);function varargout = KmeansGUI_OutputFcn(hObject, eventdata, handles)varargout{1} = handles.output;function pushbutton2_Callback(hObject, eventdata, handles)global datatry    delete(allchild(handles.axes1));    delete(allchild(handles.axes2));endwarning off;function pushbutton4_Callback(hObject, eventdata, handles)set(handles.edit1,'string','');set(handles.edit2,'string','');set(handles.edit3,'string','');set(handles.edit4,'string','');try    delete(allchild(handles.axes1));    delete(allchild(handles.axes2));endfunction pushbutton5_Callback(hObject, eventdata, handles)closereq;function pushbutton1_Callback(hObject, eventdata, handles)global data[filename,pathname,filterindex]=uigetfile({'*.xls';'*.xlsx';'*.txt';'*.*'},'打开数据');if ~filename    return;endstr1=[pathname,filename];if (filename==0 & pathname==0)    msgbox('您没有选择文件,请重新选择!','打开文件出错','error');else    data=xlsread (strcat([pathname filename]));    msgbox('打开及读取数据完毕!','确认','warn');end

2.手肘法求最佳聚类数K

手肘法的核心指标是SSE(sum of the squared errors,误差平方和),

其中,Ci是第i个簇,p是Ci中的样本点,mi是Ci的质心(Ci中所有样本的均值),SSE是所有样本的聚类误差,代表了聚类效果的好坏。

手肘法的核心思想是:随着聚类数k的增大,样本划分会更加精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小。并且,当k小于真实聚类数时,由于k的增大会大幅增加每个簇的聚合程度,故SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系图是一个手肘的形状,而这个肘部对应的k值就是数据的真实聚类数。

肘部对于的k值为3,SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,故对于这个数据集的聚类而言,最佳聚类数应该选3。

3.轮廓系数法求最佳聚类数K

该方法的核心指标是轮廓系数(Silhouette Coefficient),某个样本点Xi的轮廓系数定义如下:

其中,a是Xi与同簇的其他样本的平均距离,称为凝聚度,b是Xi与最近簇中所有样本的平均距离,称为分离度。而最近簇的定义是

其中p是某个簇Ck中的样本。事实上,简单点讲,就是用Xi到某个簇所有样本平均距离作为衡量该点到该簇的距离后,选择离Xi最近的一个簇作为最近簇。

求出所有样本的轮廓系数后再求平均值就得到了平均轮廓系数。平均轮廓系数的取值范围为[-1,1],且簇内样本的距离越近,簇间样本距离越远,平均轮廓系数越大,聚类效果越好。那么,很自然地,平均轮廓系数最大的k便是最佳聚类数。

k值为3对应的平均轮廓系数最大,所有k=3。

(注:手肘法和轮廓系数法理论部分来自知乎作者小松鼠的文章《KMeans中K选择的2个方法》,文章链接:

)

4.参考内容

[1] 知乎作者小松鼠的文章《KMeans中K选择的2个方法》,文章链接:

)

[2]博客园作者嘟嘟_猪的文章《kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)》,文章链接为:

[3]个人博主OmegaXYZ的文章《kmeans聚类选择最优K值python实现》,文章链接为:

本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。

作 者 | 郭志龙

编 辑 | 郭志龙

校 对 | 郭志龙

标签: #kmeans聚类的算法步骤