对二维模式样本集,编写MATLAB程序实现k均值算法进行聚类,通过分别改变类别数量和初始聚类中心(控制变量法)来获得不同 的结果
时间: 2023-06-30 16:22:08 浏览: 93
k均值聚类的Matlab仿真设计
4星 · 用户满意度95%
好的,下面是MATLAB程序实现k均值算法进行聚类的示例代码:
```matlab
% 生成随机的二维模式样本集
rng(1);
data = [randn(100,2)*0.75+ones(100,2);
randn(100,2)*0.5-ones(100,2)];
% 设定类别数量
K = 2;
% 设定初始聚类中心
initial_centroids = [-1 -1; 1 1];
% 迭代次数
max_iters = 10;
% 运行k-means聚类算法
[centroids, idx] = runkMeans(data, initial_centroids, max_iters);
% 可视化结果
figure;
plotDataPoints(data, idx, K);
title(sprintf('K-Means Clustering (k = %d)', K));
% 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);
% 迭代k-means算法
for i=1:max_iters
% 计算每个样本距离最近的聚类中心
idx = findClosestCentroids(X, centroids);
% 将每个聚类中心移动到所属样本的均值处
centroids = computeCentroids(X, idx, K);
end
end
% 找到每个样本距离最近的聚类中心
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
% 计算每个聚类中心的均值,并将其移动到所属样本的均值处
function centroids = computeCentroids(X, idx, K)
[m, n] = size(X);
centroids = zeros(K, n);
for i=1:K
centroids(i,:) = mean(X(idx==i,:),1);
end
end
% 可视化聚类结果
function plotDataPoints(X, idx, K)
colors = hsv(K);
for k=1:K
scatter(X(idx==k,1), X(idx==k,2), 15, colors(k,:), 'filled');
hold on;
end
hold off;
end
```
通过调整`K`和`initial_centroids`的值,可以得到不同的聚类结果。例如,将`K`设定为3,`initial_centroids`设定为`[0 0; -1 -1; 1 1]`,就可以得到3类聚类结果。这里只是一个简单的示例代码,您可以根据具体需求进行修改和扩展。
阅读全文