帮我写一个Matlab做K- means算法的代码 并标注每一部分是什么意思
时间: 2023-06-12 12:06:23 浏览: 100
当然可以。以下是一个简单的 Matlab 实现 K-means 的代码,并且注释每一部分的含义:
```
clc;
clear all;
close all;
rng(1); % 设置随机数生成器的种子,确保每次运行结果相同
% 生成随机数据
X = [randn(100,2)*0.75+ones(100,2);
randn(100,2)*0.5-ones(100,2)];
% 初始化聚类中心
K = 2;
initial_centroids = kMeansInitCentroids(X, K);
% 运行 K-means 算法
max_iters = 10;
[centroids, idx] = runKmeans(X, initial_centroids, max_iters);
% 可视化聚类结果
figure;
plotDataPoints(X, idx, K);
title('K-means Clustering');
% kMeansInitCentroids 函数:用随机数据初始化聚类中心
function centroids = kMeansInitCentroids(X, K)
centroids = zeros(K, size(X, 2));
randidx = randperm(size(X, 1));
centroids = X(randidx(1:K), :);
end
% runKmeans 函数:运行 K-means 算法
function [centroids, idx] = runKmeans(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 函数:计算每个样本点所属的聚类中心
function idx = findClosestCentroids(X, centroids)
K = size(centroids, 1);
idx = zeros(size(X,1), 1);
m = size(X,1);
for i=1:m
% 计算距离最近的聚类中心,将该样本点分配到该聚类中心所属的簇中
min_dist = inf;
for j=1:K
dist = sum((X(i,:) - centroids(j,:)).^2);
if dist < min_dist
min_dist = dist;
idx(i) = j;
end
end
end
end
% computeCentroids 函数:重新计算聚类中心
function centroids = computeCentroids(X, idx, K)
[m n] = size(X);
centroids = zeros(K, n);
for i=1:K
% 计算该簇内所有样本点的均值,更新聚类中心
centroids(i,:) = mean(X(idx==i,:));
end
end
% plotDataPoints 函数:用不同颜色的点可视化聚类结果
function plotDataPoints(X, idx, K)
% 绘制每个簇的点
colors = hsv(K);
hold on;
for k=1:K
plot(X(idx==k,1), X(idx==k,2), '.', 'MarkerSize', 12, 'color', colors(k,:));
end
hold off;
end
```
注:这个实现只能处理二维数据,如果你有多维数据,需要进行修改。
阅读全文