% 设置初始参数
load datanew;
delta_a = 18;
epsilon = 6;
delta_min = delta_a;
X = datanew(:,1:4); %聚类数据样本
[L,M] = size(X);
% 聚类算法开始
c = 1;
Dsave = [];
for i = 1:L
Di = 0;
for j = 1:L
D0 = exp(-(X(i,:)-X(j,:))*(X(i,:)-X(j,:))'/(delta_a/2)^2);
Di = D0+Di;
end
Dsave(i,:) = Di; % 保存每一次计算得到的密度值
end
D1_c = max(Dsave); % 计算得到第一个最大密度值
i_c = find(Dsave==D1_c);
X_c(1,:) = X(i_c,:); % 计算得到第一个聚类中心并保存
n = 1;
while (D1_c>epsilon)
delta_b = 1.5*delta_a; % 调整参数
for m = 1:L
Dsave_c(m,:) = Dsave(m,n)-D1_c*exp(-(X(m,:)-X_c(n,:))*(X(m,:)-X_c(n,:))'/(delta_b/2)^2);
end
Dsave(:,n+1) = Dsave_c; % 保存每一次计算得到的密度值到矩阵Dsave
D1_c = max(Dsave_c);
i_c = find(Dsave_c==D1_c);
X_c(n+1,:) = X(i_c,:); %保存每一次计算得到的聚类中心
n = n+1;
end
Nsave(c,:) = n;
Xsave(:,:,c) = X_c;
Jm0 = 0;
for i = 1:L
Jm0_middle = 0;
for j = 1:n
mu_fenmu0 = 0;
for k = 1:n
mu_fenmu = epsilon+mu_fenmu0+((X(i,:)-X_c(j,:))*(X(i,:)-X_c(j,:))')/((X(i,:)-X_c(k,:))*(X(i,:)-X_c(k,:))'+epsilon);
mu_fenmu0 = mu_fenmu;
end
mu = 1/mu_fenmu0;
Jm_middle = Jm0_middle+mu^2*(X(i,:)-X_c(j,:))*(X(i,:)-X_c(j,:))';
Jm0_middle = Jm_middle;
end
Jm = Jm0+Jm_middle;
Jm0 = Jm;
end
Jmsave(c,:) = Jm;
c = c+1;
X_c
if X_c(n-1,:) == X_c(end,:)
X_cnew = X_c(1:n-1,:);
else
X_cnew = X_c;
end
X_cnew