matlab实现kmeans算法
时间: 2023-07-29 10:10:20 浏览: 98
在MATLAB中,可以使用`kmeans`函数来实现K-means聚类算法。以下是一个基本的示例:
```matlab
% 生成随机数据
rng('default');
data = [randn(100,2)+1.5*ones(100,2); randn(100,2)-1.5*ones(100,2)];
% 设置聚类个数
k = 2;
% 使用kmeans函数进行聚类
[idx, centroids] = kmeans(data, k);
% 可视化结果
figure;
gscatter(data(:,1), data(:,2), idx);
hold on;
plot(centroids(:,1), centroids(:,2), 'k*', 'MarkerSize', 10);
hold off;
```
在上面的代码中,首先生成了一个包含200个样本的随机数据集。然后,设置了聚类个数为2。接下来,调用`kmeans`函数执行K-means聚类,并返回每个样本所属的聚类索引以及聚类中心坐标。最后,通过绘制散点图可视化聚类结果。
请注意,这只是基本的示例,您可以根据具体需求进行参数的调整和功能的扩展。
相关问题
MATLAB的Kmeans算法程序
下面是MATLAB的Kmeans算法程序示例:
```matlab
clc;
clear;
close all;
% 生成数据
data = [randn(100, 2)*0.75+ones(100, 2); randn(100,2)*0.5-ones(100,2)];
% 设置聚类数量
K = 2;
% KMeans算法
[idx, C] = kmeans(data, K);
% 可视化结果
figure;
plot(data(idx==1,1), data(idx==1,2), 'r.', 'MarkerSize', 12);
hold on;
plot(data(idx==2,1), data(idx==2,2), 'b.', 'MarkerSize', 12);
plot(C(:,1), C(:,2), 'kx', 'MarkerSize', 15, 'LineWidth', 3);
legend('Cluster 1', 'Cluster 2', 'Centroids', 'Location', 'NorthEast');
title(['KMeans Clustering with K=', num2str(K)]);
```
这段程序首先生成了一个二维数据集,然后使用KMeans算法将其分成两个类别,并将结果可视化出来。其中,`kmeans`函数用于执行KMeans算法,`idx`表示每个数据点所属的聚类类别,`C`表示聚类中心的坐标。程序运行后,会显示出一个图像,其中红点表示属于第一个聚类的数据点,蓝点表示属于第二个聚类的数据点,黑叉表示聚类中心的坐标。
对鸢尾花数据用matlab实现KMeans算法
以下是使用 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 散点图的形式展示出来。
阅读全文