基于改进K-means的网络数据聚类算法matlab仿真

137 阅读4分钟

1.程序功能描述

        K-means属于聚类分析中一种基本的划分方法,常采用误差平方和准则函数作为聚类准则。主要优点是算法简单、快速而且能有效地处理大数据集。研究和分析了聚类算法中的经典K-均值聚类算法,总结出其优点和不足。重点分析了K-均值聚类算法对初始值的依赖性,并用实验验证了随机选取初始值对聚类结果的影响性。根据传统的K-means算法存在的缺陷,提出了改进后的K-means算法,主要解决了孤点对聚类中心影响的问题以及K值的确认问题。

 

2.测试软件版本以及运行结果展示

MATLAB2022a版本运行

1.jpeg

2.jpeg

3.jpeg

4.jpeg

 

 

3.核心程序

`for  Cluster_Num = 2 : K_start

Cluster_Num

     flags       = 0;

     Step        = 4000;

disp('K值分类');

     %随机化定义聚类中心点

     Center      = Data_NoGD(:,1:Cluster_Num);

     %进行初始的迭代

     [KindData,KindNum] = func_Kmeans_Cluster(Center,Data_NoGD);

NewCenter          = func_NewCenter(KindData,KindNum,row);

     %进行K值分类

     while (sum(sum(NewCenter ~= Center))) & Step

           Center             = NewCenter;

           [KindData,KindNum] = func_Kmeans_Cluster(Center,Data_NoGD);

NewCenter          = func_NewCenter(KindData,KindNum,row);

           Step               = Step-1;

     end

     %计算距离代价

disp('计算距离代价');

     %计算L

disp('计算L');

     xl = NewCenter(1,:);

yl = NewCenter(2,:);

     for j = 1 :Cluster_Num

         L(j) = sqrt((Xavg - xl(j))^2 + (Yavg - yl(j))^2);

     end

 

 

 

Lsum(Cluster_Num - 1) = sum(L)*Cluster_Num;

disp('计算D');

     %计算D

     for j = 1:Cluster_Num

KindData_tmpx = KindData(1,:,j);

KindData_tmpy = KindData(2,:,j);

         %去掉其中的0数值

KindData_tmp = [KindData_tmpx;KindData_tmpy];

         if isempty(KindData_tmp) == 1

             D(i,j) = inf;

         else

             %开始统计

             for i = 1:length(KindData_tmp)

                 D(i,j) =  sqrt((KindData_tmp(1,i) - xl(j))^2 + (KindData_tmp(2,i) - yl(j))^2);

             end

         end

         clear KindData_tmpKindData_tmpxKindData_tmpy

     end

 

 

Dsum(Cluster_Num - 1) = sum(sum(D))/Cluster_Num;

     %计算F(K)

disp('计算F');

F(Cluster_Num - 1) = Lsum(Cluster_Num - 1) + Dsum(Cluster_Num - 1);

     F

 

 

     if isfinite(F(Cluster_Num - 1)) == 0

        break;

     else

 

     end    

 

 

pause(1)

     clear tmp Center KindDataKindNumNewCenter Step xl yl L D

 

end

 

[V,IND] = min(F);

Kopt = IND+1;

fprintf('最佳聚类值K = ');

fprintf('%d',Kopt);

fprintf('\n\n');

 

%使用最新的K值进行聚类分析

Cluster_Num = Kopt;

[row,col]   = size(Data_NoGD);

Step        = 1000;

%定义三个聚类中心点

Center      = Data_NoGD(:,1:Cluster_Num);

%进行初始的迭代

[KindData,KindNum] = func_Kmeans_Cluster(Center,Data_NoGD);

NewCenter          = func_NewCenter(KindData,KindNum,row);

%进行据雷锋唔系

while (sum(sum(NewCenter ~= Center))) & Step

    Center             = NewCenter;

    [KindData,KindNum] = func_Kmeans_Cluster(Center,Data_NoGD);

NewCenter          = func_NewCenter(KindData,KindNum,row);

    Step               = Step-1;

end

 

func_fig(Data_NoGD,Cluster_Num,KindData); 

12_005m`  

 

4.本算法原理

       K-means聚类算法基本思想,首先算法随机选取k个点作为初始聚类中心,然后计算各个数据对象到各聚类中心的距离,把数据对象归到离它最近的那个聚类中心所在的类;对调整后的新类计算新的聚类中心,如果相邻两次的聚类中心没有任何变化,说明数据对象调整结束,聚类准则Jc已经收敛。K-means聚类算法的一个特点是在每次迭代中都要考察每个样本的分类是否正确,若不正确,就要调整。在全部数据调整完后,再修改聚类中心,进入下一次迭代。如果在一次迭代算法中,所有的数据对象被正确分类,则不会有调整,聚类中心也不会有任何变化,这标志着Jc已经收敛,至此算法结束。本文重点对K-均值聚类算法进行了研究分析,并在K-均值聚类算法的基础上提出了改进。

 

       K-means聚类算法是硬聚类算法,是典型的基于原型的目标函数聚类分析算法点到原型——簇中心的某种距离和作为优化的目标函数,采用函数求极值的方法得到迭代运算的调整规则。K-means聚类算法以欧氏距离作为相异性测度它是求对应某一初始聚类中心向量最优分类,使得评价指标E值最小。

 

 

 

       误差平方和准则函数适用于各类样本比较集中而且样本数目悬殊不大的样本分布。当不同类型的样本数目相差较大时,采用误差平方和准则。很可能把样本数目多的类分开,以便达到总的误差平方和最小。

 

整个算法的基本流程如下图所示:

 

605e5e7412f19b10893cbfbaa62e1043_watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=.png