用matlab实现k均值算法代码
时间: 2023-10-11 17:06:20 浏览: 86
k均值聚类的Matlab仿真设计
4星 · 用户满意度95%
以下是一个示例k均值算法的MATLAB代码:
% 初始化数据
X = [randn(50,2)*0.75+ones(50,2);
randn(50,2)*0.5-ones(50,2)];
% 设定k
K = 2;
% 设定初始中心点
initial_centroids = [-1 -1; 1 1];
% 运行k-means算法
[centroids, idx] = runkMeans(X, initial_centroids, 10);
% 绘制结果
plotDataPoints(X, idx, K);
hold on;
plot(centroids(:,1), centroids(:,2), 'x', ...
'MarkerEdgeColor','k', ...
'MarkerSize', 10, 'LineWidth', 3);
hold off;
% 运行k-means算法的函数
function [centroids, idx] = runkMeans(X, initial_centroids, max_iters)
% 初始化一些变量
[m n] = size(X);
K = size(initial_centroids, 1);
centroids = initial_centroids;
previous_centroids = centroids;
idx = zeros(m, 1);
% 运行k-means算法
for i=1:max_iters
% 为每一个样本点分配最近的中心点
idx = findClosestCentroids(X, centroids);
% 计算新的中心点
centroids = computeCentroids(X, idx, K);
% 如果中心点不再改变,算法收敛
if (previous_centroids == centroids)
break;
end
% 更新前一次的中心点
previous_centroids = centroids;
end
end
% 计算每个样本点所属的最近的中心点
function idx = findClosestCentroids(X, centroids)
K = size(centroids, 1);
idx = zeros(size(X,1), 1);
% 遍历每个样本点
for i=1:size(X,1)
% 初始化最小距离和最小距离的中心点
min_dist = inf;
min_index = 0;
% 遍历每个中心点
for j=1:K
% 计算样本点到中心点的距离
dist = sum((X(i,:) - centroids(j,:)).^2);
% 如果距离更小,更新最小距离和最小距离中心点
if dist < min_dist
min_dist = dist;
min_index = j;
end
end
% 将样本点分配到最近的中心点
idx(i) = min_index;
end
end
% 计算新的中心点
function centroids = computeCentroids(X, idx, K)
[m n] = size(X);
centroids = zeros(K, n);
% 遍历每个中心点
for i=1:K
% 找到所有分配到这个中心点的样本点
indices = find(idx == i);
% 计算这些样本点的平均值,作为新的中心点
centroids(i,:) = mean(X(indices,:));
end
end
% 绘制数据点和中心点
function plotDataPoints(X, idx, K)
colors = hsv(K);
% 遍历每个中心点
for i=1:K
% 找到所有分配到这个中心点的样本点
indices = find(idx == i);
% 绘制这些样本点
scatter(X(indices,1), X(indices,2), 15, colors(i,:), 'filled');
end
end
阅读全文