用MATLAB编写程序,分别求用原理推导K均值算法和MATLAB自带Kmeans函数的聚类,并求出各自的SC轮廓系数和 DBI戴维森堡丁指数
时间: 2024-02-03 16:12:58 浏览: 74
粒子群_改进K均值聚类算法_matlab_k-means_pso_pso-clustering
5星 · 资源好评率100%
以下是MATLAB代码实现:
```
% 生成数据
data = [randn(100,2)+ones(100,2);randn(100,2)-ones(100,2)];
% 原理推导K均值算法
K = 2;
[m, n] = size(data);
centroid = data(randperm(m,K),:);
iter = 10;
cluster = zeros(m,1);
cost = zeros(iter,1);
for i = 1:iter
% 分配样本到最近的聚类中心
for j = 1:m
dist = sum((repmat(data(j,:),K,1) - centroid).^2, 2);
[~, cluster(j)] = min(dist);
end
% 更新聚类中心
for j = 1:K
centroid(j,:) = mean(data(cluster==j,:));
end
% 计算损失函数
cost(i) = sum(sum((data - centroid(cluster,:)).^2));
end
% 使用MATLAB自带Kmeans函数
[idx, C] = kmeans(data, K, 'Replicates', 10);
% 计算SC轮廓系数
SC1 = silhouette(data, cluster);
SC2 = silhouette(data, idx);
% 计算DBI戴维森堡丁指数
D1 = zeros(K,1);
for i = 1:K
D1(i) = max(pdist(data(cluster==i,:)));
end
D2 = zeros(K,1);
for i = 1:K
D2(i) = max(pdist(data(idx==i,:)));
end
DBI1 = 0;
for i = 1:K
for j = 1:K
if i ~= j
DBI1 = DBI1 + (D1(i) + D1(j))/norm(centroid(i,:)-centroid(j,:));
end
end
end
DBI1 = DBI1/K;
DBI2 = 0;
for i = 1:K
for j = 1:K
if i ~= j
DBI2 = DBI2 + (D2(i) + D2(j))/norm(C(i,:)-C(j,:));
end
end
end
DBI2 = DBI2/K;
```
其中,`data`为待聚类的数据,`K`为聚类簇数,`iter`为迭代次数。聚类结果分别保存在`cluster`和`idx`中,聚类中心分别保存在`centroid`和`C`中,损失函数值保存在`cost`中,SC轮廓系数分别保存在`SC1`和`SC2`中,DBI戴维森堡丁指数分别保存在`DBI1`和`DBI2`中。
阅读全文