K-means聚类matlab代码,附上可视化分析的代码
时间: 2024-02-12 13:09:00 浏览: 100
以下是K-means聚类的MATLAB代码和可视化分析的代码:
```matlab
% K-means聚类
clear all; close all; clc;
% 载入数据
load('data.mat');
% 初始化聚类中心
k = 3;
centroids = initCentroids(X, k);
% 迭代次数
max_iters = 10;
% 计算聚类结果
[centroids, idx] = runkMeans(X, centroids, max_iters);
% 可视化聚类结果
plotDataPoints(X, idx, k);
```
其中,`data.mat`是一个.mat文件,存储了要聚类的数据,它的格式为:变量X是一个矩阵,每一行代表一个数据点,变量y是一个向量,每个元素代表X中对应数据点的类别。
以下是初始化聚类中心的函数`initCentroids`的代码:
```matlab
function centroids = initCentroids(X, k)
% 随机初始化聚类中心
% X: 数据矩阵
% k: 聚类中心个数
rand_idx = randperm(size(X, 1));
centroids = X(rand_idx(1:k), :);
end
```
以下是计算聚类结果的函数`runkMeans`的代码:
```matlab
function [centroids, idx] = runkMeans(X, initial_centroids, max_iters)
% 运行K-means聚类
% X: 数据矩阵
% initial_centroids: 初始化聚类中心
% max_iters: 迭代次数
[m, n] = size(X);
k = size(initial_centroids, 1);
centroids = initial_centroids;
idx = zeros(m, 1);
for i = 1:max_iters
% 计算每个样本点属于哪个聚类中心
idx = findClosestCentroids(X, centroids);
% 重新计算聚类中心
centroids = computeCentroids(X, idx, k);
end
end
```
以下是计算每个样本点属于哪个聚类中心的函数`findClosestCentroids`的代码:
```matlab
function idx = findClosestCentroids(X, centroids)
% 计算每个样本点属于哪个聚类中心
% X: 数据矩阵
% centroids: 聚类中心
K = size(centroids, 1);
idx = zeros(size(X,1), 1);
for i = 1:size(X,1)
dists = zeros(K, 1);
for j = 1:K
dists(j) = sum((X(i,:) - centroids(j,:)).^2);
end
[~, idx(i)] = min(dists);
end
end
```
以下是重新计算聚类中心的函数`computeCentroids`的代码:
```matlab
function centroids = computeCentroids(X, idx, K)
% 重新计算聚类中心
% X: 数据矩阵
% idx: 每个样本点属于哪个聚类中心
% K: 聚类中心个数
[m n] = size(X);
centroids = zeros(K, n);
for i=1:K
centroids(i,:) = mean(X(idx==i,:));
end
end
```
以下是可视化聚类结果的函数`plotDataPoints`的代码:
```matlab
function plotDataPoints(X, idx, K)
% 可视化聚类结果
% X: 数据矩阵
% idx: 每个样本点属于哪个聚类中心
% K: 聚类中心个数
figure; hold on;
% 设置颜色和标记
color = hsv(K);
markers = {'o', 'x', '^'};
% 绘制每个聚类中心和属于该聚类的样本点
for i=1:K
plot(X(idx==i,1), X(idx==i,2), markers{i}, ...
'MarkerSize', 5, 'MarkerEdgeColor', color(i,:), 'MarkerFaceColor', color(i,:));
plot(X(i,1), X(i,2), markers{i}, ...
'MarkerSize', 10, 'MarkerEdgeColor', color(i,:), 'MarkerFaceColor', 'none');
end
xlabel('X1'); ylabel('X2'); title('K-means Clustering');
legend('Cluster 1', 'Cluster 2', 'Cluster 3', 'Centroids');
end
```
以上就是K-means聚类的MATLAB代码和可视化分析的代码。
阅读全文