怎么确定K均值聚类中的K(基于matlab)

版权声明:转载需写明出处 https://blog.csdn.net/qq_23860475/article/details/80666982

k均值算法原理和优缺点

点击打开链接

定义

D=类内平均距离/类间平均距离

不同的K有不同的D,D越小越好,但k也不能过大,根据实际情况取。

数据集

96个维度的616条数据。

matlab代码

clc;clear
data=xlsread('C:\Users\Administrator\Desktop\数据.xlsx','Sheet1');
[n,p]=size(data);
for i=1:p
   minr=min(data(:,i));
   maxr=max(data(:,i));
   data(:,i)=(data(:,i)-minr)/(maxr-minr);%归一化
end
K=15;D=zeros(K-1,2);T=0;
for k=2:K
    T=T+1;
[lable,c,sumd,d]=kmeans(data,k);
%data,n*p原始数据向量
%lable,n*1向量,聚类结果标签;
%c,k*p向量,k个聚类质心的位置
%sumd,1*k向量,类间所有点与该类质心点距离之和
%d,n*k向量,每个点与聚类质心的距离
%-----求每类数量-----
sort_num=zeros(k,1);%每类数量
for i=1:k
    for j=1:n
        if lable(j,1)==i
            sort_num(i,1)=sort_num(i,1)+1;
        end
    end
end
%-----求每类数量-----
sort_ind=sumd./sort_num;%每类类内平均距离
sort_ind_ave=mean(sort_ind);%类内平均距离
%-----求类间平均距离-----
h=nchoosek(k,2);A=zeros(h,2);t=0;sort_outd=zeros(h,1);
for i=1:k-1
    for j=i+1:k
        t=t+1;
        A(t,1)=i;
        A(t,2)=j;
    end
end
for i=1:h
    for j=1:p
        sort_outd(i,1)=sort_outd(i,1)+(c(A(i,1),j)-c(A(i,2),j))^2;
    end
end
sort_outd_ave=mean(sort_outd);%类间平均距离
%-----求类间平均距离-----
D(T,1)=k;
D(T,2)=sort_ind_ave/sort_outd_ave;
end
min(D(:,2));
[f,g]=find(D==min(D(:,2)));
plot(D(:,1),D(:,2))

运行结果

横坐标为K,纵坐标为D,随着K的增加D虽然越来越小,但结合实际业务,K不能取太大,取5较好。

K取5的聚类matlab代码如下:

clc;clear;
k=5;%类数设置
data=xlsread('C:\Users\Administrator\Desktop\数据.xlsx','Sheet1');
[n,p]=size(data);
[lable,c,sumd,d]=kmeans(data,k);
%data,n*p原始数据向量
%lable,n*1向量,聚类结果标签;
%c,k*p向量,k个聚类质心的位置
%sumd,1*k向量,类间所有点与该类质心点距离之和
%d,n*k向量,每个点与聚类质心的距离
x=0:95;y=zeros(k,p);
for i=1:k
   t=0;
   for j=1:n
       if lable(j,1)==i
           t=t+1;
           y(i,:)= y(i,:)+data(j,:);
       end
   end
    y(i,:)= y(i,:)/t;
    subplot(2,3,i);
    plot(x,y(i,:))
   
end

聚类效果如下

备注:承接模型、算法代码实现(支持python、matlab),有意请联系QQ947943645 ,非诚勿扰!

猜你喜欢

转载自blog.csdn.net/qq_23860475/article/details/80666982