用MATLAB编写程序,生成50个样本点,自己推导K均值算法将样本分成5类,输出图像,输出SC轮廓系数和 DBI戴维森堡丁指数。再用MATLAB自带Kmeans函数的聚类分成5类,输出图像,并输出SC轮廓系数和 DBI戴维森堡丁指数
时间: 2023-08-12 13:06:55 浏览: 104
以下是MATLAB代码实现:
```matlab
% 生成50个随机样本点
rng(1); % 设置随机数种子
X = randn(50,2);
% 自己实现K均值算法
k = 5; % 设置聚类数
max_iter = 100; % 设置最大迭代次数
[idx, centers] = my_kmeans(X, k, max_iter); % 调用自己实现的K均值算法
% 输出聚类结果图像
figure;
scatter(X(:,1), X(:,2), [], idx);
hold on;
scatter(centers(:,1), centers(:,2), 'k', 'filled');
title('K-means Clustering (Self-implemented)');
xlabel('Feature 1');
ylabel('Feature 2');
% 计算SC轮廓系数和DBI戴维森堡丁指数
SC = silhouette(X, idx);
DBI = DaviesBouldinIndex(X, idx);
fprintf('SC轮廓系数:%.4f\n', mean(SC));
fprintf('DBI戴维森堡丁指数:%.4f\n\n', DBI);
% 使用MATLAB自带Kmeans函数
[idx2, centers2] = kmeans(X, k); % 调用MATLAB自带的Kmeans函数
% 输出聚类结果图像
figure;
scatter(X(:,1), X(:,2), [], idx2);
hold on;
scatter(centers2(:,1), centers2(:,2), 'k', 'filled');
title('K-means Clustering (MATLAB Built-in)');
xlabel('Feature 1');
ylabel('Feature 2');
% 计算SC轮廓系数和DBI戴维森堡丁指数
SC2 = silhouette(X, idx2);
DBI2 = DaviesBouldinIndex(X, idx2);
fprintf('SC轮廓系数:%.4f\n', mean(SC2));
fprintf('DBI戴维森堡丁指数:%.4f\n', DBI2);
```
其中,自己实现的K均值算法代码如下:
```matlab
function [idx, centers] = my_kmeans(X, k, max_iter)
% 自己实现的K均值聚类算法
% 初始化聚类中心
centers = X(randperm(size(X,1), k), :);
for iter = 1:max_iter
% 分配样本点到最近的聚类中心
d = pdist2(X, centers);
[~, idx] = min(d, [], 2);
% 更新聚类中心
for i = 1:k
centers(i,:) = mean(X(idx==i, :), 1);
end
end
end
```
运行代码后,会输出两个聚类结果图像和对应的SC轮廓系数和DBI戴维森堡丁指数。
阅读全文