对鸢尾花数据用matlab实现KMeans算法
时间: 2023-10-13 09:10:23 浏览: 177
在matlab中使用k-means算法及isodata算法对鸢尾花数据集进行分类
以下是使用 MATLAB 实现 K-Means 算法对鸢尾花数据进行聚类的示例代码:
```matlab
% 加载鸢尾花数据集
load fisheriris
% 将数据集中的样本特征放入一个矩阵中
X = [meas(:,1), meas(:,2), meas(:,3), meas(:,4)];
% 设定聚类的类别数
k = 3;
% 设定迭代次数
max_iters = 100;
% 随机初始化聚类中心
initial_centroids = X(randperm(size(X,1), k), :);
% 运行 K-Means 算法
[centroids, idx] = run_kmeans(X, initial_centroids, max_iters);
% 绘制聚类结果图示
figure;
scatter3(X(idx==1,1), X(idx==1,2), X(idx==1,3), 'r', 'filled');
hold on;
scatter3(X(idx==2,1), X(idx==2,2), X(idx==2,3), 'b', 'filled');
scatter3(X(idx==3,1), X(idx==3,2), X(idx==3,3), 'g', 'filled');
scatter3(centroids(:,1), centroids(:,2), centroids(:,3), 'k', 'filled', 'MarkerEdgeColor','k', 'LineWidth', 3, 'SizeData', 200);
legend('Cluster 1', 'Cluster 2', 'Cluster 3', 'Centroids');
xlabel('Sepal Length');
ylabel('Sepal Width');
zlabel('Petal Length');
function [centroids, idx] = run_kmeans(X, initial_centroids, max_iters)
% 返回聚类中心以及每个样本所属的聚类编号
% X: 样本特征矩阵,每行为一个样本,每列为一个特征
% initial_centroids: 初始聚类中心
% max_iters: 最大迭代次数
% 初始化变量
[m, n] = size(X);
k = size(initial_centroids, 1);
centroids = initial_centroids;
previous_centroids = centroids;
idx = zeros(m, 1);
% 迭代计算
for i=1:max_iters
% 计算每个样本所属的聚类
for j=1:m
distances = sum((centroids - X(j,:)).^2, 2);
[~, idx(j)] = min(distances);
end
% 更新聚类中心
for j=1:k
centroids(j,:) = mean(X(idx==j,:));
end
% 如果聚类中心已经不再变化,则停止迭代
if isequal(previous_centroids, centroids)
break;
end
previous_centroids = centroids;
end
end
```
上述代码中,`load fisheriris` 用于加载鸢尾花数据集,`X` 是一个 $150 \times 4$ 的矩阵,每行是一个样本,每列是一个特征。`k` 是聚类的类别数,`max_iters` 是最大迭代次数,`initial_centroids` 是初始聚类中心,可以随机选择。`run_kmeans` 函数实现了 K-Means 算法的迭代过程,返回最终的聚类中心以及每个样本所属的聚类编号。最后,使用 `scatter3` 函数将聚类结果以 3D 散点图的形式展示出来。
阅读全文