Hi,大家好,我是编程小6,很荣幸遇见你,我把这些年在开发过程中遇到的问题或想法写出来,今天说一说
matlab 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:07 gui_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}); end if nargout [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:}); else gui_mainfcn(gui_State, varargin{:}); end function 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 data try delete(allchild(handles.axes1)); delete(allchild(handles.axes2)); end warning 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)); end function pushbutton5_Callback(hObject, eventdata, handles) closereq; function pushbutton1_Callback(hObject, eventdata, handles) global data [filename,pathname,filterindex]=uigetfile({'*.xls';'*.xlsx';'*.txt';'*.*'},'打开数据'); if ~filename return; end str1=[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个方法》,文章链接:
https://zhuanlan.zhihu.com/p/)
4.参考内容
[1] 知乎作者小松鼠的文章《KMeans中K选择的2个方法》,文章链接:
https://zhuanlan.zhihu.com/p/)
[2]博客园作者嘟嘟_猪的文章《kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法)》,文章链接为:https://www.cnblogs.com/dudumiaomiao/p/5839905.html
[3]个人博主OmegaXYZ的文章《kmeans聚类选择最优K值python实现》,文章链接为:https://www.omegaxyz.com/2018/09/03/k-means-find-k/
本文内容来源于网络,仅供参考学习,如内容、图片有任何版权问题,请联系处理,24小时内删除。
作 者 | 郭志龙
编 辑 | 郭志龙
校 对 | 郭志龙
今天的分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
上一篇
已是最后文章
下一篇
已是最新文章