https://archive.ics.uci.edu/ml/datasets/seeds
问题介绍本次实验共选取了510条记录,通过整合筛选掉无效记录。将样本种子划分为7个维度进行考量种子的几何特性,分别为
1.种子面积A 2.种子周长P 3.种子紧密度C = 4 * pi * A / P ^ 2,4 4.籽粒长度5.籽粒宽度6.不对称系数7.籽粒槽的长度
事物间的界线,有些是明确的,有些则是模糊的。当聚类涉及到事物之间的模糊界线时,需要运用模糊聚类分析方法。
如何理解模糊聚类的“模糊”呢:假设有两个集合分别是A、B,有一成员a,传统的分类概念a要么属于A要么属于B,在模糊聚类的概念中a可以0.3属于A,0.7属于B,这就是其中的“模糊”概念。
模糊聚类分析有两种基本方法:系统聚类法和逐步聚类法。
系统聚类法个人理解类似于密度聚类算法,逐步聚类法类是中心点聚类法。
逐步聚类法是一种基于模糊划分的模糊聚类分析法。它是预先确定好待分类的样本应分成几类,然后按照最优原则进行在分类,经多次迭代直到分类比较合理为止。在分类过程中可认为某个样本以某一隶属度隶属某一类,又以某一隶属度隶属于另一类。这样,样本就不是明确的属于或不属于某一类。若样本集有n个样本要分成c类,则他的模糊划分矩阵为c×n。
该矩阵有如下特性:
①. 每一样本属于各类的隶属度之和为1。
②. 每一类模糊子集都不是空集。
给定聚类类别数C,设定迭代收敛条件,初始化各个聚类中心;
(1)重复下面的运算,直到各个样本的隶属度值稳定:
(2)用当前的聚类中心根据公式(6) 计算隶属度函数;
A.用当前的隶属度函数根据公式(5) 重新计算各个聚类的中心。
B.当算法收敛时,就得到了各类的聚类中心和各个样本对于各类的隶属度值,从而完成了模糊聚类划分。
输入: data: 待聚类数据,n行s列,n为数据个数,s为每个数据的特征数
c : 聚类中心个数
m : 模糊系数
输出: U : 隶属度矩阵,c行n列,元素uij表示第j个数据隶属于第i类的程度
V : 聚类中心向量,c行s列,有c个中心,每个中心有s维特征
T :迭代次数
epsm :收敛精度
m :模糊系数
实验代码
T=50; c=8; m=2; data=seedsdataset; [U, V]=myfcm(data, c, T, m, epsm); function [U, V,objFcn] = myfcm(data, c, T, m, epsm) if nargin < 3 T = 100; end if nargin < 5 epsm = 1.0e-6; end if nargin < 4 m = 2; end [n, s] = size(data); U0 = rand(c, n); temp = sum(U0,1); for i=1:n U0(:,i) = U0(:,i)./temp(i); end iter = 0; V(c,s) = 0; U(c,n) = 0; distance(c,n) = 0; while( iter<T ) iter = iter + 1; Um = U0.^m; V = Um*data./(sum(Um,2)*ones(1,s)); for i = 1:c for j = 1:n distance(i,j) = mydist(data(j,:),V(i,:)); end end U=1./(distance.^m.*(ones(c,1)*sum(distance.^(-m)))); objFcn(iter) = sum(sum(Um.*distance.^2)); if norm(U-U0,Inf)<epsm break end U0=U; end myplot(U,objFcn); function d = mydist(X,Y) d = sqrt(sum((X-Y).^2)); end function myplot(U,objFcn) figure(1) subplot(4,2,1); bar(U(1,1:100)); grid title('一') subplot(4,2,2); bar(U(2,1:100)); grid title('二') subplot(4,2,3); bar(U(3,1:100)'); grid title('三') subplot(4,2,4); bar(U(4,1:100)); grid title('四') subplot(4,2,5); bar(U(5,1:100)); grid title('五') subplot(4,2,6); bar(U(6,1:100)); grid title('六') subplot(4,2,7); bar(U(7,1:100)); grid title('七') subplot(4,2,8); bar(U(8,1:100)); grid title('八') figure(2) plot(objFcn,'-k'); grid title('目标函数变化值'); xlabel('迭代次数') ylabel('目标函数值') end end实验结果
K-means聚类算法 也称K均值聚类算法 是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。
由于matlab中含有自带的kmeans函数,所以只要进行调用即可
X=seedsdataset; [x,y]=size(X); opts = statset('Display','final'); K=6; repN=50; [Idx,Ctrs,SumD,D] = kmeans(X,K,'Replicates',repN,'Options',opts); fprintf('将种子的种类划分成%d类:\n',K) for i=1:K tm=find(Idx==i); tm=reshape(tm,1,length(tm)); fprintf('种子%d类 (共%d个)\n[%s]\n',i,length(tm),int2str(tm)); end
结果分析
K-Means聚类算法的优点主要集中在:
1.算法快速、简单;
2.对大数据集有较高的效率并且是可伸缩性的;
3.时间复杂度近于线性,而且适合挖掘大规模数据集。K-Means聚类算法的时间复杂度是O(nkt) ,其中n代表数据集中对象的数量,t代表着算法迭代的次数,k代表着簇的数目。
K-Means聚类算法的缺点:
① 在 K-means 算法中 K 是事先给定的,这个 K 值的选定是非常难以估计的。很多时候,事先并不知道给定的数据集应该分成多少个类别才最合适。这也是 K-means 算法的一个不足。
② 在 K-means 算法中,首先需要根据初始聚类中心来确定一个初始划分,然后对初始划分进行优化。这个初始聚类中心的选择对聚类结果有较大的影响,一旦初始值选择的不好,可能无法得到有效的聚类结果,这也成为 K-means算法的一个主要问题。
③ 从 K-means 算法框架可以看出,该算法需要不断地进行样本分类调整,不断地计算调整后的新的聚类中心,因此当数据量非常大时,算法的时间开销是非常大的。所以需要对算法的时间复杂度进行分析、改进,提高算法应用范围。